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

わんくま同盟

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

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


(過去ログ 123 を表示中)
■73686 / )  Re[9]: 指定した画像にマウスカーソルを移動させるには
□投稿者/ yoh2 (2回)-(2014/10/23(Thu) 01:09:13)
>>結局 PostMessage または SendMessage に落ち着きそうな気がするのですが。
> コードを教えてください。

丁度、任意のウィンドウをクリックしたことにするプログラムを C# で書いたことがあるので、
その時に使ったコード断片なら。 VB に書き直して失敗するのは嫌なので C# のまま。
VB の方がいいなら、「VB.NET 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 -