0

以下を使用してボタンをクリックしようとしました:

private const int BN_CLICK = 0xF5;
private const uint WM_LBUTTONDOWN = 0x0201;
private const uint WM_LBUTTONUP = 0x0202;
SendMessage(sendButton, BN_CLICK, IntPtr.Zero, IntPtr.Zero);
SendMessage(sendButton, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero);
SendMessage(sendButton, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);

上記のすべてがボタンをクリックするのに失敗したので、私が持っている他の代替案について疑問に思っていましたか、それともハンドラからボタンの位置 X と Y を取得できるかどうか疑問に思っていましたか?

提案、アイデアは本当に良いでしょう。

4

2 に答える 2

1

sendmessageを使用して多くのテストを行った後、魅力のように機能するPostMessageを試すことを解決しました...

PostMessage(mainControlChild, WM_KEYDOWN, (int)Keys.Return, 0);
PostMessage(mainControlChild, WM_KEYUP, (int)Keys.Return, 0);

問題を解決し、バックグラウンドで送信します。

于 2011-05-25T21:06:44.470 に答える
1

ボタンにホットキー (Alt+...) がある場合、キーボード キーの押下に関するメッセージの送信を使用できます。

//Presses virtual key in active window.
void PressVK(UINT vk)
{
    //Down Alt.
    keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0);
    //Press key.
    keybd_event(vk, MapVirtualKey(vk, 0), 0, 0);
    keybd_event(vk, MapVirtualKey(vk, 0), KEYEVENTF_KEYUP, 0);
    //Up Alt.
    keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP, 0);
}

これは C++ コードです。ただし、そのすべての関数を C# にインポートして使用できます。必要なものはすべて、ターゲットウィンドウをアクティブにし、正しいキーをパラメーターとしてこの関数を呼び出します。

ボタンのハンドルがある場合は、 を呼び出しますGetWindowRectRECTウィンドウの左上隅と右下隅の画面座標を受け取る構造体へのポインタを返します。そのため、メイン ウィンドウのサイズに関係なく、クリック エミュレーションを実行できます。

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(HandleRef hWnd, out RECT lpRect);

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

それを使用して:

RECT rect;
if (!GetWindowRect(new HandleRef(this, this.Handle), out rect))
{
    //Error.
}
于 2011-05-25T16:08:18.897 に答える