2015-07-22 168 views
1

我有3D遊戲,我需要從另一個應用程序按此遊戲中的按鈕。 Spy ++說這個遊戲的窗口是UnityWndClass。當我在遊戲中按下按鈕時,窗口只會收到類似WM_SETCURSORWM_LBUTTONDOWN等的鼠標消息,但是當我嘗試將WM_LBUTTONDOWNWM_LBUTTONUP與其他窗口中的按鈕座標一起發送時,什麼也沒有發生。爲什麼?任何想法如何按下按鈕?向UnityWndClass發送「按鈕按下」消息

回答

0

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。請參閱此example以確保窗口可見並處於活動狀態。

其他替代方案:

用狙++,以獲取有關要按下按鈕信息。例如,如果這是Windows計算器,您可以窺探計算器的按鈕,它會顯示計算器按鈕的ID已設置爲0x84。您可以發送WM_COMMANDWPARAM設置爲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);  
} 
+0

窗口應該是活動的,當我做假鼠標輸入? –

+0

是的,窗口應該至少可見,如果它處於活動狀態,它會更好。我更新答案。 –

+0

窗口**必須**具有輸入焦點才能接收輸入(合成或真實)。請再次閱讀[SendInput](https://msdn.microsoft.com/en-us/library/windows/desktop/ms646310.aspx)的文檔。爲'nInputs'傳遞'1'是一個錯誤。 *備註*部分解釋,爲什麼。另外,你提出的任何黑客都不是一個可靠的解決方案。正確的方法是使用[UI自動化](https://msdn.microsoft.com/en-us/library/windows/desktop/ee684009.aspx),它不要求任何特定的窗口有任何輸入焦點點。 – IInspectable

相關問題