单击另一个应用程序中的按钮,模拟鼠标+坐标
本文关键字:模拟 鼠标 坐标 按钮 另一个 应用程序 单击 | 更新日期: 2023-09-27 17:57:40
我尝试使用以下命令点击按钮:
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?
建议,想法会非常好。
如果按钮有热键(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#并使用它们。所有你需要的:激活目标窗口并用正确的键作为参数调用这个函数。
若你们有这个按钮的手柄,那个么就呼叫GetWindowRect
。它将返回一个指向RECT
结构的指针,该结构接收窗口左上角和右下角的屏幕坐标。因此,无论主窗口大小,您都可以执行点击模拟。
[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.
}
在使用sendmessage进行了多次测试后,我解决了尝试PostMessage的问题,这就像一个魅力。。。
PostMessage(mainControlChild, WM_KEYDOWN, (int)Keys.Return, 0);
PostMessage(mainControlChild, WM_KEYUP, (int)Keys.Return, 0);
解决了我的问题并将其发送到后台。