Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 相当于本机C+所需的C的PreviewKeyDown+/MFC_C#_C++_Event Handling - Fatal编程技术网

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

C# 相当于本机C+所需的C的PreviewKeyDown+/MFC,c#,c++,event-handling,C#,C++,Event Handling,我在C#Forms应用程序中使用了一个ActiveXControl,并且有可能为该ActiveXControl实现一个PreviewKeyDown事件处理程序。这是指定(例如,[ALT]键)为输入键所需的 由于某些原因,我不得不用本机C++/MFC重新实现应用程序,不知道如何指定此[ALT]键为输入键,并由ActiveXControl处理。我认为您可以使用GetAsyncKeyStateWin32函数()来获取系统中所有键的状态,VK_菜单()是您应该监视的[Alt]键 我认为您可以使用GetA

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


由于某些原因,我不得不用本机C++/MFC重新实现应用程序,不知道如何指定此[ALT]键为输入键,并由
ActiveXControl

处理。我认为您可以使用
GetAsyncKeyState
Win32函数()来获取系统中所有键的状态,
VK_菜单
()是您应该监视的[Alt]

我认为您可以使用
GetAsyncKeyState
Win32函数()获取系统中所有键的状态,
VK_菜单
()是您应该监视[Alt]键的键

没有尝试过这个,但MSDN并没有说你不会得到ALT键的
WM\u KEYDOWN
——当ALT键按下时,任何其他键都会生成一个
WM\u SYSKEYDOWN
,但这并不是说你不能通过
WM\u KEYDOWN
来处理ALT键,但是MSDN并没有说你不会得到ALT键的
WM\u KEYDOWN
——当ALT键按下时,任何其他键都会生成一个
WM\u SYSKEYDOWN
,但这并不是说你不能通过
WM\u KEYDOWN

来处理ALT。你可以使用SetTimer每秒生成20次左右的WM\u 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 )

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

您可以使用SetTimer每秒生成20次左右的WM_定时器事件

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 )

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

感谢您的所有建议

对于我的案例,我终于找到了一些方法来让它发挥作用。到目前为止,我所了解到的情况是,在发送KeyDown消息之前会触发PreviewKeyDown事件

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

干杯


伊尔马里

谢谢你的推荐

对于我的案例,我终于找到了一些方法来让它发挥作用。到目前为止,我所了解到的情况是,在发送KeyDown消息之前会触发PreviewKeyDown事件

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

干杯

伊尔马里