請問關於SPY++的用法 |
尚未結案
|
愛爾伯特
一般會員 發表:6 回覆:9 積分:3 註冊:2005-01-28 發送簡訊給我 |
我現在想要控制一個視窗程式。(舉例是控制KKAMN好了)
那我是應該可以用 findwindow 去找到我執行的 handle 可是我不知道針對HANDLE要怎麼下指令去控制KKMAN
也就是說我不知道在postmessage裡面要怎麼下指令,
所以我應該可以用SPY 去看我讓KKMAN動作時傳送了什麼指令,
那我要怎麼看才知道說哪一些訊息是重要,是我可以用在postmessage或是sendmessage裡面的呢? 可以請各位大大教我一下嗎? 還有一個問題是在使用createprocess這個指令時,怎樣去找handle呢?
createprocess跟shellexcute最大的差別是在哪呢,我之前有找到一些文章,
但是還是不太懂,可以請大大順便教我一下嗎,謝謝
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
愛爾伯特 您好: 如果您想透過 Spy++ 來觀察目標的訊息運作,那麼就在 Spy++ 選單依序點選選 Spy -> Message 選項 (或者是按下 Ctrl + M 鍵),接著會顯示出一個 Message Options 視窗,該視窗的 Windows 頁籤中有一個 Finder Tool,將您的滑鼠指標移到 Finder Tool 右側的雷達圖示上,按下滑鼠左鍵不要放開,然後以拖曳的方式將雷達圖示移到要觀察的目標視窗,待目標視窗被框選起來後再放開滑鼠左鍵,接著再回到 Message Options 視窗點選 OK 鈕,這樣就完成設定,可以開始追蹤目標視窗的訊息了。 至於那些訊息是重要的,那就得看您想要做什麼了?您可以在目標視窗做些操作,然後觀察 Spy++ 訊息窗內的記錄資料與變化,大致上就能知道那些訊息與那些動作有關聯了,對於各個訊息的涵義可以查看 Help 或是到 MSDN 去查看。 有關 CreateProcess 時要找 Handle 值的問題有點怪怪的,因為使用 CreateProcess 時並不需要用到 Handle 值,反倒是呼叫後,如果該函式正確被執行的話,會將 "被執行進程的 Handle 值" 傳回給 PROCESS_INFORMATION 結構中的 hProcess。 另外您問到 CreateProcess 與 ShellExecute 的差異,就我個人的經驗來講,最大的差別是在前者設定較為複雜,但是使用起來較為靈活,同時 CreateProcess 可取得被執行程式實際的 Handle 值,在某些運用上會比較實用,當然兩者的差異不只如此而已,如果想進一步瞭解兩者的其它差異處,您可以參考 Help 的說明與站上的相關討論。 您如果對某個 API 的使用或是設定有不懂之處,可以另外開題發問,同時請儘量的將問題單純化。 7 天天敲鍵盤 v 時時按滑鼠 8
|
愛爾伯特
一般會員 發表:6 回覆:9 積分:3 註冊:2005-01-28 發送簡訊給我 |
|
愛爾伯特
一般會員 發表:6 回覆:9 積分:3 註冊:2005-01-28 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
愛爾伯特 您好: 關於 wParam 與 lParam 的實際意義與是否要傳送?那是要看不同的訊息動作為何、個別的參數值作用又為何?基本上那兩個值都是有必要的,但是還是要以個別訊息的說明文件為準,例如查看 Help 有關 WM_ENTERIDLE 的說明如下:
The WM_ENTERIDLE message is sent to the owner window of a modal dialog box or menu that is entering an idle state. A modal dialog box or menu enters an idle state when no messages are waiting in its queue after it has processed one or more previous messages. WM_ENTERIDLE fuSource = wParam; // idle-source flag hwnd = (HWND) lParam; // handle of dialog box or owner window Parameters fuSource Value of wParam. Specifies whether the message is the result of a dialog box or a menu being displayed. This parameter can be one of the following values: Value Meaning MSGF_DIALOGBOX The system is idle because a dialog box is displayed. MSGF_MENU The system is idle because a menu is displayed. hwnd Value of lParam. Contains the handle of the dialog box (if fuSource is MSGF_DIALOGBOX) or of the window containing the displayed menu (if fuSource is MSGF_MENU). Return Values An application should return zero if it processes this message. Remarks The DefWindowProc function returns zero.那麼由上面的說明可以知道 wParam 與 lParam 在系統接收 WM_ENTERIDLE 訊息時都是必要的一部份,因此您要模擬該訊息的話,就得設定那兩個參數。 7 天天敲鍵盤 v 時時按滑鼠 8 |
愛爾伯特
一般會員 發表:6 回覆:9 積分:3 註冊:2005-01-28 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
愛爾伯特 您好: 給您一個簡單的範例如下,我盡量在需要說明的地方都加上註解,未加上註解的地方請自行查閱相關說明文件:
// 宣告兩個全域變數如下 DWORD cmProcessID; HWND cmHwnd; // 以 Process ID 找尋 Window Handle 的 CallBack 程序 bool CALLBACK FindPrgmHwnd(HWND hWnd, LPARAM lParam) { DWORD pID; GetWindowThreadProcessId(hWnd, &pID); // 依據 Process ID 來取得 HWND if (pID == (DWORD)lParam) { // 如果現在比對的 Process ID 與 lParam 參數 (查詢對象) 所設相同 cmHwnd = hWnd; // 將對應於 Process ID 的 HWND 設給全域變數 cmHwnd return false; } return true; } // 呼叫外部程式的程序,此處以呼叫 "記事本" 程式為例 void __fastcall TForm1::Button1Click(TObject *Sender) { PROCESS_INFORMATION ProcessInfo; STARTUPINFO StartupInfo; ZeroMemory(&StartupInfo, sizeof(StartupInfo)); StartupInfo.cb = sizeof(STARTUPINFO); StartupInfo.wShowWindow = SW_SHOW; StartupInfo.dwFlags = STARTF_USESHOWWINDOW; AnsiString cmdline = "notepad.exe"; // 以 "記事本" 為呼叫對象 if (CreateProcess(NULL, cmdline.c_str(), NULL, NULL, false, 0, NULL, NULL, &StartupInfo, &ProcessInfo)) { CloseHandle(ProcessInfo.hThread); cmProcessID = ProcessInfo.dwProcessId; // 記下 Process ID CloseHandle(ProcessInfo.hProcess); } else { ShowMessage("error!"); } } /* SendMessage 範例程序 按照 Help 中對 WM_CHAR 訊息的解說,它的參數如下: WM_CHAR chCharCode = (TCHAR) wParam; // character code lKeyData = lParam; // key data (其它詳解請自行查閱) */ void __fastcall TForm1::Button2Click(TObject *Sender) { if (cmProcessID != NULL) { cmHwnd = NULL; // 透過 EnumWindows 取得對應於 cmProcessID 的 HWND EnumWindows((WNDENUMPROC)FindPrgmHwnd, (LPARAM)cmProcessID); if (cmHwnd != NULL) { // 如果找到目標視窗的話 // 取得文字編輯區的 HWND HWND hEdit = FindWindowEx(cmHwnd, NULL, "Edit", NULL); if (hEdit) { // 如果找到文字編輯區的話 BringWindowToTop(cmHwnd); // 將目標視窗提到最上層來顯示 // 按照 Help 上的說明,使用 SendMessage 送出 WM_CHAR 訊息: SendMessage(hEdit, WM_CHAR, 'A', 0); // 送出 'A' 字元 SendMessage(hEdit, WM_CHAR, 66, 3); // 送出 3 個 'B' 字元的 10 進位碼 SendMessage(hEdit, WM_CHAR, 0x43, 0); // 送出 'C' 字元的 16 進位碼 } } } }上述範例會在按下 Button1 時呼叫記事本程式,而按下 Button2 時,會在記事本程式內輸入 ABBBC 字樣,WM_CHAR 的 SendMessage 之所以呼叫三次,是要示範可以使用不同的方式送出該訊息的 wParam 參數,與配合 lParam 參數後的結果。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/09/26 14:33:02 |
愛爾伯特
一般會員 發表:6 回覆:9 積分:3 註冊:2005-01-28 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |