相当于本地C ++ / MFC所需的C#PreviewKeyDown

时间:2009-11-20 13:27:10

标签: c# c++ event-handling

我在C#Forms应用程序中使用了ActiveXControl,并且有可能为PreviewKeyDown实现ActiveXControl事件处理程序。这需要指明,例如, [ALT]键是输入键。

由于某些原因或其他原因,我必须在本机C ++ / MFC中重新实现该应用程序,并且不知道如何指定此[ALT]键是输入键并由ActiveXControl处理。 / p>

4 个答案:

答案 0 :(得分:0)

我认为您可以使用GetAsyncKeyState Win32函数(http://msdn.microsoft.com/en-us/library/ms646293%28VS.85%29.aspx)来获取系统中所有密钥的状态,VK_MENUhttp://msdn.microsoft.com/en-us/library/dd375731%28v=vs.85%29.aspx)是您应该监控 [Alt] 键的密钥。

答案 1 :(得分:0)

没有试过这个,但是MSDN并没有说你不会得到WM_KEYDOWN ALT键 - 在ALT关闭时按下任何其他键会产生WM_SYSKEYDOWN,但是这并不表示您无法通过WM_KEYDOWN处理ALT。

答案 2 :(得分:0)

您可以使用SetTimer每秒生成20次WM_TIMER事件

SetTimer( NULL, kMyTimer, 50, MyTimerCallback );

然后实现如下函数。

 void CALLBACK MyTimerCallback( HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime )
 {
      static short lastLeftAltPress = 0;
      short thisLeftAltPress = GetAsyncKeyState( VK_LMENU );
      if ( thisLeftAltPress != 0 && lastLeftAltPress == 0 )
      {
           CallAltHandlingCode();
      }
      thisLeftAltPress = lastLestAltPress;

      // Handling code for other keys goes here.
 }

然后,这将每隔50ms轮询一次键盘,以确定是否刚刚按下了左侧的Alt键,然后调用您的处理代码。如果要在释放处理程序时触发处理程序,则使用以下if语句

 if ( thisLeftAltPress == 0 && lastLeftAltPress != 0 )

或者如果您只想查看它是否已关闭,那么

 if ( thisLeftAltPress != 0 )

GetAsyncKeyState的文档确实说明你可以检查是否设置了最低位以查看该键是否刚被按下,但它也指出这可能会在多线程环境中以意外方式失败。上述方案应始终有效。

答案 3 :(得分:0)

感谢你的所有建议。

对于我的情况,我终于找到了一些如何使它工作的方法。到目前为止,我了解到的情况是在发送KeyDown消息之前触发了PreviewKeyDown事件。

我在托管ActiveX控件的对话框中实现了PreTranslateMessage,并使用ActiveX控件的句柄调用:: SendMessage(WM_KEYDOWN ...),使用pMsg作为参数。

干杯,

ILMARI