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

如何抓住視窗當前的數據來抓取字串(Msg,Handle,Hinstance,Wparm......)

尚未結案
fatming
一般會員


發表:10
回覆:7
積分:3
註冊:2004-09-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-01 12:23:04 IP:61.221.xxx.xxx 未訂閱
不知道是否有什麼方法可以在BCB抓住目前視窗(或整個windows)發生的狀態 例如 WM_KEYDOWN,WM_IME_COMPOSITION訊息...等 小弟目前是用這個函式但是只能抓到關視窗跟畫圖的狀況 void __fastcall TForm1::WndProc(TMessage &Message) {.........} 有點懷疑這個TMessage真的有用嗎=.=" 不知道是不是因為視窗的焦點並不是在FORM上面的緣故(拉了一個edit元件) 參考了很多自行定義IME抓取字串的範例但是仍然不得其解 就是抓不到目前的狀態 請各位大大幫忙解救無能的小弟m(_ _)m
m8815010
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-04 01:31:36 IP:203.67.xxx.xxx 未訂閱
引言: 不知道是否有什麼方法可以在BCB抓住目前視窗(或整個windows)發生的狀態 例如 WM_KEYDOWN,WM_IME_COMPOSITION訊息...等 小弟目前是用這個函式但是只能抓到關視窗跟畫圖的狀況 void __fastcall TForm1::WndProc(TMessage &Message) {.........} 有點懷疑這個TMessage真的有用嗎=.=" 不知道是不是因為視窗的焦點並不是在FORM上面的緣故(拉了一個edit元件) 參考了很多自行定義IME抓取字串的範例但是仍然不得其解 就是抓不到目前的狀態 請各位大大幫忙解救無能的小弟m(_ _)m
fatming你好: 不知道你是什麼訊息抓不到,如果是這兩個的話: >? 下例 class="code"> In Unitl.h ~~ class TForm1 : public TForm { __published: // IDE-managed Components void __fastcall FormCreate(TObject *Sender); private: // User declarations //這兩個用做攔Form上的訊息用 TWndMethod OldFormWndProc; void __fastcall FormWndProc(TMessage& Message); //這個用作攔Application上的訊息用 void __fastcall AppMessage(tagMSG &Msg,bool &Handled); public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; In Unit1.cpp ~~ TForm1 *Form1; int i=0; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { OldFormWndProc=this->WindowProc; this->WindowProc=FormWndProc; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormWndProc(TMessage& Message) { //if (Message.Msg==WM_KEYDOWN) { // i ; // this->Caption=i; //} if (Message.Msg==WM_IME_COMPOSITION) { <--Form可以攔到 i ; this->Caption=i; } OldFormWndProc(Message); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Application->AppMessage; } //--------------------------------------------------------------------------- void __fastcall TForm1::AppMessage(tagMSG &Msg,bool &Handled) { if (Msg.message==WM_IME_COMPOSITION) { <--Application也可以攔到 i ; this->Caption=i; } } 以WM_KEYDOWN來說,你如果攔不到的話,那問題就應該是如你說的拉了一個TEdit元件的關係吧!因為如果這時是Edit元件被focus的話,那這時如果產生了WM_KEYDOWN訊息(有人按下了鍵盤),則這個訊息會被傳到Edit元件,也就是你要去Edit攔才攔的到這訊息,去Form攔當然是攔不到的! 另外WM_IME_COMPOSITION訊息比較特殊,但也是可以攔的到的!查了一下這訊息是操作者在這輸入法輸入時,每按一個鍵就會觸發一次的!如下圖嘸蝦米輸入法時,key in 兩個's',則這訊息會觸發兩次...依此類推! 而這個訊息不管你針對Form上的那一個元件做輸入時,都會被送給Form,所以只能去Form攔!但查了一下Help,發現說明是說這訊息會送給Application,所以我試著去Application攔,發現也行,所以我的範例中有在Form中和Application中攔訊息的寫法(注意兩著是不同的意義!) [red]Conclusion: 1. 需仔細查閱說明,看某一個訊息是怎麼觸發和觸發後會傳給誰,這樣才可以正確的攔到該訊息! 2. 我範例攔法可能和fatming你的寫法不同,但不影響!有需更多這方面的資訊可自行查站上的文章! 3. 一般很多人都用VC 提供的一個Spy功能去攔訊息,以省去寫程式去攔的不便性,這樣比較快!使用方法如有問題就請自行查閱了! All,參著參著! 發表人 -
fatming
一般會員


發表:10
回覆:7
積分:3
註冊:2004-09-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-05 21:21:17 IP:203.67.xxx.xxx 未訂閱
感謝大大的指導m(_ _)m 文件看太少了會努力加把勁的!!
系統時間:2024-11-22 22:17:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!