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

取得上一個視窗,並且使它 Actived ?

尚未結案
solitarygo
一般會員


發表:4
回覆:12
積分:3
註冊:2004-07-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-03 10:57:41 IP:140.127.xxx.xxx 未訂閱
請問一下,我想要取得上一個視窗, 並且把它設為 Actived, 下列是我的程式碼: void __fastcall TForm1::Button1Click(TObject *Sender) { HWND hWnd=FindWindow(NULL, "Form1"); HWND hWndPrev; hWndPrev=GetNextWindow(hWnd, GW_HWNDPREV); if(hWndPrev!=NULL) { char WCaption[256]; GetWindowText(hWndPrev, WCaption, 255); Label1->Caption=String(WCaption); ShowWindow(hWndPrev, SW_SHOW); BringWindowToTop(hWndPrev); } else Label1->Caption="NULL"; } 每次我點取 Button1時, Label1的文字都是出現 Default IME, 請問我要如何做? 才能夠做到我要的功能呢? "Default IME",我不了解這是什?可請知道的大大解惑一下嗎?謝謝^^
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-04 00:55:06 IP:211.76.xxx.xxx 未訂閱
solitarygo你好: 那應該是輸入法的視窗,再取下一個視窗的Handle試試?
solitarygo
一般會員


發表:4
回覆:12
積分:3
註冊:2004-07-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-04 08:34:39 IP:140.127.xxx.xxx 未訂閱
pwipwi您好: 我已經照你的方法去取下一個視窗的Handle,但似乎不是先前的視窗, 我還特地用迴圈一直取下一個視窗的Handle,每次的迴圈值都不一樣, 測試結果出現了好多怪怪的框架,如:SysFader、NetDDE Agent, 而且這些框架都關不掉=.= 我的程式碼如下: void __fastcall TForm1::Button1Click(TObject *Sender) {         HWND hWnd=FindWindow(NULL, "Form1");         HWND hWndPrev;         hWndPrev=GetNextWindow(hWnd, GW_HWNDPREV);         for(int i=0;i<2;i ) // 改變 i 值,看取得的結果 hWndPrev=GetNextWindow(hWndPrev, GW_HWNDPREV); if(hWndPrev!=NULL) { char WCaption[256]; GetWindowText(hWndPrev, WCaption, 255); Label1->Caption=String(WCaption); ShowWindow(hWndPrev, SW_SHOW); BringWindowToTop(hWndPrev); } else Label1->Caption="NULL"; }
solitarygo
一般會員


發表:4
回覆:12
積分:3
註冊:2004-07-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-04 08:35:54 IP:140.127.xxx.xxx 未訂閱
pwipwi您好: 我已經照你的方法去取下一個視窗的Handle,但似乎不是先前的視窗, 我還特地用迴圈一直取下一個視窗的Handle,每次的迴圈值都不一樣, 測試結果出現了好多怪怪的框架,如:SysFader、NetDDE Agent, 而且這些框架都關不掉=.= 我的程式碼如下: void __fastcall TForm1::Button1Click(TObject *Sender) {         HWND hWnd=FindWindow(NULL, "Form1");         HWND hWndPrev;         hWndPrev=GetNextWindow(hWnd, GW_HWNDPREV);         for(int i=0;i<2;i ) // 改變 i 值,看取得的結果 hWndPrev=GetNextWindow(hWndPrev, GW_HWNDPREV); if(hWndPrev!=NULL) { char WCaption[256]; GetWindowText(hWndPrev, WCaption, 255); Label1->Caption=String(WCaption); ShowWindow(hWndPrev, SW_SHOW); BringWindowToTop(hWndPrev); } else Label1->Caption="NULL"; }
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-04 14:31:45 IP:211.76.xxx.xxx 未訂閱
solitarygo你好: 看來你得到的有不少是未顯示的視窗的Handle。可以加入一個判斷式,只選有顯示的視窗來抓。 試著用用IsWindowVisible(Handle)?
solitarygo
一般會員


發表:4
回覆:12
積分:3
註冊:2004-07-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-04 15:15:44 IP:140.127.xxx.xxx 未訂閱
我試過了,還是不行。 程式碼如下: void __fastcall TForm1::Button1Click(TObject *Sender) { HWND hWnd=FindWindow(NULL, "Form1"); HWND hWndPrev; hWndPrev=GetWindow(hWnd, GW_HWNDPREV); if(hWndPrev!=NULL) { while(!IsWindowVisible(hWndPrev))//沒有顯示的視窗排除 hWndPrev=GetWindow(hWndPrev, GW_HWNDPREV); char WCaption[256]; GetWindowText(hWndPrev, WCaption, 255); Label1->Caption=String(WCaption); ShowWindow(hWndPrev, SW_SHOW); BringWindowToTop(hWndPrev); } else Label1->Caption="NULL"; } 結果不知道 handle 的視窗跑哪去了,因為 Label1 是空字串。 請問還有其他的方法嗎?
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-05 01:23:51 IP:211.76.xxx.xxx 未訂閱
我把你的Code修改了一下,試試看能不能運作囉。     
 
        HWND hWnd=FindWindow(NULL, "Form1");
        HWND hWndPrev;
        hWndPrev=GetWindow(hWnd, GW_HWNDFIRST);
        if(hWndPrev!=NULL)
        {
                while(hWndPrev != Application->Handle)//沒有顯示的視窗排除
                        hWndPrev=GetWindow(hWndPrev, GW_HWNDNEXT);
                hWndPrev=GetWindow(hWndPrev, GW_HWNDNEXT);
                char WCaption[256];
                GetWindowText(hWndPrev, WCaption, 255);
                Label1->Caption=String(WCaption);
                ShowWindow(hWndPrev, SW_SHOW);
                SetForegroundWindow(hWndPrev);
        }
        else
                Label1->Caption="NULL";    
solitarygo
一般會員


發表:4
回覆:12
積分:3
註冊:2004-07-30

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-05 09:25:32 IP:140.127.xxx.xxx 未訂閱
可以了ㄟ。^^ 感謝 pwipwi 大大, 不過為什麼 Label1->Caption 出現的字串是 "M" 呢? 不是應該是我的先前視窗的標題嗎? 還有要怎樣才能讓這個視窗 focused ? 我試過 SetForegroundWindow(hWndPrev); 不過沒用, 還有試過 SwitchToThisWindow(hWndPrev,false); 但是編譯時,編譯器說 SwitchToThisWindow 函式沒定義。
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-08-05 10:05:40 IP:211.76.xxx.xxx 未訂閱
1.不過為什麼 Label1->Caption 出現的字串是 "M" 呢? GetWindowText不能取得其他程式的Caption,只能用在自已程式的Control上面。應該要用SendMessage(Handle, WM_GETTEXT, 255, (long)str); 2.還有要怎樣才能讓這個視窗 focused ? http://delphi.ktop.com.tw/topic.php?topic_id=24741
solitarygo
一般會員


發表:4
回覆:12
積分:3
註冊:2004-07-30

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-08-05 11:54:12 IP:140.127.xxx.xxx 未訂閱
我使用了 SendMessage(Handle, WM_GETTEXT, 255, (long)str); 仍舊不能把視窗的標題取出來, 我的程式碼如下: void __fastcall TForm1::Button1Click(TObject *Sender) { HWND hWnd=FindWindow(NULL, "Form1"); HWND hWndPrev; hWndPrev=GetWindow(hWnd, GW_HWNDFIRST); if(hWndPrev!=NULL) { while(hWndPrev != Application->Handle) hWndPrev=GetWindow(hWndPrev, GW_HWNDNEXT); hWndPrev=GetWindow(hWndPrev, GW_HWNDNEXT); char WCaption[256]; memset(WCaption, '\0', 256); SendMessage(hWndPrev, WM_GETTEXT, 255, long(&WCaption[0])); Label1->Caption=(String)WCaption; ShowWindow(hWndPrev, SW_SHOW); BringWindowToTop(hWndPrev); } else Label1->Caption="NULL"; } 請問我上面的做法有錯嗎? 取出來 Label1->Caption 仍然是 "M", 因為我剛學不久,程式碼大部分都是去看別人的程式碼去拼拼湊湊來的。 還有我使用 GetClassName(hWndPrev, WCaption, 1024); 去取出 hWndPrev 的類別名稱,但似乎不是視窗的類別? 取出來的 Label1->Caption 的字串為 "MSCTFIME UI"。
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-08-05 14:36:11 IP:211.76.xxx.xxx 未訂閱
我把所有的Code重寫一下,你試試看合不合乎你的需要。  
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
char WCaption[256];
HWND hWnd = Application->Handle;
do{        if(!(hWnd=GetWindow(hWnd, GW_HWNDNEXT)))
        break;        memset(WCaption, '\0', 256);
    SendMessage(hWnd, WM_GETTEXT, 255, (int)WCaption);        }
while(!(GetWindowLong(hWnd,GWL_STYLE) & WS_BORDER) || !IsWindowVisible(hWnd) || !WCaption[0]);    Label1->Caption = WCaption;
ShowWindow(hWnd, SW_SHOW);
BringWindowToTop(hWnd);
}
M這個視窗好像和輸入法有關係…
solitarygo
一般會員


發表:4
回覆:12
積分:3
註冊:2004-07-30

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-08-05 16:16:51 IP:140.127.xxx.xxx 未訂閱
非常感激 pwipwi 大大, 我就是想要這樣的功能。太感謝了^^
系統時間:2024-05-09 14:23:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!