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

如何送某個訊息給已啟動的程式?

答題得分者是:Miles
jck1
一般會員


發表:53
回覆:67
積分:24
註冊:2002-05-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-26 00:05:34 IP:211.22.xxx.xxx 未訂閱
嗨 最近有用一套hot keyboard pro的軟體 這個軟體可以錄製一些macro 然後可以設定熱鍵來啟動該macro 我是想寫一個程式來送訊息給那個 keyboard pro程式 叫他啟動已定義好的macro 不知道這樣的程式該如何下手呢 謝謝!!
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-26 09:32:37 IP:218.160.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-26 10:09:07 IP:211.22.xxx.xxx 未訂閱
引言: 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
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迴圈裡了
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-26 11:04:49 IP:218.160.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-26 11:33:56 IP:211.22.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-26 13:06:12 IP:218.160.xxx.xxx 未訂閱
    不好意思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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-26 15:30:06 IP:211.22.xxx.xxx 未訂閱
當然還是先謝謝麥兄的回答 上面那個程式可正常執行 ^^    另外我還有兩個問題(問題還真多,但我確定我不是問題份子^^)
一、要送一個按鍵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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-26 17:50:44 IP:218.160.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-03-27 13:48:34 IP:211.22.xxx.xxx 未訂閱
謝謝麥兄 若有心得再上來回報囉 感謝啊
系統時間:2024-05-15 23:47:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!