C# 相当于本机C+所需的C的PreviewKeyDown+/MFC
我在C#Forms应用程序中使用了一个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
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作为参数
干杯
伊尔马里