fatming
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表: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
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:99 回覆:372 積分:289 註冊:2003-11-13
發送簡訊給我
|
引言:
不知道是否有什麼方法可以在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
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:10 回覆:7 積分:3 註冊:2004-09-30
發送簡訊給我
|
感謝大大的指導m(_ _)m
文件看太少了會努力加把勁的!!
|