如何送某個訊息給已啟動的程式? |
答題得分者是:Miles
|
jck1
一般會員 發表:53 回覆:67 積分:24 註冊:2002-05-23 發送簡訊給我 |
|
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
Hi jck1 您好:
這是我剛剛試的一段程式, 很單純的送一個字給Notepad,
你可以搜尋一下"SendMessage" 還有與Window相關的API
試試.
procedure TForm1.Button1Click(Sender: TObject); var H : THandle; ClassName : Array[0..255] of Char; P : TPoint; begin H := FindWindow(nil, '未命名 - 記事本'); if H = 0 then begin ShowMessage('Not Found'); exit; end; while true do begin H := ChildWindowFromPoint(H, P); GetClassName(H, ClassName, 255); if ClassName = 'Edit' then Break; end; if H <> NULL then begin SendMessage(H, WM_CHAR, 65, 0); end; end;我不是高手, 高手是正在銀幕前微笑的人. 發表人 - miles 於 2003/03/26 09:34:13
------
我不是高手, 高手是正在銀幕前微笑的人. |
jck1
一般會員 發表:53 回覆:67 積分:24 註冊:2002-05-23 發送簡訊給我 |
引言: Hi jck1 您好: 這是我剛剛試的一段程式, 很單純的送一個字給Notepad, 你可以搜尋一下"SendMessage" 還有與Window相關的API 試試.hi Miles 謝謝你的回答 請問H := ChildWindowFromPoint(H, P); 這行中的P指的是什麼呢? 我看了一下document說的是 Specifies a POINT structure that defines the client coordinates of the point to be checked. 但是當我按下projcet1的button時 client coordinate指的是我的delphi程式還是用findwindow找到的記事本呢? 又ClassName = 'Edit'是指什麼呢? 還有這個程式我試run一下 會跑不出結果 好像是卡在while迴圈裡了procedure TForm1.Button1Click(Sender: TObject); var H : THandle; ClassName : Array[0..255] of Char; P : TPoint; begin H := FindWindow(nil, '未命名 - 記事本'); if H = 0 then begin ShowMessage('Not Found'); exit; end; while true do begin H := ChildWindowFromPoint(H, P); GetClassName(H, ClassName, 255); if ClassName = 'Edit' then Break; end; if H <> NULL then begin SendMessage(H, WM_CHAR, 65, 0); end; end;我不是高手, 高手是正在銀幕前微笑的人. 發表人 - miles 於 2003/03/26 09:34:13 |
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
引言: hi Miles 謝謝你的回答 請問H := ChildWindowFromPoint(H, P); 這行中的P指的是什麼呢? 我看了一下document說的是 Specifies a POINT structure that defines the client coordinates of the point to be checked. 但是當我按下projcet1的button時 client coordinate指的是我的delphi程式還是用findwindow找到的記事本呢? 又ClassName = 'Edit'是指什麼呢? 還有這個程式我試run一下 會跑不出結果 好像是卡在while迴圈裡了 Hi jck1兄您好: 1.p 是一個指標, 可讓你指定一個位置讓ChildWindowFromPoint去找, 例如一個Form上面有兩個Panel, 我便可以指定p去看要尋找哪一個 Panel, 他的位置是以Parent的相對位置為準, 這裡指的是Notepad的 位置. 2.ClassName = 'Edit'我們試著去找notepad底下Class為Edit的物件, 可以開Delphi內附的WinSight程式去看裡面一些資訊. 3.跑程式前請先開一個空的notepad(記事本) 希望對你有幫助< >< >我不是高手, 高手是正在銀幕前微笑的人.
------
我不是高手, 高手是正在銀幕前微笑的人. |
jck1
一般會員 發表:53 回覆:67 積分:24 註冊:2002-05-23 發送簡訊給我 |
引言: Hi jck1兄您好: 1.p 是一個指標, 可讓你指定一個位置讓ChildWindowFromPoint去找, 例如一個Form上面有兩個Panel, 我便可以指定p去看要尋找哪一個 Panel, 他的位置是以Parent的相對位置為準, 這裡指的是Notepad的 位置. 2.ClassName = 'Edit'我們試著去找notepad底下Class為Edit的物件, 可以開Delphi內附的WinSight程式去看裡面一些資訊. 3.跑程式前請先開一個空的notepad(記事本) 手, 高手是正在銀幕前微笑的人.hi 麥兄 1.我在跑這個程式時,是有先開notepad,不然該該會出現not found訊息。 2.指標P在進入while迴圈時都沒有給過值,但我用F8單步執行去看時卻發現p所指向的結構x:13309948 y:1242646,這兩個數字是指notepad cursor所停的那一點嗎?如果是的話,那他又是在那一行程式時餵進去的值呢? 3.我跑此程式時真的是跑不出來,我用的是win2000和Delphi5,不知這和環境是否有關係呢? 謝謝溜..... |
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
不好意思jck1兄, 我在XP跑時有時可以有時不行,
推測應該是p.x, p.y的初值未設定的關係, 但指定初值
並不符合需求, 改成以下這段試試.
procedure TForm1.Button1Click(Sender: TObject); var H : THandle; ClassName : Array[0..255] of Char; P : TPoint; begin H := FindWindow(nil, '未命名 - 記事本'); if H = 0 then begin ShowMessage('Not Found'); exit; end; H := FindWindowEx(H, 0, 'Edit', nil); if H <> NULL then begin SendMessage(H, WM_CHAR, 65, 0); end; end;我不是高手, 高手是正在銀幕前微笑的人.
------
我不是高手, 高手是正在銀幕前微笑的人. |
jck1
一般會員 發表:53 回覆:67 積分:24 註冊:2002-05-23 發送簡訊給我 |
當然還是先謝謝麥兄的回答
上面那個程式可正常執行 ^^ 另外我還有兩個問題(問題還真多,但我確定我不是問題份子^^)
一、要送一個按鍵F6給其他程式這樣寫對嗎? SendMessage(H, WM_KEYDOWN, VK_F7, 0); document中的說明看得不是很了解 nVirtKey 和 lKeyData 不知道要傳什麼。 二、又提到我用的那個軟體Hot Keyboard Pro, 他應該是屬於一種 常駐程式嗎??因為只要我在任何視窗下,按下我定義的熱鍵, 例如F7吧,他就會啟動該熱鍵的macro功能,即使我是在delphi的 編輯視窗下,F7本應該是單步執行程式的,但delphi會收不到F7,而 會被Hot Keyboard Pro先攔走。我要對像Hot Keyboard pro的程式送 訊息的話,也是用SendMessage這樣的方法嗎??謝謝大家的問答 |
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
Hi jck兄:
你的問題也讓我受益良多
1.可以參考此篇先進的文章 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=21387 改良後的程式碼為, 這是模擬鍵盤的做法, 至於使用SendMessage我還在試 若兄有try出, 還請不吝分享. procedure TForm1.Button1Click(Sender: TObject); var H : THandle; ClassName : Array[0..255] of Char; begin H := FindWindow(nil, '未命名 - 記事本'); if H = 0 then begin ShowMessage('Not Found'); exit; end; // H := FindWindowEx(H, 0, 'Edit', nil); if H <> NULL then begin BringWindowToTop(H); keybd_event(VK_F1, 0, 0, 0); keybd_event(VK_F1, 0, KEYEVENTF_KEYUP, 0); end; end; 2.Hot Keyboard Pro小弟不太熟, 但小弟淺見應該是攔截Windows Hook, 可能只有KeyBoard Hook 搭配SendMessage or keybd_event.< >< > 我不是高手, 高手是正在銀幕前微笑的人. 發表人 - miles 於 2003/03/26 17:52:38
------
我不是高手, 高手是正在銀幕前微笑的人. |
jck1
一般會員 發表:53 回覆:67 積分:24 註冊:2002-05-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |