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

  • 質問

  • Windows7 64bitのパソコンで VS2008で作成しています。
    MFC ActiveX コントロールを64bitでコンパイルしOCXを作り、C#から利用しています。

    キーイベント「OnKeyDownEvent(USHORT nChar, USHORT nShiftState)」
    に矢印キー(VK_UPに対応など)だけが押しても入ってきません。

    32bitでコンパイルしたものは、同コンピュータでチャンと機能しています。

    そういう状況なのですか?
    何か対処できる方法はありますか?
    2014年9月20日 2:34

すべての返信

  • 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コントロールにセットされている状態になっていますか?

    • 回答の候補に設定 星 睦美 2014年9月26日 8:30
    • 回答の候補の設定解除 星 睦美 2014年10月15日 4:12
    2014年9月24日 13:35
  • クサキ さん、こんにちは。
    フォーラム オペレーターの星 睦美です。

    返信からヒントを得られたかも知れませんね。もし質問が解決していない場合は、sygh さんのアドバイスを参考に、詳しい情報を追加いただくとフォーラムの回答者から役立つ回答が集まりやすいと思います。

    ※フォーラムで参考になる情報がありましたら、投稿者からの[回答としてマーク] をお願いします。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2014年9月26日 8:36
  • 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キーなどでも動いています。

    *勘違いで、コメントがずっと無かったと思って、返事が遅くなりましてすみませんでした。

    2014年10月6日 9:36