.net C++/CLI:互操作窗口配置不正确
我正在尝试使用类在C++/CLI应用程序中加载WPF控件 我定义了一个钩子函数,以便将键盘事件传递到窗口:.net C++/CLI:互操作窗口配置不正确,.net,wpf,c++-cli,interop,.net,Wpf,C++ Cli,Interop,我正在尝试使用类在C++/CLI应用程序中加载WPF控件 我定义了一个钩子函数,以便将键盘事件传递到窗口: IntPtr MyWindowWrapper::MessageHookFunction( IntPtr HWnd, int Msg, IntPtr WParam, IntPtr LParam, bool% OutHandled ) { IntPtr Result = (IntPtr)0; OutHandled = false; if( Msg ==
IntPtr MyWindowWrapper::MessageHookFunction( IntPtr HWnd, int Msg,
IntPtr WParam, IntPtr LParam, bool% OutHandled ) {
IntPtr Result = (IntPtr)0;
OutHandled = false;
if( Msg == WM_GETDLGCODE ) {
OutHandled = true;
// This tells Windows that we'll need keyboard events for this control
Result = IntPtr( DLGC_WANTALLKEYS | DLGC_WANTCHARS | DLGC_WANTMESSAGE );
}
return Result;
}
以下是我的问题:
- 窗口标题为空(因此不考虑“WindowName”参数)
- 只传输一些键盘事件:空格、控件、箭头都可以,但我无法在所有文本框中键入任何字符
我做错了什么?关于空标题-这是因为
HwndSource
窗口的名称与窗口标题无关。上面代码创建的HwndSource
窗口是由InParentWindowHandle
表示的窗口的子窗口。此窗口的文本用于标题栏。您应该使用该HWND
调用SetWindowText()
,以设置窗口的标题
至于键入问题,您确定需要添加挂钩吗?我只创建了带有WPF/Win32集成的小型测试应用程序,但我不记得需要做任何特殊的事情来确保WPF控件接收到所有键盘输入。存在一个问题
总结:
由于实现细节的原因,
WM_CHAR
消息在到达您的控件之前会被函数中模式对话框的消息泵吞没。您可以通过在钩子函数中处理WM_GETDLGCODE
并返回DLGC\u WANTCHARS
来强制自己检索这些,我实际上使用一个新的空项目进行了一些测试,似乎键盘事件在不需要钩子的情况下传输。所以它一定来自其他地方。。。也许它来自WxWidgets。关于标题,是的,我注意到HwndSource在我的测试项目中作为Hwnd窗口的子窗口附加,而它在主窗口中创建了一个全新的窗口。因此,在我的例子中,似乎附加HwndSource会自动创建一个窗口,我不知道为什么。谢谢你的回复,我想HwndSource总是会创建一个新窗口——这就是它的工作原理。
IntPtr MyWindowWrapper::MessageHookFunction( IntPtr HWnd, int Msg,
IntPtr WParam, IntPtr LParam, bool% OutHandled ) {
IntPtr Result = (IntPtr)0;
OutHandled = false;
if( Msg == WM_GETDLGCODE ) {
OutHandled = true;
// This tells Windows that we'll need keyboard events for this control
Result = IntPtr( DLGC_WANTALLKEYS | DLGC_WANTCHARS | DLGC_WANTMESSAGE );
}
return Result;
}