C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 特定コントロールのイベントをローカルフック


(過去ログ 89 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■52810 / inTopicNo.1)  特定コントロールのイベントをローカルフック
  
□投稿者/ ホエホエ (12回)-(2010/08/24(Tue) 18:53:00)

分類:[C/C++] 

2010/08/24(Tue) 18:53:34 編集(投稿者)
いつもお世話になっております、ホエホエです。

さて今回はダイアログ上の特定コントロールのフォーカスイベントを
ローカルフックして処理したいと思ってるんですが、関係のない
コントロールのイベント発生時もフックプロシージャーが呼び出しされて
しまいます。

下記のようなソースコードに現在なってます。

HHOOK g_hEditHook = NULL;		//ローカルフックグローバル

//ローカルフック処理部
BOOL CTestPgDlg::OnInitDialog()
{
     CDialog::OnInitDialog();

     //フックしたいエディットコントロールのインスタンスハンドル取得
     HINSTANCE hInst = (HINSTANCE)GetWindowLong( m_cEditCtrl.m_hWnd, GWL_HINSTANCE );

     //ローカルフック設定
     g_hEditHook = SetWindowsHookEx( WH_CALLWNDPROC, (HOOKPROC)EditWndProc, hInst, AfxGetApp()->m_nThreadID );
     return TRUE;
}

//フックプロシージャー
LRESULT CALLBACK CTestPgDlg::EditWndProc( int p_nCode, WPARAM p_wParam, LPARAM p_lParam )
{
     if( p_nCode == HC_ACTION && p_wParam == 0 )
     {
         CWPSTRUCT* pCwp = (CWPSTRUCT*)p_lParam;
         switch( pCwp->message )
         {
              case WM_KILLFOCUS:
                   TRACE( _TEXT("フォーカスロスト!!%X %d\n"), pCwp->hwnd, pCwp->lParam );
                   break;
         }
     }
     return CallNextHookEx( g_hEditHook, p_nCode, p_wParam, p_lParam );
}


どこがおかしいのでしょうか?

ちなみに開発環境がVC++6.0 MFCで、OSはWindowsXPです。

ぜひ教えてください。お願いします。

引用返信 編集キー/
■52813 / inTopicNo.2)  Re[1]: 特定コントロールのイベントをローカルフック
□投稿者/ Hongliang (695回)-(2010/08/24(Tue) 19:48:28)
そういうものなので、CWPSTRUCT::hwnd を使って誰宛てのメッセージなのか確認して下さい。

> g_hEditHook = SetWindowsHookEx( WH_CALLWNDPROC, (HOOKPROC)EditWndProc, hInst, AfxGetApp()->m_nThreadID );
ここで、コントロールを特定する要素は存在してませんよね?
hInst はインスタンス(≒アプリケーション)のハンドルですよ。
引用返信 編集キー/
■52829 / inTopicNo.3)  Re[1]: 特定コントロールのイベントをローカルフック
□投稿者/ オショウ (553回)-(2010/08/25(Wed) 08:25:53)
> さて今回はダイアログ上の特定コントロールのフォーカスイベントを
> ローカルフックして処理したいと思ってるんですが、関係のない
> コントロールのイベント発生時もフックプロシージャーが呼び出しされて
> しまいます。

  なぜ、わざわざフックするんですか?
  特定コントロールだけの処理をしたいのであれば、サブクラス化で
  問題ないのでは・・・

  それともフックしてサブクラス化でできない何か処理を行いたいと
  言うことですか?

  何をしたいか解らないので、フックが適切なのかどうか・・・
  解りません。

以上。
引用返信 編集キー/
■52831 / inTopicNo.4)  Re[2]: 特定コントロールのイベントをローカルフック
□投稿者/ ホエホエ (13回)-(2010/08/25(Wed) 09:28:10)
Hongliangさん>
ご返信ありがとうございます。

なるほど、てっきりhInstにウィンドウのインスタンスハンドルを渡せば
そのウィンドウ(コントロール)をフックできるのかと思ってました。


オショウさん>
ご返信ありがとうございます。

目的としてはダイアログ上に動的に通常のダイアログコントロールを
追加・減少配置しそれらのコントロールのイベントを親のダイアログで
処理したいと思いまして…

動的生成コントロールなので、普通にメッセージマップでハンドラを
追加できないのでフックなのかなぁ〜と思ったんですが他に良い方法が
あるならフックには全然こだわっていません。

ぜひよろしくお願いします。

引用返信 編集キー/
■52832 / inTopicNo.5)  Re[3]: 特定コントロールのイベントをローカルフック
□投稿者/ オショウ (554回)-(2010/08/25(Wed) 09:38:23)
> 目的としてはダイアログ上に動的に通常のダイアログコントロールを
> 追加・減少配置しそれらのコントロールのイベントを親のダイアログで
> 処理したいと思いまして…

  動的に追加でしたか、
  できないこともなかったような・・・

  検索してみたら、こんなのありました。
  http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200712/07120040.txt

  動的と言っても、追加できるコントロールの種類は結局用意しておかないと
  いけないので・・・そういう方法もありかと。

以上。参考まで
引用返信 編集キー/
■52836 / inTopicNo.6)  Re[4]: 特定コントロールのイベントをローカルフック
□投稿者/ ホエホエ (14回)-(2010/08/25(Wed) 10:59:18)
オショウさん>
ご返信ありがとうございます。

結局、フックを使っての方法は断念して、
教えていただいた方法で解決できました!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -