C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 123 を表示中)
■73687 / )  Re[10]: 指定した画像にマウスカーソルを移動させるには
□投稿者/ xlink (11回)-(2014/10/23(Thu) 03:46:33)
No73686 (yoh2 さん) に返信
> >>結局 PostMessage または SendMessage に落ち着きそうな気がするのですが。
>>コードを教えてください。
>
> 丁度、任意のウィンドウをクリックしたことにするプログラムを C# で書いたことがあるので、
> その時に使ったコード断片なら。 VB に書き直して失敗するのは嫌なので C# のまま。
> VB の方がいいなら、「VB.NET PostMessage」あたりで検索すればいくらでも出てきます。
SendMessage
メッセージを転送先のウインドウのウインドウプロシージャに直接送信します。処理は同期で、転送先のウインドウプロシージャがメッセージを処理し終えるまでは呼び出し元の処理はブロックされます。

PostMessage
メッセージを転送先のウインドウのメッセージキューの末尾に送信します。処理は非同期処理で、メッセージを送信した直後から処理を継続することができます
このコード、指定した画像にマウスカーソルを持っていくコードではなくないですか?
それと座標指定ではなく位置は常に変動するので画像指定です。
>
> まずは Win32API の PostMessage やクリック関連の定数、変数を使えるように。
> PostMessage に渡すウィンドウハンドルを取得するために EnumWindows など他の API
> もいくつか宣言してました。
> # 今見直すと lParam, wParam は IntPtr にしておいた方がよかった気が。
>
> public static class Win32Api
> {
> public delegate bool EnumWindowsDelegate(IntPtr hWnd, int lParam);
> [DllImport("user32.dll")]
> public static extern int EnumWindows(EnumWindowsDelegate enumProc, int lParam);
>
> [DllImport("user32.dll")]
> public static extern bool IsWindowVisible(IntPtr hWnd);
>
> [DllImport("user32.dll", CharSet = CharSet.Auto)]
> public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
>
> [DllImport("user32.dll", SetLastError = true)]
> public static extern uint GetWindowThreadProcessId(IntPtr hWnd, StringBuilder lpString, out uint lpdwProcessId);
>
> public struct POINT
> {
> public short x;
> public short y;
> };
>
> public const int WM_LBUTTONDOWN = 0x201;
> public const int WM_LBUTTONUP = 0x202;
>
> public const int MK_LBUTTON = 0x0001;
> public const int MK_RBUTTON = 0x0002;
> public const int MK_SHIFT = 0x0004;
>
> [DllImport("user32.dll")]
> public static extern int SendMessage(IntPtr hWnd, int mssg, int wParam, POINT lParam);
> [DllImport("user32.dll")]
> public static extern int SendMessage(IntPtr hWnd, int mssg, int wParam, int lParam);
> [DllImport("user32.dll")]
> public static extern int PostMessage(IntPtr hWnd, int mssg, int wParam, POINT lParam);
> [DllImport("user32.dll")]
> public static extern int PostMessage(IntPtr hWnd, int mssg, int wParam, int lParam);
> }
>
>
> んでクリック相当のメッセージ送信。
>
> IntPtr hWnd = /* ここに対象のウィンドウハンドルを入れる */
> // ここの座標はウィンドウのクライアント座標
> Win32Api.POINT pt = new Win32Api.POINT { x = /* ここにクリックしたいx座標を入れる */, y = /* ここにクリックしたいy座標を入れる */ };
> Win32Api.PostMessage(hWnd, Win32Api.WM_LBUTTONDOWN, Win32Api.MK_LBUTTON, pt););
> Win32Api.PostMessage(hWnd, Win32Api.WM_LBUTTONUP, Win32Api.MK_LBUTTON, pt);
>
>
> >>もし、マウスポインタがある座標に入って初めてそのボタンが有効になるようなものだったら別ですが。
> >>その場合でも、WM_MOUSEENTER やら WM_MOUSEMOVE なんかも一緒に投げてやればよさげ。
> >>
> >>※ 文中に出てくる PostMessage、SendMessage と WM_* はWin32で定義されている関数と定数です。
> >>
> >># もっとも、肝心のクリックするタイミングと座標を決定させることができていないようですが……
>>どういうことですか?
>
> 「#」より前に書いた部分は変に深読みした結果おかしなことを言い出しただけなので
> あまり気にしないで下さい。
> xlinkさんが、Windowsのメッセージ処理の仕組みを知っているかどうか
> 判断付かなかったのですが、もし知った上でマウスの移動に拘っているのだとすれば
> 相応の理由があるはず、といった方向で理由を予想してみた結果です。
>
> 「#」以降は前の文章と特に繋りはありません。
返信 編集キー/


管理者用

- Child Tree -