【问题标题】:Equivalent of PreviewKeyDown of C# needed for native C++/MFC本机 C++/MFC 所需的 C# 的 PreviewKeyDown 等效项
【发布时间】:2009-11-20 13:27:10
【问题描述】:

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

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

【问题讨论】:

    标签: c# c++ event-handling


    【解决方案1】:

    您可以使用 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.
     }
    

    这将每 50 毫秒轮询一次键盘,以查明是否刚刚按下左 alt 键,然后调用您的处理代码。如果你想在处理程序释放时触发它,那么你可以使用下面的 if 语句

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

    或者如果你只是想看看它是否已经关闭,那么你就这样做

     if ( thisLeftAltPress != 0 )
    

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

    【讨论】:

      【解决方案2】:

      感谢您的所有建议。

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

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

      干杯,

      伊尔马里

      【讨论】:

        【解决方案3】:

        我认为你可以使用GetAsyncKeyStateWin32函数(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] 键。

        【讨论】:

          【解决方案4】:

          还没有尝试过,但是 MSDN 并没有说您不会得到 ALT 键的 WM_KEYDOWN —— ALT 按下时按下的任何其他键都会生成 WM_SYSKEYDOWN,但这并没有说你不能通过WM_KEYDOWN处理ALT。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-07-31
            • 1970-01-01
            • 1970-01-01
            • 2013-03-17
            • 1970-01-01
            • 1970-01-01
            • 2010-11-25
            相关资源
            最近更新 更多