特にMozillaFirefoxで、Windows7環境でユーザーのクリックとマウスの移動をエミュレートしようとしています。さまざまなチュートリアル、フォーラムの投稿、MSDNドキュメントからまとめたソリューションは、そこにあるWindowsアプリケーションの99%で機能しますが、Firefox8.0では機能しません。
私の予備調査によると、Windowsでキーボードとマウスの入力をエミュレートする最も正確な(低レベルの)方法は、User32.dllWindowsライブラリのSendInput関数を使用することです。これをテストするために、マウスカーソルが画面上のどこにあるかに関係なく、ループスルーしてSendInputを呼び出し、5秒ごとにプログラムによるマウスクリックを作成する短いC#プログラムを作成しました。
実行すると、プログラムは、フォーカスを切り替えるほぼすべてのアプリケーションウィンドウ(Windowsインターフェイス自体(スタートボタン、タスクバー、Windowsエクスプローラーなど)を含む)のマウスクリックを完全にエミュレートしますが、カーソルを移動してもプログラムによるマウスクリックは発生しません。 MozillaFirefoxウィンドウに。
内部で何が起こっているかをより適切に処理するために、Microsoft Spy ++を起動し、Firefoxウィンドウのメッセージキューに実際に渡されているメッセージを調べ始めました。案の定、Firefoxウィンドウは、フォーカスがかかっている間、カーソルがその真上に置かれていても、メッセージを受信しませんでした。マウスを手動でクリックすると、Firefox Spy ++リスナーが混乱し、エミュレーションプログラムに対する他のアプリケーションの正しい応答を観察したときに表示された完全な「nHittest:HTCLIENTwMouseMsg:WM_LBUTTONDOWN」が表示されます。
誰かがMozillaFirefoxがSendInput関数からメッセージをまったく受信しない唯一のアプリケーションの1つである理由と、おそらくこれを克服する方法についての提案を提供できますか?
ソースコード (わかりやすくするためにインポート/外部参照は削除されています):
static void Main(string[] args)
{
for (; ; )
{
System.Threading.Thread.Sleep(5000);
INPUT[] inp = new INPUT[2];
inp[0].type = INPUT_MOUSE;
inp[0].mi = createMouseInput(0, 0, 0, 0, MOUSEEVENTF_LEFTDOWN);
inp[1].type = INPUT_MOUSE;
inp[1].mi = createMouseInput(0, 0, 0, 0, MOUSEEVENTF_LEFTUP);
SendInput((uint)inp.Length, inp, Marshal.SizeOf(inp[0].GetType()));
}
}
private static MOUSEINPUT createMouseInput(int x, int y, uint data, uint t, uint flag)
{
MOUSEINPUT mi = new MOUSEINPUT();
mi.dx = x;
mi.dy = y;
mi.mouseData = data;
mi.time = t;
mi.dwFlags = flag;
return mi;
}
[StructLayout(LayoutKind.Sequential)]
struct MOUSEINPUT
{
public int dx;
public int dy;
public uint mouseData;
public uint dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Explicit)]
private struct INPUT
{
[FieldOffset(0)]
public int type;
[FieldOffset(sizeof(int))] //[FieldOffset(8)] for x64
public MOUSEINPUT mi;
[FieldOffset(sizeof(int))] //[FieldOffset(8)] for x64
public KEYBDINPUT ki;
[FieldOffset(sizeof(int))] //[FieldOffset(8)] for x64
public HARDWAREINPUT hi;
}