问题标签 [hwndhost]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1934 浏览

c# - 在 WPF TabControl 中托管外部应用程序

我设法创建了一个示例项目,该项目使用 HwndHost在 C# WPF 选项卡控件中托管记事本(而不是我的真实项目将嵌入的内容)。为此,非常感谢那些回复在 WPF 窗口中托管外部应用程序的人(顺便说一句,不需要 DwayneNeed

此示例运行良好,直到您单击记事本的托管实例,然后尝试更改选项卡。如果您要导航到的新页面中没有任何内容,则必须先单击当前页面选择器,然后它才会接受对另一个选项卡的单击。如果您在其他页面上有内容(任何内容......只是一个按钮),那么您将被迫单击新选项卡选择器 TWICE 以使其导航离开。

我尝试过但不起作用的事情:

  • 使用AttachThreadInput()加入两个应用程序窗口的输入线程。
  • 调用this.InvalidateVisual();Tab Control 鼠标按下事件。

有什么诀窍:

  • 当按下按钮时,以编程方式将TabControl.SelectedIndex值更改为我想要的值。

为了解决这个问题,我想我只需要在选项卡选择器的位置使用按钮(使它们不可见)并以编程方式更改页面。这没什么大不了的,但我只是想知道是否有其他人遇到过这个问题,也许有一个解释!

ps 我对 WPF 和 C# 有点陌生。

0 投票
1 回答
536 浏览

wpf - 将所有键盘和鼠标输入从 wpf-host 应用程序传递到托管的进程外 win32 客户端。(使用 HwndHost)

我有一个旧应用程序(游戏),它从位置 0、0 开始,并且是对话框样式的。不能以常规方式移动它,不能调整大小,非常烦人。我无法访问源代码,只能访问已编译的应用程序。

我使用 HwndHost 以 wpf 形式托管此应用程序,效果很好。非常平滑地调整窗口大小和移动窗口。

麻烦的是我需要所有的键盘和鼠标输入,而我的 wpf 表单具有焦点,才能传递给托管应用程序。

我不需要过滤任何消息或任何其他花哨的东西,只需要我的 wpf 表单变得愚蠢并忽略所有内容,而托管进程获取所有输入。

最好的方法是什么?

由于它不在进程中,我知道这可能会导致一些问题,但我希望那里有一个简单的解决方案。

有趣的是,我确实在托管应用程序中看到了鼠标移动(特别是在应用程序光标中),但它似乎错过了点击和/或键盘输入。

谢谢!

休伦。

0 投票
0 回答
639 浏览

.net - 在 WPF 应用程序中托管多个 HwndHost

我正在使用一个hwndhost元素在 WPF 应用程序中绘制 DirectX 内容。当我覆盖WndProcfor时,HwndHost我确实会被窗口消息调用,但只能由hwndhost我创建的第一个实例调用。

基本上在WM_PAINT消息上我渲染了我的 DirectX 场景并将“ handled”参数标记为 true(我确实检查hwnd传入的WndProc是否是我的句柄)。一旦我将其标记为 true,其他实例都HwndHost不会收到该WM_PAINT消息。

如何让其他HwndHost实例接收WM_PAINT消息?

0 投票
1 回答
373 浏览

wpf - 将鼠标移到右下角时,由于多个 WM_NCHITTEST 导致 WPF 主机 Win32 窗口冻结

我有一个承载 Win32 窗口的 WPF 窗口,我有从 HwndHost 继承的类。

一切似乎工作正常,除非当我将鼠标移到 WPF 窗口的右下角时,窗口冻结。

我使用 Spy++ 来查看发生了什么。事实证明,WPF 窗口每 2-3 秒收到少量 WM_WINDOWPOSCHANGING 消息,而 Win32 窗口一直在接收大量 WM_NCHITTEST。

我该如何解决这个问题?谢谢你。

0 投票
0 回答
706 浏览

wpf - 前一个元素 MouseLeave 事件之前的 wpf HwndHost MouseMove 事件

我们有一个带有 Hwndhost 元素的 Wpf 应用程序,用于通过 DirectX 呈现 3d 内容。我们向包含 MouseEnter 和 MouseLeave 事件的客户端公开一个“Panel”接口。对于 Hwndhost“面板”,我们在第一次收到 HwndHost.WndProc 的 WM_MOUSEMOVE 事件时模拟 MouseEnter 事件,因为 win32 没有 WM_MOUSEENTER 事件。此外,对于 HwndHost,我们通过 TrackMouseEvent() 请求 WM_MOUSELEAVE 事件,该事件在我们的“面板”界面上模拟 MouseLeave 事件。

问题在于,当用户将鼠标快速移动到 HwndHost 面板或从 HwndHost 面板移动时,我们会从鼠标移动到的面板接收到 enter 事件,然后才会收到鼠标移动到的面板的离开事件。 当源面板和目标面板都是 wpf 元素时,这不会发生,只有在涉及 hwndhost 元素时才会发生。此外,如果这些 HwndHost 元素中有两个彼此相邻,则会发生相同的行为,因此看起来 win32 没有按照它们发生的顺序发送消息。

