線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2535
推到 Plurk!
推到 Facebook!

關於發送按鍵後等待一個窗體被調出的問題

答題得分者是:Mickey
KFC123_60201
一般會員


發表:58
回覆:18
積分:15
註冊:2006-07-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-09 08:42:24 IP:139.78.xxx.xxx 訂閱
我寫了一個小程序向另一個外部主程序發送一個按鍵組合(Shift-Ctrl-S) 來調出一個dialog,這個dialog上有三個buttons,我再用EnumChildWindows找出其中字串為'Yes'的那一個,然後向它發送模擬點襲的動作。我的程序片斷如下

// RefHND 是外部程序的handle
SetForegroundWindow(RefHND);
keybd_event(VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), 0, 0);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
keybd_event(Ord('S'), MapVirtualKey(Ord('S'), 0), 0, 0);
keybd_event(Ord('S'), MapVirtualKey(Ord('S'), 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), KEYEVENTF_KEYUP, 0);

// 到這為止,那個dialog是成功被調出來
// 下面這一段是找出Dialog的handle,如果成功,將得到 DialogHND
GotIt := EnumChildWindows(RefHND, @EnumWindowsDialogProc, 0);
if (GotIt) and (DialogHND>0) then
begin
// 再通過 EnumChildWindows 找出 Dialog 上的'Yes' Button, YesBtnHND 代表相應的handle
GotIt := EnumChildWindows(DialogHND, @EnumYesButton, 0);
if (GotIt) then
begin
SendMessage(YesBtnHND, WM_LBUTTONDOWN, 0, 0);
SendMessage(YesBtnHND, WM_LBUTTONUP, 0, 0);
end;
end;

如果我事先在外部主程序上調出我要的dialog,然後用面這段程序來找出yes button是沒問題。但是如果,dialog是由我的程序來調出,那麼就無法找到yes button。我覺得原因是我調用keybd_event調出dialog後,當dialog還沒有顯示出來以前程序就調用EnumChildWindows去尋找dialog,所以總是找不到。請問怎樣在keybd_event發送按鍵後,等到那個dialog調出後程序才往下走?

謝謝
KFC123_60201
一般會員


發表:58
回覆:18
積分:15
註冊:2006-07-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-09 11:00:15 IP:139.78.xxx.xxx 訂閱
不好意思,我想我找到問題所在了。原來問題是EnumChildWindows出錯了。我的想法是:先找到主程序的窗口句柄,然後用EnumChildWindows找出它的子窗,但原來這樣是不行的。我想問,如果只知道一個dialog的所屬窗體的handle及dialog的caption,怎樣可以找出它的handle?
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-09 11:36:31 IP:210.66.xxx.xxx 訂閱
幫你爬文, 參考一下這個範例

利用FindWindow將其他form物件下所有的資料取出來
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=30409

KFC123_60201
一般會員


發表:58
回覆:18
積分:15
註冊:2006-07-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-09 12:18:34 IP:139.78.xxx.xxx 訂閱
謝謝了,我原來就是參考那遍文章來寫代碼。但我的情況跟作者給的例子不同,他是先用FindWindow找出窗體的handle,然後再用EnumChildWindow找出該窗體下所有的components。但我的情況有所不同,我先要找出一個主窗體的handle,然後發送一個快捷鍵調出一個dialog,這個dialog不是包含在主窗體下的components,應該不能用enumchildwindows把它的handle找出來。現在我知道的信息是:1) 這個dialog由主窗體調出,而主窗的handle我是知道的 2) 這個dialog的caption是人已知的。雖然,我可以用FindWindow或EnumWindow的方法直接從dekstop中找出我想要的這個dialog,但這樣會有一個問題,因為desktop上可能有多個caption相同的windows,而我要的只是那個由主窗體調出來的dialog。
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-10-24 15:02:43 IP:218.163.xxx.xxx 訂閱
你好:

單純想法...不知可不可行...應用 GetWindowThreadProcessId

我想 Dialog 的 ProcessID 應該與 Main Window 的 Process ID 一樣.
系統時間:2024-11-24 13:29:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!