質問者
MFC ActiveX コントロールが64bitでのコンパイルで、キーイベントに矢印キーがは入らない。

質問
すべての返信
-
ActiveXコントロールはいったいどういったものを作っているのですか? COleControl派生クラスだけですか? それともその上にダイアログか何かを貼り付けているのですか? ダイアログにはどんなコントロールが置かれていますか?
また、C#側のアプリケーションはWindows Formsですか? WPFですか? ActiveXコントロールの他に何かコントロールを置いていますか?
質問するときは最低限、第三者が状況を正しく理解し、現象を再現できる十分な情報(できればソースコード)を提供するべきです。情報を隠したままで回答が得られると思うのは虫が良すぎます。
なお、COleControlだけの単純なActiveXコントロール(MFC ActiveX コントロール ウィザードでは何も変更しない)をWindows Formsアプリケーションにて利用するテストコードを書いてみましたが、32bit/64bitともにCOleControl::OnKeyDownEvent()はコールバックされませんでした。代わりに、PreTranslateMessage()をオーバーライドし、WM_KEYDOWNを直接捕捉することはできています。
BOOL CMfcActiveXSampleACtrl::PreTranslateMessage(MSG* pMsg) { // TODO: ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。 if (pMsg->message == WM_KEYDOWN) { // ActiveX コントロールがフォーカスを受け取っていれば、WM_KEYDOWN は受信できるはず。 switch (pMsg->wParam) { case VK_LEFT: case VK_RIGHT: case VK_UP: case VK_DOWN: // TODO: Add your code here. break; default: break; } } return COleControl::PreTranslateMessage(pMsg); }
キー入力をテストするとき、フォーカスはきちんとそのActiveXコントロールにセットされている状態になっていますか?
-
C++側は、何も貼り付けていません。
COleControl派生クラスだけだと思います。
class COpGLApp : public COleControlModule
コードは以下のようになります。
void COpGLCtrl::OnKeyDownEvent(USHORT nChar, USHORT nShiftState) { if (nChar == VK_NUMPAD1) { m_xRotate -= m_rotateNotch; if (m_xRotate == 360) m_xRotate = 0.0f; } // -- if (nChar == VK_UP || nChar == VK_F6 ) { m_xRotate -= m_rotateNotch; if (m_xRotate <= -360) m_xRotate = 0.0f; } else if (nChar == VK_DOWN || nChar == VK_F5 ) { m_xRotate += m_rotateNotch; if (m_xRotate >= 360) m_xRotate = 0.0f; } else if (nChar == VK_RIGHT || nChar == VK_F2 ) { m_yRotate += m_rotateNotch; if (m_yRotate >= 360) m_yRotate = 0.0f; } else if (nChar == VK_LEFT || nChar == VK_F1 ) { // 2014.9 m_yRotate -= m_rotateNotch; if (m_yRotate <= -360) m_yRotate = 0.0f; } // -- else if (nChar == VK_NEXT) { m_zRotate -= m_rotateNotch; if (m_zRotate <= -360) m_zRotate = 0.0f; } else if (nChar == VK_PRIOR) { m_zRotate += m_rotateNotch; if (m_zRotate >= 360) m_zRotate = 0.0f; } else if (nChar == VK_SPACE) { m_xRotate = 0.0f; m_yRotate = 0.0f; m_zRotate = 0.0f; } Invalidate(FALSE); FireChangedRotate(); // 角度が変更になったことをコンテナに伝える COleControl::OnKeyDownEvent(nChar, nShiftState); }
C#側のアプリケーションはWindows Formsです。
*勘違いで、コメントがずっと無かったと思って、返事が遅くなりましてすみませんでした。
ActiveXコントロールの他にテキストボックスとボタンを置いています。
キー入力をテストするとき、フォーカスはActiveXコントロールにセットしています。
他のキーや、今回とりあえずの対処で作った、F1キーなどでも動いています。