发送"button pressed"消息到 UnityWndClass

Send "button pressed" message to UnityWndClass

本文关键字:UnityWndClass 消息 pressed button 发送      更新时间:2023-10-16

我有3D游戏,我需要从另一个应用程序按下这个游戏的按钮。spy++说游戏的窗口是UnityWndClass。当我在游戏中按下按钮时,窗口只收到鼠标消息,如WM_SETCURSOR, WM_LBUTTONDOWN等,但当我试图从另一个窗口发送WM_LBUTTONDOWNWM_LBUTTONUP与按钮坐标时,什么也没有发生。为什么?知道怎么按按钮吗?

WM_SETCURSOR用于更改您自己窗口的光标图像。WM_LBUTTONDOWNWM_LBUTTONUP是鼠标点击后发送的通知消息。WM_LBUTTONXXX消息可能不会被主窗口过程处理。

要伪造鼠标输入,可以使用mouse_eventSendInput。例如,这将光标移动到x=10 / y=10,并单击鼠标左键。

int x = 10 * 65536 / GetSystemMetrics(SM_CXSCREEN);
int y = 10 * 65536 / GetSystemMetrics(SM_CYSCREEN);
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, x, y, 0, 0);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

或者使用SendInput进行多次调用(见注释)

INPUT input[3];
for (int i = 0; i < 3; i++)
{
    memset(&input[i], 0, sizeof(INPUT));
    input[i].type = INPUT_MOUSE;
}
input[0].mi.dx = x;
input[0].mi.dy = y;
input[0].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
input[1].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
input[2].mi.dwFlags = MOUSEEVENTF_LEFTUP;
SendInput(3, input, sizeof(INPUT));

窗口至少应该是可见的,最好是活动的。您可以使用SetForegroundWindow。请看这个例子,以确保窗口是可见的和活动的。

其他替代品:

使用spy++获取你想要按下的按钮的信息。

例如,如果这是Windows计算器,您可以监视计算器的按钮,它显示计算器按钮2的ID设置为0x84。您可以发送WM_COMMAND, WPARAM设置为0x84来模拟按钮按下。

HWND hwnd = FindWindow(0, L"Calculator");
if (IsWindow(hwnd))
{
    //this should put "234" in to calculator's edit box
    SendMessage(hwnd, WM_COMMAND, 0x84, 0);    
    SendMessage(hwnd, WM_COMMAND, 0x85, 0);    
    SendMessage(hwnd, WM_COMMAND, 0x86, 0);    
}