Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “发送”;“按下按钮”;发送给UnityWndClass的消息_C++_Winapi - Fatal编程技术网

C++ “发送”;“按下按钮”;发送给UnityWndClass的消息

C++ “发送”;“按下按钮”;发送给UnityWndClass的消息,c++,winapi,C++,Winapi,我有3D游戏,我需要从另一个应用程序中按下这个游戏中的按钮。Spy++说游戏的窗口是UnityWndClass。当我在游戏中按下按钮时,窗口仅接收鼠标消息,如WM_SETCURSOR,WM_LBUTTONDOWN等,但当我尝试从另一个窗口发送带有按钮坐标的WM_lbuttonown和WM_LBUTTONUP时,什么都没有发生。为什么?您知道如何按下按钮吗?WM_SETCURSOR用于更改您自己窗口的光标图像WM_LBUTTONDOWN和WM_LBUTTONUP是鼠标单击后发送的通知消息WM_LB

我有3D游戏,我需要从另一个应用程序中按下这个游戏中的按钮。Spy++说游戏的窗口是UnityWndClass。当我在游戏中按下按钮时,窗口仅接收鼠标消息,如
WM_SETCURSOR
WM_LBUTTONDOWN
等,但当我尝试从另一个窗口发送带有按钮坐标的
WM_lbuttonown
WM_LBUTTONUP
时,什么都没有发生。为什么?您知道如何按下按钮吗?

WM_SETCURSOR
用于更改您自己窗口的光标图像
WM_LBUTTONDOWN
WM_LBUTTONUP
是鼠标单击后发送的通知消息<代码>WM_LBUTTONXXX消息可能不由主窗口过程处理

要伪造鼠标输入,可以使用
鼠标事件
发送输入
。例如,这会将光标移动到
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
(参见注释)


当我做假鼠标输入时,窗口应该是活动的?是的,窗口应该至少是可见的,如果它是活动的,它会更好。我更新答案。窗口必须具有输入焦点才能接收输入(合成或真实)。请务必再次阅读文档以了解更多信息。为
nInputs
传递
1
是一个错误。备注部分解释了原因。此外,您提出的任何黑客方案都不像健壮的解决方案。正确的方法是使用,它不要求特定窗口在任何点都有输入焦点。@IInspectable我在
SendInput
文档的备注部分看不到这一点。请添加其他答案并显示正确用法。我有多个
SendInput
调用,这些调用应该组合在一个数组中。我是单独打电话来演示的。那是虫子吗?如果只有一个电话,那肯定不是bug?若可以在任意随机函数上演示任意随机程序的UI自动化,那个么示例将是有用的。OP除了其窗口类名外,对第三方程序一无所知。由于第三方应用程序使用的是标准windows控件,它已经内置了对UI自动化的支持:SendInput函数将输入结构中的事件按顺序插入键盘或鼠标输入流。这些事件不会与用户(使用键盘或鼠标)或通过调用keybd\u事件、mouse\u事件或其他调用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));
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);    
}