Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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# 嵌入Outlook中的WPF控件未按退格键和空格键_C#_Winapi_Outlook_Vsto - Fatal编程技术网

C# 嵌入Outlook中的WPF控件未按退格键和空格键

C# 嵌入Outlook中的WPF控件未按退格键和空格键,c#,winapi,outlook,vsto,C#,Winapi,Outlook,Vsto,我正在使用以下示例将WPF控件嵌入Outlook阅读窗格: 但在C#中 我使用的窗口样式 _hwndSource = new HwndSource(0, (int) (WindowStyles.WS_CHILD | WindowStyles.WS_VISIBLE | WindowStyles.WS_TABSTOP | WindowStyles.WS_CLIPCHILDREN), (int)WindowStylesEx.WS

我正在使用以下示例将WPF控件嵌入Outlook阅读窗格:

但在C#中

我使用的窗口样式

    _hwndSource = new HwndSource(0,
        (int) (WindowStyles.WS_CHILD | WindowStyles.WS_VISIBLE | WindowStyles.WS_TABSTOP | 
               WindowStyles.WS_CLIPCHILDREN),
        (int)WindowStylesEx.WS_EX_CONTROLPARENT, 
        0, 0,
        TopPaneWindowClass, hWndParent);

    View.Loaded += _view_Loaded;
    _hwndSource.RootVisual = View;
    _hwndSource.SizeToContent = SizeToContent.Height;
它工作得很好,除了我的控件中的文本框缺少一些键(空格和退格)-它们被转换为outlook邮件列表(在空格上,它转到下一项)。 我已尝试将钩子添加到HwndSource并处理WM_GETDLGCODE:

_hwndSource.AddHook(ChildHwndSourceHook);
但它没有收到这条消息。它接收WM_KEYDOWN和WM_keydup消息。但我如何才能正确地将其传递给WPF控件? 此外,我可以看到WM_SETFOCUS、WM_GETOBJECT、WM_NCHITTEST、WM_SETCURSOR和一些代码为C131的消息


编辑:这是VSTO加载项(进程内),因此WPF控件与Outlook在同一线程中工作。

您需要设置
WH\u GETMESSAGE
hook
(setWindowshookxw(WH\u GETMESSAGE,…)
)然后使用
TranslateMessage
/
SendMessage

@IInspectable感谢链接,但我使用加载项工作-因此这是相同的过程和线程。您的意思是将这些消息重新发送到具有键盘焦点的确切控件?因为我在HwndSource中宿主的WPF usercontrol上接收它们。顺便说一句,你能不能也说出我们希望用这种方式在Outlook中解决的其他问题?你做过这样的事吗?我知道你是一位伟大的前景专家。:)我的意思是,如果我使用AddHook来钩住承载我的控件的HwndSource,我可以看到这些消息,但WPF控件不会接收它们。或者你建议使用全局键盘挂钩?你不需要键盘挂钩。这条消息会起什么作用。处理传入消息时,请检查控件句柄(HWND)以查看它是否是您的控件,如果是,请使用TranslateMessage/SendMessage将消息直接发送到您的控件。否则,Outlook将吃掉它们。