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

findwindowex為何失效?

 
takdick
一般會員


發表:50
回覆:63
積分:22
註冊:2002-08-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-08-05 19:33:31 IP:218.102.xxx.xxx 未訂閱
我想寫一程序去控制notepad的按鈕,但不知為何沒反應??請指教. procedure TForm1.Button1Click(Sender: TObject); var myhwnd:HWND; begin myhwnd:=FindWindowEx(FindWindow(nil,'test.txt - 記事本'),0,'nil','檔案'); SendMessage(myhwnd, BM_CLICK ,0,0); end;
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-08-07 01:20:54 IP:61.59.xxx.xxx 未訂閱
takdick兄 您這個問題煩請至『Win32 API 使用討論區』發言 相信該版會有這領域的高手解答您的問題 噓~~~~~~沉思中…
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-08-07 08:40:19 IP:61.219.xxx.xxx 未訂閱
引言: 我想寫一程序去控制notepad的按鈕,但不知為何沒反應??請指教. procedure TForm1.Button1Click(Sender: TObject); var myhwnd:HWND; begin myhwnd:=FindWindowEx(FindWindow(nil,'test.txt - 記事本'),0,'nil','檔案'); SendMessage(myhwnd, BM_CLICK ,0,0); end;
我想寫一程序去控制notepad的按鈕 我不知道記事本在那裡有按鈕, 我想你應該是要控制Menu吧 MenuItem 並不是Window Control, 故應該抓不到childWindow 以下程式供你參考 Form上放一個Treeview1, 一個button Button1 click時, 取得'test.txt - 記事本'之window handle, 並取得記事本之所有Menu顯示於Treeview1 Treeview1之item Double Click時執行記事本相對應之menu功能
    procedure TForm1.Button1Click(Sender: TObject);
var
  root:TTreenode;
begin
  hnotepad:=FindWindow(nil,'test.txt - 記事本');
  if hnotepad <> 0 then
  if GetMenu(hnotepad) <> 0 then begin
    root:=Treeview1.items.Add(nil, 'Main Menu');
    AddChildMenus(root, GetMenu(hnotepad));
    Treeview1.FullExpand;
    Refresh;
  end;
end;    procedure TForm1.AddChildMenus(pnd:TTreenode;m:hMenu);
VAR
  i,id:integer;
  nd:TTreenode;
  MText : ARRAY[0..255] OF Char;
begin
  for i:=0 to GetMenuItemCount(m)-1 do begin
    Id := Integer(GetMenuItemID(m, i));
    GetMenuString(m, i, MText, 255, MF_BYPOSITION);
    if id = -1 then begin
      nd:=Treeview1.items.AddChild(pnd, mText);
      AddChildMenus(nd, GetSubMenu(m, i));
    end
    else if length(Trim(MText)) > 0 THEN
      Treeview1.items.AddChildObject(pnd, Format('%s {ID=%d}',[MText, Id]), Pointer(Id));
  END;
END;    procedure TForm1.TreeView1DblClick(Sender: TObject);
begin
  BringWindowToTop(hNotePad);
  PostMessage(hNotePad,WM_COMMAND,Integer(Treeview1.Selected.Data), 0);
end;
tonychow
一般會員


發表:5
回覆:25
積分:11
註冊:2002-05-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-08-07 17:04:40 IP:210.66.xxx.xxx 未訂閱
你應該是要用 CreatObjectOle 才有辦法控制按鈕 可是 notepad 沒有辦法用 OLE 用 word 就可以 換個方向吧!!!! 一陣紅光閃過 夾雜著V-Twin獨特的厚實聲浪 也聞到了高辛烷汽油燃燒後的焦油味 雙碟煞就像是戰神的雙翼-只祝福最剽悍的戰士 天生具有灼傷地表的能力 來吧!看到尾燈就算妳贏.......
------
一陣紅光閃過
夾雜著V-Twin獨特的厚實聲浪
也聞到了高辛烷汽油燃燒後的焦油味
雙碟煞就像是戰神的雙翼-只祝福最剽悍的戰士
天生具有灼傷地表的能力
來吧!看到尾燈就算妳贏.......
takdick
一般會員


