findwindowex為何失效? |
|
takdick
一般會員 發表:50 回覆:63 積分:22 註冊:2002-08-05 發送簡訊給我 |
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
引言: 我想寫一程序去控制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 發送簡訊給我 |
你應該是要用 CreatObjectOle 才有辦法控制按鈕
可是 notepad 沒有辦法用 OLE
用 word 就可以
換個方向吧!!!! 一陣紅光閃過
夾雜著V-Twin獨特的厚實聲浪
也聞到了高辛烷汽油燃燒後的焦油味
雙碟煞就像是戰神的雙翼-只祝福最剽悍的戰士
天生具有灼傷地表的能力
來吧!看到尾燈就算妳贏.......
------
一陣紅光閃過 夾雜著V-Twin獨特的厚實聲浪 也聞到了高辛烷汽油燃燒後的焦油味 雙碟煞就像是戰神的雙翼-只祝福最剽悍的戰士 天生具有灼傷地表的能力 來吧!看到尾燈就算妳贏....... |
takdick
一般會員 發表:50 回覆:63 積分:22 註冊:2002-08-05 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
引言: 謝謝各位幫忙. 原來還有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 發送簡訊給我 |
|
阿子
站務副站長 發表:120 回覆:230 積分:201 註冊:2002-03-18 發送簡訊給我 |
|
takdick
一般會員 發表:50 回覆:63 積分:22 註冊:2002-08-05 發送簡訊給我 |
原來這樣更簡單,謝謝.
想學多點東西,如果在不知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 發送簡訊給我 |
|
鈴鐺
初階會員 發表:33 回覆:81 積分:35 註冊:2002-03-13 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |