全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:5304
推到 Plurk!
推到 Facebook!

請問關於SPY++的用法

尚未結案
愛爾伯特
一般會員


發表:6
回覆:9
積分:3
註冊:2005-01-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-23 13:54:22 IP:211.78.xxx.xxx 未訂閱
我現在想要控制一個視窗程式。(舉例是控制KKAMN好了) 那我是應該可以用 findwindow 去找到我執行的 handle 可是我不知道針對HANDLE要怎麼下指令去控制KKMAN 也就是說我不知道在postmessage裡面要怎麼下指令, 所以我應該可以用SPY 去看我讓KKMAN動作時傳送了什麼指令, 那我要怎麼看才知道說哪一些訊息是重要,是我可以用在postmessage或是sendmessage裡面的呢? 可以請各位大大教我一下嗎? 還有一個問題是在使用createprocess這個指令時,怎樣去找handle呢? createprocess跟shellexcute最大的差別是在哪呢,我之前有找到一些文章, 但是還是不太懂,可以請大大順便教我一下嗎,謝謝
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-23 21:57:08 IP:61.217.xxx.xxx 未訂閱
愛爾伯特 您好:    如果您想透過 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-24 16:44:59 IP:211.72.xxx.xxx 未訂閱
感謝RedSnow的回答, 我有比較清楚,可是在我用spy++的時候 我在option設定它的output,有一個選項是Raw Message Parameter, 那這個選項選了之後, 出現的WParam跟IParam是代表什麼意思呢(像下面圖表示的)? 我看MSDN的網頁似乎說WParam是代表傳送的值嗎? 可是我沒有看到IParam的意義說? 可以在麻煩再教我一下嗎,謝謝。
愛爾伯特
一般會員


發表:6
回覆:9
積分:3
註冊:2005-01-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-24 16:58:05 IP:211.78.xxx.xxx 未訂閱
不好意思,原來是lParam 我看錯了, 不過我還是不了解他們兩個實際代表的意義, 可以請大大指點我一下嗎? 謝謝 假如我要用
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-24 19:05:51 IP:59.115.xxx.xxx 未訂閱
愛爾伯特 您好:    關於 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-25 22:21:23 IP:61.231.xxx.xxx 未訂閱
感謝RedSnow的回答, 所以依據每個訊息動作的不同,也會改變是否需要傳送這兩個參數。    那這兩個參數在我每次執行相同動作都會是相同的值嗎? 還是不同的呢。    最後我可以麻煩大大舉一個簡單的例子, 敎我如何來設定這兩個值嗎? 謝謝大大
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-26 14:03:59 IP:59.115.xxx.xxx 未訂閱
愛爾伯特 您好:    給您一個簡單的範例如下,我盡量在需要說明的地方都加上註解,未加上註解的地方請自行查閱相關說明文件:
// 宣告兩個全域變數如下
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-26 23:27:20 IP:61.231.xxx.xxx 未訂閱
謝謝RedSnow的解說,實在太感謝了< > 讓我對這方面了解不少,真的很感謝,太感謝了< >
系統時間:2024-04-19 21:10:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!