不同窗口程序可以通過消息進行交互,主要用到的函數如下:
FindWindow
獲取一個窗口的句柄。
HWND FindWindow( LPCTSTR lpClassName,// 類名 LPCTSTR lpWindowName// 窗口名 );
通過在參數中傳遞一個類名或者窗口名就可以返回一個窗口的句柄,類名可以通過spy++獲取,窗口名是指窗口的標題。
SendMessage
發送一個不進隊消息
LRESULT SendMessage( HWND hWnd,// 窗口句柄 UINT Msg,// 消息類型 WPARAM wParam,// 附加參數 LPARAM lParam// 附加參數 )
一般情況下,FindWindow調用完以後獲取到窗口的句柄,然後會調用這個函數進行發送消息。
Msg用來傳遞消息類型,一般使用以下幾種:
WM_CLOSE:關閉窗口
WM_SETTEXT:對窗口文本進行設置
WM_GETTEXT:獲取窗口文本
WM_MOUSEMOVE:移動鼠標
WM_LBUTTONDOWN:按下鼠標左鍵
PostMessage
一般來說,發消息用SendMessage就可以了,但是如果要發送鍵盤消息最好使用PostMessage,因爲用SendMessage不太可能發送成功。
BOOL PostMessage( HWND hWnd,// 窗口句柄 UINT Msg,// 消息類型 WPARAM wParam,// 按鍵類型 LPARAM lParam,// 時間 )
消息類型主要有以下兩種:
WM_KEYUP:按鍵擡起
WM_KEYDOWN:按鍵按下
按鍵類型有很多種,比如說:
VK_F5:F5鍵
舉個應用的例子:
PostMessage(hWnd,WM_KEYDOWN,VK_F5,1); PostMessage(hWnd,WM_KEYUP,VK_F5,1);
keybd_event
VOID keybd_event( BYTE bVk, BYTE bScan, DWORD dwFlags, ULONG_PTR dwExtraInfo );
爲了方便模擬發送鍵盤消息,系統提供了這個函數,這個函數不需要提供窗口句柄,默認會向當前激活的窗口發消息,因此需要向指定的窗口發消息需要先將窗口激活,發一小段代碼就明白這個函數的使用方法了。
m_hWnd = FindWindow(NULL,"test"); setForegroundWindow(m_hWnd);//激活窗口 keybd_event(VK_F5,0,0,0)
mouse_event
發送鼠標消息
VOID mouse_event( DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData )
舉個簡單的例子:
m_hWnd = FindWindow(NULL,"test");
SetForegroundWindow(m_hWnd);
POINT pt = {0};
ClientToScreen(m_hWnd,&pt);
SetCursorPos(pt.x + 36,pt.y + 395);
mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
Sleep(1000);
mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);