Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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
.net C++/CLI:互操作窗口配置不正确_.net_Wpf_C++ Cli_Interop - Fatal编程技术网

.net C++/CLI:互操作窗口配置不正确

.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 ==

我正在尝试使用类在C++/CLI应用程序中加载WPF控件

我定义了一个钩子函数,以便将键盘事件传递到窗口:

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;
}