發表:50
回覆:63
積分:22
註冊:2002-08-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-08-07 19:21:10 IP:203.198.xxx.xxx 未訂閱
謝謝各位幫忙. 原來還有getmenu,getsubmenu這些函數(我初學的,請別見笑) 如果我要通過其他程序執行notepad菜單的'編輯'的子菜單'時間和日期'這一功能,代碼如何寫? mytest:=findwindow(nil,'test.txt - 記事本'); m:=getmenu(mytest,??) ; m1:=getsubmenu(m,??); sendmessage(????); 問號處該如何寫,請指教.
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-08-07 20:08:01 IP:203.217.xxx.xxx 未訂閱
引言: 謝謝各位幫忙. 原來還有getmenu,getsubmenu這些函數(我初學的,請別見笑) 如果我要通過其他程序執行notepad菜單的'編輯'的子菜單'時間和日期'這一功能,代碼如何寫? mytest:=findwindow(nil,'test.txt - 記事本'); m:=getmenu(mytest,??) ; m1:=getsubmenu(m,??); sendmessage(????); 問號處該如何寫,請指教.
GetMenu是取得該Window之MainMenu, GetSubMenu則取得某一menuItem之下一層Menu, 你必須先由第一層找到"編輯", 然後再由"編輯"之下層找到"時間和日期". 若只是用來控制記事本,簡單的方法是,你Run前面的程式, Treeview中會列出記事本所有MenuItem及其ID,你要用那一個MenuItem, 把ID抄下來 PostMessage(hNotePad,WM_COMMAND,ID, 0); 就可以了 建議你把程式仔細看懂,就應該知道如何用了
takdick
一般會員


發表:50
回覆:63
積分:22
註冊:2002-08-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-08-08 11:37:46 IP:203.198.xxx.xxx 未訂閱
什麼東西的treeview??? 能說清楚點嗎????
阿子
站務副站長


發表:120
回覆:230
積分:201
註冊:2002-03-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-08-08 12:33:14 IP:61.221.xxx.xxx 未訂閱
treeview 是一個元件(VCL),ccchen兄在第一次回應的程式碼中就有使用到。 建議你先RUN一次看看,你會有不少收穫。    從思考取勝一切~q
------
從思考取勝一切~q
takdick
一般會員


發表:50
回覆:63
積分:22
註冊:2002-08-05

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-08-08 16:08:57 IP:203.198.xxx.xxx 未訂閱
原來這樣更簡單,謝謝. 想學多點東西,如果在不知ID的情況,以下代碼能否達到同樣效果?? mytest:=findwindow(nil,'test.txt - 記事本'); m:=getmenu(mytest,??) ; m1:=getsubmenu(m,??); sendmessage(????); 如果可以,問號處該寫什麼?? 另外我用你的方法顯示OUTLOOK EXPRESS 6的ID,但Treeview什麼也沒顯示. 我只改動 hnotepad:=FindWindow('Outlook Express Browser Class',nil); 還請指點. 發表人 - takdick 於 2002/08/08 16:49:04
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-08-08 18:21:59 IP:203.217.xxx.xxx 未訂閱
ゴ醱最宒腔?洘肫朒, 統蕉AddChildMenu, ?珨?SerachChildMenu憩岆賸赻撩??勘 [坻APK]衄稛N?, OutLook肮r衄疑?Window, 斕猁梑善MainMenu垀婓眳Window, GetMenu符衄虴 o恅侵, 褫猁珂梑善mainWindow婬珨?珨?childWindw?, 扂褫祥砑?, outlook眻諉蚚Ole憩褫眕賸 鍚珨?源砃, 俇硐冞Keyboard Message耀M紱釬珩褫絻善珨衄完
鈴鐺
初階會員


發表:33
回覆:81
積分:35
註冊:2002-03-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2002-08-22 21:48:57 IP:211.21.xxx.xxx 未訂閱
takdick 兄, 你可以用 global 變數, 並且用 ccchen 提供的函數, 直接比對 treeview 產生過程的資料, 即可做到你的功能.    By the way, 建議此篇列入黃金文章    
引言: 謝謝各位幫忙. 原來還有getmenu,getsubmenu這些函數(我初學的,請別見笑) 如果我要通過其他程序執行notepad菜單的'編輯'的子菜單'時間和日期'這一功能,代碼如何寫? mytest:=findwindow(nil,'test.txt - 記事本'); m:=getmenu(mytest,??) ; m1:=getsubmenu(m,??); sendmessage(????); 問號處該如何寫,請指教.
takdick
一般會員


發表:50
回覆:63
積分:22
註冊:2002-08-05

發送簡訊給我
#12 引用回覆 回覆 發表時間:2002-08-23 10:33:12 IP:203.198.xxx.xxx 未訂閱
謝謝大家! 這問題已解決.
系統時間:2024-04-26 4:01:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!