Windows程式和訊息機制(二):訊息有關的函式
阿新 • • 發佈:2018-11-27
不同視窗程式可以通過訊息進行互動,主要用到的函式如下:
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);