アクティブ・非アクティブの判別方法

[戻る]
める 2005/08/31(水) 09:34:23
過去レスにもあったのですが、
上手くいかないので教えてください。

アプリケーションにフォーカスが移った(アクティブ)の場合と
フォーカスが外れた(インアクティブ)の場合を取得しようと
思い、PretransMessage()に以下の記述(抜粋)をしましたが、
取得出来ません。

case WM_ACTIVATE:
if (pMsg->wParam == WA_ACTIVE) {
    // アクティブになった場合
    a = 1;
}
if (pMsg->wParam == WA_INACTIVE){
    // インアクティブになった場合
    a = 1;
}

if文にブレーク張っているのですが、case文にすら来ていないようです。
何がいけないのでしょうか?宜しくお願いします。
VC6.0、MFCです。

める 2005/08/31(水) 09:46:37
自己レスです。

書き忘れましたが、ダイアログベースで作ってます。
色々と情報探して、見つけたのが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()では取れないものなのでしょうか?
宜しくお願い致します。

dairygoods 2005/08/31(水) 10:28:35
> メッセージフィルタってなんのためにあるのでしょうか?

メッセージはとても数が多いので、いつも全部表示されていると
目的のメッセージを探し出すのが困難になります。
フィルタを使うことで、そのとき気になっている系統の
メッセージだけに絞り込んで表示することができるので、
目的のメッセージを素早く見つけ出すことが可能になります。

例えば、「ダイアログ」の場合は、ダイアログプログラムで
よく使うメッセージだけが表示され、
たまにしか使わないメッセージは表示されません。

これは、ツールの機能なので、プログラムの動作には何の影響も与えません。


> また、やっぱりPreTranslateMessage()では取れないものなのでしょうか?

PreTranslateMessage() で取れるのは PostMessage で送られたメッセージだけです。
どれが Send され、どれが Post されるかは、
ヘルプでは、

The WM_ACTIVATE message is sent to...
The WM_CHAR message is posted to...

のようにさりげなく書き分けられています。

める 2005/08/31(水) 10:56:37
[[解決]]
dairygoodsさん。
いつも回答有難うございます。

>>また、やっぱりPreTranslateMessage()では取れないものなのでしょうか?
>PreTranslateMessage() で取れるのは PostMessage で送られたメッセージだけです。

そーだったんですね。納得しました。いままで知りませんでした。
ありがとうございました。解決です。

古いスレッドには追加発言できません。