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

PostMessage 的問題

尚未結案
boson
中階會員


發表:74
回覆:155
積分:85
註冊:2004-07-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-21 17:08:48 IP:218.170.xxx.xxx 未訂閱
我用 IE 瀏覽網頁, 常常會發生網頁指令碼錯誤的狀況,例如: 我想寫一個小程式, 不斷偵測, 看看是否出現了錯誤訊息視窗 ? 一旦發現, 便代替 user 按下 N 鍵, 讓錯誤訊息視窗消失 我可以找到錯誤訊息視窗的 Handle 值 我試著用 PostMessage(Handle, WM_KEYDOWN, VK_RETURN, 0); 對其送出 Enter 鍵 結果可以運作 但我要對視窗輸出 N 鍵, 卻發現沒有反應 PostMessage(Handle, WM_KEYDOWN, Ord('N'), 0); 或 PostMessage(Handle, WM_CHAR, Ord('N'), 0); 都不行 請問該如何將 N 鍵的訊息送給那個錯誤訊息視窗呢 ?
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-21 18:24:41 IP:210.243.xxx.xxx 未訂閱
給你一個小範例, 這個程式有一個timer每隔一秒送一個N鍵. 程式跑起來後, 按下Button1, 會彈出一個MessageBox, timer會送出N鍵關閉這個MessageBox.    
procedure TForm1.Button1Click(Sender: TObject);
begin
  MessageBox(0, 'Test', 'Test', MB_YESNO);
end;    procedure TForm1.Timer1Timer(Sender: TObject);
begin
  // $4E是N鍵的Virtual Key值
  // 先送一個Key Down值
  keybd_event($4E, 0, KEYEVENTF_EXTENDEDKEY, 0);
  // 再送一個Key Up值
  keybd_event($4E, 0, KEYEVENTF_EXTENDEDKEY   KEYEVENTF_KEYUP, 0);
end;
boson
中階會員


發表:74
回覆:155
積分:85
註冊:2004-07-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-21 22:23:47 IP:218.174.xxx.xxx 未訂閱
這個範例似乎是把按鍵值, 送給本身, 而不是送給外部的其它程式視窗
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-21 22:43:39 IP:61.64.xxx.xxx 未訂閱
引言: 這個範例似乎是把按鍵值, 送給本身, 而不是送給外部的其它程式視窗
這個方法會送給目前有輸入焦點的任何程式.
boson
中階會員


發表:74
回覆:155
積分:85
註冊:2004-07-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-22 12:32:58 IP:218.170.xxx.xxx 未訂閱
不能像 PostMessage 一樣, 把按鍵值送給指定的視窗 Handle 嗎 ? 因為指定視窗不一定是 active 的 且我可能同時需要對兩個以上的錯誤訊息視窗輸出不同的按鍵值
jow
尊榮會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-22 12:53:54 IP:220.130.xxx.xxx 未訂閱
如果用PostMessage,你也要確保你Post的對象本身有 實作相對的回應動作,意思是說有些Message是可忽略 不被處理的,除非你有指定並改寫它. 我認為Zard大大的方法,應該是傳送模擬按鍵動作較好的做法.
allenchan
資深會員


發表:10
回覆:306
積分:283
註冊:2004-01-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-23 09:12:19 IP:61.62.xxx.xxx 未訂閱
我想那您就把您要送訊息的視窗設到前景來: SetForegroundWindow(Handle); 然後再利用 Zard 大大的方法來送鍵盤 Event。
I_Love_You
一般會員


發表:18
回覆:87
積分:21
註冊:2002-07-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-23 11:59:45 IP:211.148.xxx.xxx 未訂閱
boson,如果你可以找到弹出窗口的handle,那么请继续找里面的按钮的 handle(‘是’或‘否’的按钮handle),这样在利用 PostMessage(Handle, WM_KEYDOWN, VK_RETURN, 0); 即可。 光找到窗口的handle是没有用的。 如果不用上面的方法,就用其他大大说的方法也可以,先将 窗口变成当前窗口,然后再发送模拟键盘按键就可以了。
boson
中階會員


發表:74
回覆:155
積分:85
註冊:2004-07-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-12-23 19:10:13 IP:218.170.xxx.xxx 未訂閱
我在網路上搜尋, 一大堆網頁都說 PostMessage 可以將按鍵值送給某個 Handle 可是我就是沒試成功 感到奇怪, 是我哪裏做錯了 ? 還是網路上的說法只是大家抄來抄去, 卻沒人實作 ? 原本以為這只是一個小問題, 應該馬上會有人告訴我 PostMessage 的正確用法 可是大家提出的解答, 卻與 PostMessage 沒什麼關係 keybd_event 搭配 SetForegroundWindow 看起來似乎可以解決我的問題, 雖然我還沒試 我還是很好奇, PostMessage 究竟要怎麼使用才能 work ? 諸位高手能不能幫忙測試一下 ?
allenchan
資深會員


發表:10
回覆:306
積分:283
註冊:2004-01-06

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-12-24 00:22:52 IP:61.62.xxx.xxx 未訂閱
PostMessage(Handle, WM_COMMAND, IDNO, 0);
系統時間:2024-05-15 4:15:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!