PreTranslateMessageでWM_MOUSEMOVEが検出できない


danger  2009-02-23 23:15:18  No: 69733

PreTranslateMessageで、WM_MOUSEMOVE、WM_LBUTTONDOWN、WM_RBUTTONDOWNを検出しようとしていますが
Picture Control 上にあるカーソルの検出が出来ずに困っています。
PreTranslateMessageではコントロール上のWM_MOUSEMOVE等は検出出来ないようですが何か良い手は無いのでしょうか?

当方の環境はVC2003 WinXPです


りり  2009-02-24 00:21:24  No: 69734

Picture Controlのプロパティ Notify を trueではだめですか?


danger  2009-02-24 00:56:27  No: 69735

情報ありがとうございます。

>Picture Controlのプロパティ Notify を trueではだめですか?
Notify は true となっています。

引き続き何かありましたら宜しくお願いします


りり  2009-02-24 01:47:10  No: 69736

当方の環境だとNotifyのfalse/trueでWM_MOUSEMOVEのhwndが
変わりました。
新規でプロジェクト作ってもだめでしょうか?

BOOL ChogeDlg::PreTranslateMessage(MSG* pMsg)
{
  if(pMsg->message == WM_MOUSEMOVE) {
    TRACE("MOUSEMOVE %x\n",pMsg->hwnd);
  }
  if(pMsg->message == WM_LBUTTONDOWN) {
    TRACE("WM_LBUTTONDOWN %x\n",pMsg->hwnd);
  }
  if(pMsg->message == WM_RBUTTONDOWN) {
    TRACE("WM_RBUTTONDOWN %x\n",pMsg->hwnd);
  }

  return CDialog::PreTranslateMessage(pMsg);
}

VS2003 Win2000


danger  2009-02-24 02:13:13  No: 69737

お手数おかけしてますm(_ _)m

新規プロジェクトでは問題ありませんでした
そこで再度ソースを確認したところ以下の記述がありました

HWND hPict = NULL;
GetDlgItem( IDC_PIC, &hPict );

RECT rc;
::GetWindowRect( hPict, &rc );

中略

pWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);

WS_CHILD があるのでPicture Control 上に子ウィンドウが表示されていて検出できてないようです。
子ウィンドウ側でWM_MOUSEMOVE等の検出処理が必要なようですね。

もう少し調べてみます


りり  2009-02-24 08:07:11  No: 69738

put_WindowStyleとはなんでしょう。

>WS_CHILD があるのでPicture Control 上に子ウィンドウが表示されて
いて検出できてないようです。
>子ウィンドウ側でWM_MOUSEMOVE等の検出処理が必要なようですね。

提示のコードでは関係が全然分からないので頑張って下さい。としか。


gak  2009-02-25 02:13:59  No: 69739

> 子ウィンドウ側でWM_MOUSEMOVE等の検出処理が必要なようですね
いや。PreTranslateMessage は”PreTranslateMessage を実行したウィンドウの子ウィンドウに
対して投げられたメッセージ”も検出できる。
けど、如何なる条件下であっても検出できるわけじゃない。例えば↓ケース等では×。

a、子ウィンドウが別スレッドに所属している
   ※ この場合、トップレベル(AfxGetMainWnd()で取れる)ウィンドウでのみ検出可
b、子ウィンドウが所属しているスレッドが MFC 機構(CWinThread)で構築されていない

> pWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
DirectShow を利用して動画再生とかしてない?
この処理って IVideoWindow::put_WindowStyle() だと思われる。

以降は”DirectShowを使用している”という仮定を前提にして書く。仮定が偽ならスルーして。

DirectShow を極一般的な形で利用して動画再生を行った場合、以下の様な処理が行われる。
1、DirectShow 関連処理を行うため用の独自スレッド(!MFC)を(DirectShow 自身が)構築
2、再生した動画を表示するため用のウィンドウ(独自スレッドに所属)を構築
3、動画再生

> Picture Control 上に子ウィンドウが表示
この子ウィンドウは ↑の[2] 処理で作成されたウィンドウではないかと推測される。
仮にそうだった場合、
→ このウィンドウが所属するスレッドは ↑[1] のスレッド
→ [1] のスレッド は ↑[b] ケースに該当する。
→ PreTranslateMessage でメッセージを拾えない。
となる。

> 何か良い手
IVideoWindow::put_MessageDrain() で対応可能と思われ。
http://msdn.microsoft.com/ja-jp/library/cc369762.aspx


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加