過去レスにもあったのですが、
上手くいかないので教えてください。
アプリケーションにフォーカスが移った(アクティブ)の場合と
フォーカスが外れた(インアクティブ)の場合を取得しようと
思い、PretransMessage()に以下の記述(抜粋)をしましたが、
取得出来ません。
case WM_ACTIVATE:
if (pMsg->wParam == WA_ACTIVE) {
// アクティブになった場合
a = 1;
}
if (pMsg->wParam == WA_INACTIVE){
// インアクティブになった場合
a = 1;
}
if文にブレーク張っているのですが、case文にすら来ていないようです。
何がいけないのでしょうか?宜しくお願いします。
VC6.0、MFCです。
自己レスです。
書き忘れましたが、ダイアログベースで作ってます。
色々と情報探して、見つけたのがOnActivate()です。
ClassWizardのクラス情報のメッセージフィルタを
「ダイアログ」から「ウィンドウ」に変更すると、
メッセージマップの「メッセージ」にWM_ACTIVATEが
ありましたので、そこで取ることが出来ました。
void CxxxDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CDialog::OnActivate(nState, pWndOther, bMinimized);
int a;
a = 1;
}
メッセージフィルタってなんのためにあるのでしょうか?
「ウィンドウ」に変更しなかったら、WM_ACTIVATEは取れないのでしょうか?
また、やっぱりPreTranslateMessage()では取れないものなのでしょうか?
宜しくお願い致します。
> メッセージフィルタってなんのためにあるのでしょうか?
メッセージはとても数が多いので、いつも全部表示されていると
目的のメッセージを探し出すのが困難になります。
フィルタを使うことで、そのとき気になっている系統の
メッセージだけに絞り込んで表示することができるので、
目的のメッセージを素早く見つけ出すことが可能になります。
例えば、「ダイアログ」の場合は、ダイアログプログラムで
よく使うメッセージだけが表示され、
たまにしか使わないメッセージは表示されません。
これは、ツールの機能なので、プログラムの動作には何の影響も与えません。
> また、やっぱりPreTranslateMessage()では取れないものなのでしょうか?
PreTranslateMessage() で取れるのは PostMessage で送られたメッセージだけです。
どれが Send され、どれが Post されるかは、
ヘルプでは、
The WM_ACTIVATE message is sent to...
The WM_CHAR message is posted to...
のようにさりげなく書き分けられています。
dairygoodsさん。
いつも回答有難うございます。
>>また、やっぱりPreTranslateMessage()では取れないものなのでしょうか?
>PreTranslateMessage() で取れるのは PostMessage で送られたメッセージだけです。
そーだったんですね。納得しました。いままで知りませんでした。
ありがとうございました。解決です。