1. 程式人生 > >零基礎逆向工程40_Win32_14_枚舉窗口_模擬鼠標鍵盤

零基礎逆向工程40_Win32_14_枚舉窗口_模擬鼠標鍵盤

鼠標 枚舉 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_枚舉窗口_模擬鼠標鍵盤