如何抓住視窗當前的數據來抓取字串(Msg,Handle,Hinstance,Wparm......) |
尚未結案
|
fatming
一般會員 發表:10 回覆:7 積分:3 註冊:2004-09-30 發送簡訊給我 |
不知道是否有什麼方法可以在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 發送簡訊給我 |
引言: 不知道是否有什麼方法可以在BCB抓住目前視窗(或整個windows)發生的狀態 例如 WM_KEYDOWN,WM_IME_COMPOSITION訊息...等 小弟目前是用這個函式但是只能抓到關視窗跟畫圖的狀況 void __fastcall TForm1::WndProc(TMessage &Message) {.........} 有點懷疑這個TMessage真的有用嗎=.=" 不知道是不是因為視窗的焦點並不是在FORM上面的緣故(拉了一個edit元件) 參考了很多自行定義IME抓取字串的範例但是仍然不得其解 就是抓不到目前的狀態 請各位大大幫忙解救無能的小弟m(_ _)mfatming你好: 不知道你是什麼訊息抓不到,如果是這兩個的話: >? 下例 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |