PreTranslateMessageで、WM_MOUSEMOVE、WM_LBUTTONDOWN、WM_RBUTTONDOWNを検出しようとしていますが
Picture Control 上にあるカーソルの検出が出来ずに困っています。
PreTranslateMessageではコントロール上のWM_MOUSEMOVE等は検出出来ないようですが何か良い手は無いのでしょうか?
当方の環境はVC2003 WinXPです
Picture Controlのプロパティ Notify を trueではだめですか?
情報ありがとうございます。
>Picture Controlのプロパティ Notify を trueではだめですか?
Notify は true となっています。
引き続き何かありましたら宜しくお願いします
当方の環境だと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
お手数おかけしてます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等の検出処理が必要なようですね。
もう少し調べてみます
put_WindowStyleとはなんでしょう。
>WS_CHILD があるのでPicture Control 上に子ウィンドウが表示されて
いて検出できてないようです。
>子ウィンドウ側でWM_MOUSEMOVE等の検出処理が必要なようですね。
提示のコードでは関係が全然分からないので頑張って下さい。としか。
> 子ウィンドウ側で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
ツイート | ![]() |