有谁知道解决这个问题的方法? 如果有办法让 Win32 按事件发生的顺序发送事件,那就太好了。

这是一个示例应用程序,它向调试器输出窗口展示了打印消息的问题:

0 投票
1 回答
194 浏览

wpf - WinAPI 复制系统菜单到新窗口

我正在使用 HwndHost 将另一个应用程序的窗口停靠在我的 WPF 窗口中。为此,我必须设置我正在停靠的窗口的 WS_CHILD 样式属性,并且我丢失了该窗口的系统菜单,这是不可接受的。使用 HwndHost 无法解决此问题,因为如果未设置该属性,它将引发异常。

我的问题是;

由于我的应用程序不使用系统菜单,有没有办法直接将停靠的应用程序的系统菜单复制到我的应用程序窗口?我知道的 WinAPI 菜单功能都需要我从头开始构建菜单,我不知道如何将这些菜单连接到托管应用程序中。

我不确定这是否重要,但两个窗口在同一个进程中。我的应用程序是我正在对接的应用程序窗口的插件。

0 投票
0 回答
152 浏览

wpf - 当我在 WPF 控件中托管 Win32 窗口时,我必须处理哪些 Windows 消息?

到目前为止,我只知道我必须监听 WM_CLOSE,这是一个关闭请求,以及 WM_DESTROY,这是关闭后窗口实际销毁的时间。我需要处理这些,因为我需要避免使用关闭的 Win32 窗口出现无用的 Win32 主机视图。

还有其他终止类型的消息吗?我不介意知道托管窗口的模块是否由于某种原因不稳定,这也将迫使我关闭我的主机视图。

0 投票
3 回答
1985 浏览

.net - 如何将 Win32 鼠标消息转换为 WPF 鼠标事件?

我有一个需要嵌入到我们的 WPF 应用程序中的 Win32 (OpenGL) 控件。它必须响应并传播鼠标和键盘事件。

我创建了一个 HwndHost 派生实例来托管本机窗口,并覆盖了此类中的 WndProc 函数。为了向 WPF 传播 win32 消息,我处理特定的鼠标消息并将它们映射到 WPF 事件,然后使用静态 InputManager 类来引发它们。

问题是,当我去处理它们时,鼠标坐标搞砸了。

下面是我用来引发事件的代码示例:

当我的 WPF 事件处理程序被触发并且我尝试检索鼠标坐标(例如e.GetPosition((IInputElement) sender))时,我收到了错误的值(并且无论原始事件在我的控制范围内发生的位置,它们始终是相同的值)。

我得到的值似乎与承载应用程序的 WPF 窗口的屏幕位置有关,因为它们会随着窗口位置的变化而变化,但它们也不对应于应用程序窗口的实际位置。

我认为这可能与 WPF InputManager 的内部状态有关,并且私有字段MouseDevice._inputSourcenull引发我的事件时的事实,但我对 .net 反射的实验在那里没有产生任何结果。

我真的不知道还能尝试什么。键盘支持开箱即用,只是鼠标位置支持我无法正常工作。

0 投票
1 回答
964 浏览

wpf - WPF 中的托管窗口不会收到鼠标消息

比在我的 WPF 应用程序中托管 WinForms 用户控件更进一步,我实际上托管的是 Delphi 表单,即顶级窗口。我通过博客文章How To Host Top-Level HWNDs In WPF中的巫术来做到这一点。

几乎所有东西都能完美运行。我发送了一个在 Delphi 中构建的 COM 服务器,一个菜单路径字符串,它发送回一个窗口句柄,我将它传递给博客中描述的主机控件。Delphi 窗口几乎可以正确接收所有事件(更确切地说是 Windows 消息),而无需我进行任何干预。

唯一的问题是按钮。他们很好地收到了点击事件/消息,并且可以正常工作,但是现在 Delphi 的家伙已经为按钮添加了新图标,并且每个按钮都有一个活动图标、一个悬停图标和一个点击图标。他们没有收到任何应该更改这些图标的消息。为什么除了这些之外几乎所有消息都有效?我可以阅读和/或做些什么来尝试纠正这个问题?

0 投票
2 回答
561 浏览

wpf - 什么呈现 WPF 应用程序中托管的 WinForm 控件?

MSDN 文章中,我发现 WinForm 控件可以使用HwndHost.

另外,从其他互联网资源中,我发现 WPF 是使用 DirectX 呈现的,而 WinForm 是使用 GDI+ 呈现的。

我的问题是,当在 WPF 应用程序中绘制 WinForm 控件时,是什么呈现 WinForm 控件?DirectX、GDI+,还是两者兼而有之?

我对这两种技术和制作婴儿步骤的经验都很少。

谢谢