線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1205
推到 Plurk!
推到 Facebook!

像這種固定設焦點至記事本的程式,要怎樣改才能重設焦點至上一個視窗。

缺席
hent
一般會員


發表:3
回覆:3
積分:1
註冊:2003-01-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-01-04 02:32:27 IP:61.30.xxx.xxx 未訂閱
請各位前輩高手指教一下,我找到了一個程式,可以在按鈕按下時,把焦點設到記事本上面去,但是我想改寫成按鈕按下時,不管上一個視窗是word記事本還是網頁,都能把焦點重設回去,我己經試著改了幾十次,可是出盡各種方式,連編譯都沒辦法,老是得到一大堆錯誤的訊息回報,所以我把可以執行的原始程或貼上來,請各位前輩高手幫我改一下。 #include  #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { //搜尋<記事本>有無開啟 HWND hNpad = ::FindWindow(NULL, "未命名 - 記事本"); //若<記事本>在開啟中,即帶到最前面 if(::ShowWindow(hNpad,SW_SHOWNORMAL)) { ::BringWindowToTop(hNpad); } else //若沒開啟,則開啟<記事本> { //取得Window目錄位置 char WinDir[MAX_PATH]; ::GetWindowsDirectory(WinDir, MAX_PATH); AnsiString sysdir = AnsiString(WinDir) "\\Notepad.exe"; //開啟<記事本> ::ShellExecute(NULL,"open",sysdir.c_str(),NULL,NULL,SW_SHOWNORMAL); //再次找到<記事本>視窗 hNpad = ::FindWindow(NULL, "未命名 - 記事本"); } //進行自訂函式 if(VaultWindowThreadID(hNpad)) Memo1->Text = "完成在不同執行緒行程間的視窗取得焦點。"; else Memo1->Text = "請在開啟<記事本>後,再執行本程式。"; } //--------------------------------------------------------------------------- //在不同執行緒行程間的視窗取得焦點 bool TForm1::VaultWindowThreadID(HWND hWnd) { bool Result; DWORD fWinThreadID; DWORD winThreadID; //若傳入的視窗handle等同於現在最前面視窗handle if(hWnd == ::GetForegroundWindow()) Result = true; else {//取得現在最前面視窗的執行緒代碼ID fWinThreadID = ::GetWindowThreadProcessId(::GetForegroundWindow(), NULL); //取得現在視窗的執行緒ID winThreadID = ::GetWindowThreadProcessId(hWnd, NULL); if(fWinThreadID != winThreadID) {//若兩者不同,則跳至現在執行緒的視窗,並移動至最前面 ::AttachThreadInput(fWinThreadID, winThreadID, true); Result = ::SetForegroundWindow(hWnd);//true //再解開此二者不同執行緒的關聯 ::AttachThreadInput(fWinThreadID, winThreadID, false); } else//若相同,則直接將此視窗提至最前面 Result = ::SetForegroundWindow(hWnd); //顯現視窗至桌面上 ::ShowWindow(hWnd, SW_RESTORE); return Result; } return Result; } //-------------------------------------------------------------------------
FrederickPau
資深會員


發表:4
回覆:161
積分:268
註冊:2002-11-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-01-04 03:38:04 IP:61.228.xxx.xxx 未訂閱
給你一個方向吧 你先找到自己這個程式視窗的 Handle 然後用 GetNextWindow 這個 Function 找到一下個最上層的視窗即可 要注意 ... 要避開 Default IME 這些視窗喔
系統時間:2024-04-29 23:28:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!