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

請問如何控制自動按下工具列的某一個視窗

尚未結案
bass15
高階會員


發表:24
回覆:171
積分:119
註冊:2003-10-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-16 11:16:53 IP:61.66.xxx.xxx 未訂閱
請問一下 我要如何控制windows自動按下工具列的某一個視窗呢,讓那個視窗在工具列是被壓下去的樣子
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-16 22:14:22 IP:61.219.xxx.xxx 未訂閱
BOOL DrawFrameControl( HDC hdc, // handle to device context LPRECT lprc, // pointer to bounding rectangle UINT uType, // frame-control type UINT uState // frame-control state );
bass15
高階會員


發表:24
回覆:171
積分:119
註冊:2003-10-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-17 13:36:52 IP:61.59.xxx.xxx 未訂閱
對不起 能否請jcjroc大哥舉個範例說明呢 不太了解 DrawFrameControl怎麼使用 謝謝
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-18 17:32:26 IP:61.219.xxx.xxx 未訂閱
引言: 對不起 能否請jcjroc大哥舉個範例說明呢 不太了解 DrawFrameControl怎麼使用 謝謝
都已經跟你說用哪個API了,去看Help好嗎?
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-18 22:25:48 IP:203.67.xxx.xxx 未訂閱
引言: 請問一下 我要如何控制windows自動按下工具列的某一個視窗呢,讓那個視窗在工具列是被壓下去的樣子
bass15你好: class="code"> void __fastcall TForm1::Button1Click(TObject *Sender) { HDC dc=GetDC(Handle); RECT rect; rect.left=100; rect.top=50; rect.right=200; rect.bottom=100; //DrawFrameControl(dc,&rect,DFC_BUTTON,DFCS_BUTTONPUSH | DFCS_ADJUSTRECT); DrawFrameControl(dc,&rect,DFC_CAPTION,DFCS_CAPTIONMAX); } 你可以試試下其它參數有什麼不同! 不過你的問題最終是要什麼呢?模擬視窗在工具列被壓下去的樣子不是只為了要讓這個視窗彈跳出來嗎? 如果你是要這個視窗彈跳出來而且硬要有被壓下去的感覺的話…我想: 有被壓下去的感覺正常來說就是滑鼠點下去才會有,所以照理說應該是送訊息去騙OS說滑鼠在上面點了一下,只是目前我還不會做(也不知道可不可以做啦!),目前只會用模擬滑鼠的方式控制滑鼠去那一個視窗上點一下了!
bass15
高階會員


發表:24
回覆:171
積分:119
註冊:2003-10-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-18 23:13:57 IP:61.59.xxx.xxx 未訂閱
謝謝2位大哥指導,不過我想DrawFrameControl似乎跟工具列上面的圖示沒有關係??? 我想解決的方法也是送message給OS 不知道哪位大大知道該送什麼樣的MESSAGE呢?
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-04-19 11:35:18 IP:211.75.xxx.xxx 未訂閱
不曉得你是要用VCL Component還是SDK? 如果是用SDK請你去看CreateToolbarEx 如果是VCL,則只是屬性的設定而已 至於Button被按下去的感覺,不知你要哪一種? 不過能確定的是,你必須送出WM_MOUSEDOWN與WM_MOUSEUP給它
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-04-19 22:11:02 IP:203.67.xxx.xxx 未訂閱
引言: 謝謝2位大哥指導,不過我想DrawFrameControl似乎跟工具列上面的圖示沒有關係??? 我想解決的方法也是送message給OS 不知道哪位大大知道該送什麼樣的MESSAGE呢?
bass15你: 下午又小小給它試了一下,仍然原地踏步,還是沒有找到完美的解法,只好先把之前 >! 首先桌面最下面那一整條 src="http://delphi.ktop.com.tw/download/upload\45825_toolbar.jpg"> 因為要用程式控制它讓它被壓下去,所以需要它:也就是需要它的window Hwnd值,再來我們才可以尋找它上面的sub window(toolbutton)的window Hwnd值! 以上圖為例,我們可能要找"記事本"那個button的Hwnd值,然後再sendMessage去按它,完成bass15你的目的! so flow如下: 1. get toolbar hwnd 2. get the hwnd of the tool button you want on the toolbar 3. control the control by send message to it's hwnd NG處 目前無法完成的是第二點,因為我無法找到任一個tool button的hwnd值(也不知道是否有hwnd值!) <>目前解決方式: 目前只找的到第一點的那條 class="code"> ~~~ TForm1 *Form1; HWND toolbar_hwnd; bool CALLBACK EnumChildProcs(HWND hwnd,LPARAM lParam); //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { EnumChildWindows(GetDesktopWindow(),(WNDENUMPROC)EnumChildProcs,0); } //--------------------------------------------------------------------------- bool CALLBACK EnumChildProcs(HWND hwnd,LPARAM lParam) { // 先找到我們要的要的那一條toolbar的hwnd值 char classname[256]; ZeroMemory(classname,256); GetClassName(hwnd,classname,256); char textname[256]; ZeroMemory(textname,256); GetWindowText(hwnd,textname,256); if (AnsiString(classname)=="ToolbarWindow32" && AnsiString(textname)=="正在執行應用程式") { toolbar_hwnd=hwnd; return false; } return true; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { SendMessage(toolbar_hwnd,WM_LBUTTONDOWN,MK_LBUTTON,0x00000150); <--模擬滑鼠按下 Sleep(2000);<--中間要有時間暫停,才看的出被壓下去的感覺 SendMessage(toolbar_hwnd,WM_LBUTTONUP,MK_LBUTTON,0x00000150);<--模擬滑鼠放開 } //--------------------------------------------------------------------------- Picture: 嗯,圖例抓的不太準,大概可以看出上圖例中,原本"project"這個視窗(即我們的測試程式)是focus狀態中的,所以會是凹下去的(表示被選擇中),然後程式執行模擬時會讓"記事本"視窗被壓下去,所以同一時間看來是有兩個視窗是凹下去的,等到模擬壓下結束時(也就是滑鼠放開時),"記事本"視窗就會彈出來,完成模擬! 另外明顯由範例程式中看出是設點座標的,這十分的不準確(應該不用解釋了< >!)! 說的很亂,但應該還可以看的懂啦< >! 發表人 - m8815010 於 2004/04/19 22:18:19
bass15
高階會員


發表:24
回覆:171
積分:119
註冊:2003-10-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-04-20 14:47:08 IP:61.66.xxx.xxx 未訂閱
謝謝m8815010: 但是這樣應該沒辦法找到正確的座標值再按下去, 請問有沒有人知道如何得到那個
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-04-21 00:04:55 IP:210.64.xxx.xxx 未訂閱
引言: 謝謝m8815010: 但是這樣應該沒辦法找到正確的座標值再按下去, 請問有沒有人知道如何得到那個>< face="Verdana, Arial, Helvetica"> 1.對呀,就是要想辦法找到需要按下去的那個視窗的座標才行!要不然胡亂給座標的話,上下是不會錯,左右就橋不準,會造成按到隔壁視窗的問題! 2.題外話,bass1突然好奇的想問你的I/O需求,因為我覺得有點疑問!就是現在你要的output是程式自動壓下某一個視窗,然後它再彈出! 那麼你的input要怎麼定義呢?若你input給的是"NotePad.exe",告知程式要壓記事本這視窗,那如果同時toolbar上有n個記事本事窗呢? 嗯,也就是我想說我突然覺得如果你是要寫一隻完整的程式,那麼要concern的東西還很多的! 3.最後再繞回來,依據我用Vc 的spy去抓tool button的hwnd值是不行的,只抓的到tool bar的,所以我懷疑是否那些button是有hwnd值的! 4.然後其實硬要找正確的座標值也是可以有所做為的,想想看,那條tool bar的總長我們會求,那假設我們又求出tool bar上有5個正在執行的視窗,就可以知道每個視窗的長是tool bar的1/5了嘛! 接著視窗的座標也可以定出來了!當然還需要知道視窗的順序! so,如果有興趣可以試一試,求座標並不是不可能,另外我有找到一個api SHAppBarMessage它可以求一些tool bar的資訊,我沒試過,你可以自已試試! That's all!
系統時間:2024-05-05 14:10:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!