零基礎逆向工程40_Win32_14_枚舉窗口_模擬鼠標鍵盤
阿新 • • 發佈:2017-11-28
鼠標 枚舉 proc address 位置 blog item send etc
1 查找窗口
1.1 代碼案例
//查找指定窗口 TCHAR szTitle[MAX_PATH] = {0}; HWND hwnd = ::FindWindow(TEXT("#32770"),TEXT("飛鴿傳書 IP Messenger")); if(hwnd != NULL) { //修改窗口標題 ::SetWindowText(hwnd,"新的窗口標題"); } else { ::MessageBox(NULL,TEXT("窗口沒有找到"),TEXT("[ERROR]"),MB_OK); } //窗口控制 TCHAR szTitle[MAX_PATH] = {0}; HWND hwnd = ::FindWindow(TEXT("#32770"),TEXT("飛鴿傳書 IP Messenger")); if(hwnd != NULL) { typedef void (WINAPI *PSWITCHTOTHISWINDOW) (HWND,BOOL); PSWITCHTOTHISWINDOW SwitchToThisWindow; HMODULE hUser32=LoadLibrary("user32.dll"); SwitchToThisWindow=(PSWITCHTOTHISWINDOW)GetProcAddress(hUser32,"SwitchToThisWindow"); //切換窗口 SwitchToThisWindow(hwnd,false); Sleep(3000); //關閉窗口 ::SendMessage(hwnd,WM_CLOSE,0,0); } else { ::MessageBox(NULL,TEXT("窗口沒有找到"),TEXT("[ERROR]"),MB_OK); }
2 查找子窗口
2.1 使用FindWindowEx()函數查找
TCHAR szTitle[MAX_PATH] = {0}; HWND hwnd = ::FindWindow(TEXT("#32770"),TEXT("飛鴿傳書 IP Messenger")); if(hwnd != NULL) { //查找子窗口 HWND hEdit = FindWindowEx(hwnd,NULL,"Edit",""); //設置標題 ::SetWindowText(hEdit,"文本框新的標題"); //修改內容 ::SendMessage(hEdit,WM_SETTEXT,0,(LPARAM)"新的內容"); } else { ::MessageBox(NULL,TEXT("窗口沒有找到"),TEXT("[ERROR]"),MB_OK); }
2.2 使用資源ID查找
TCHAR szTitle[MAX_PATH] = {0}; HWND hwnd = ::FindWindow(TEXT("#32770"),TEXT("飛鴿傳書 IP Messenger")); if(hwnd != NULL) { //查找子窗口 HWND hEdit =::GetDlgItem(hwnd,0x3E9); //獲取內容 ::SendMessage(hEdit,WM_GETTEXT,MAX_PATH,(LPARAM)szTitle); //修改內容 ::SendMessage(hEdit,WM_SETTEXT,0,(LPARAM)"新的內容"); } else { ::MessageBox(NULL,TEXT("窗口沒有找到"),TEXT("[ERROR]"),MB_OK); }
3 枚舉子窗口控件
BOOL CALLBACK EnumChildProc(HWND hWnd,LPARAM lParam)
{
TCHAR szTitle[MAX_PATH] = {0};
::GetWindowText(hWnd,szTitle,MAX_PATH);
MessageBox(NULL,szTitle,"[子窗口]",MB_OK);
return true;
}
VOID EnumChildWindow()
{
TCHAR szTitle[MAX_PATH] = {0};
HWND hWnd = ::FindWindow(TEXT("#32770"),TEXT("飛鴿傳書 IP Messenger"));
if(hWnd != NULL)
{
::EnumChildWindows(hWnd,EnumChildProc,0);
}
else
{
::MessageBox(NULL,TEXT("窗口沒有找到"),TEXT("[ERROR]"),MB_OK);
}
}
4 枚舉所有打開窗口
BOOL CALLBACK EnumOpenWindowProc(HWND hWnd,LPARAM lParam)
{
TCHAR szTitle[MAX_PATH] = {0};
::GetWindowText(hWnd,szTitle,MAX_PATH);
MessageBox(NULL,szTitle,"[窗口]",MB_OK);
if(strcmp(szTitle,"飛鴿傳書 IP Messenger") == 0)
{
MessageBox(NULL,szTitle,"[窗口]",MB_OK);
return FALSE;
}
return TRUE;
}
VOID EnumOpenWindows()
{
EnumWindows(EnumOpenWindowProc,NULL);
}
5 模擬鼠標單擊
TCHAR szTitle[MAX_PATH] = {0};
RECT r;
HWND hwnd = ::FindWindow(TEXT("#32770"),TEXT("飛鴿傳書 IP Messenger"));
if(hwnd != NULL)
{
HWND hButton = FindWindowEx(hwnd,NULL,"Button","刷新(&R)");
//獲取窗口坐標
::GetWindowRect(hButton,&r);
printf("%d %d",r.left,r.top);
//設置鼠標的位置
::SetCursorPos(r.left+10,r.top+10);
Sleep(2000);
//鼠標左鍵單擊
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//點下左鍵
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//松開左鍵
}
else
{
::MessageBox(NULL,TEXT("窗口沒有找到"),TEXT("[ERROR]"),MB_OK);
}
6 模擬鍵盤點擊
TCHAR szTitle[MAX_PATH] = {0};
RECT r;
HWND hwnd = ::FindWindow(TEXT("#32770"),TEXT("飛鴿傳書 IP Messenger"));
if(hwnd != NULL)
{
//HWND hButton = FindWindowEx(hwnd,NULL,"Button","刷新(&R)");
HWND hEdit =::GetDlgItem(hwnd,0x3E9);
//獲取窗口坐標
::GetWindowRect(hEdit,&r);
//設置鼠標的位置
::SetCursorPos(r.left+1,r.top+1);
Sleep(1000);
//鼠標左鍵單擊
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//點下左鍵
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//松開左鍵
//模擬鍵盤
keybd_event(97,0,0,0);
keybd_event(97,0,KEYEVENTF_KEYUP,0);
Sleep(1000);
keybd_event(66,0,0,0);
keybd_event(66,0,KEYEVENTF_KEYUP,0);
Sleep(1000);
keybd_event(16,0,0,0);
keybd_event(67,0,0,0);
keybd_event(67,0,KEYEVENTF_KEYUP,0);
keybd_event(16,0,KEYEVENTF_KEYUP,0);
}
else
{
::MessageBox(NULL,TEXT("窗口沒有找到"),TEXT("[ERROR]"),MB_OK);
}
鍵盤鍵與虛擬鍵碼對照表
MSDN:https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
Blog:https://www.cnblogs.com/del/archive/2007/12/07/987364.html
零基礎逆向工程40_Win32_14_枚舉窗口_模擬鼠標鍵盤