问题标签 [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 回答
769 浏览

wpf - 如何更改 WPF HwndHost 内的窗口背景?

我在 WPF 应用程序中创建了一个从 HwndHost 派生的控件。HwndHost 派生控件位于 UserControl 内。

我希望能够设置在 HwndHost 中创建的窗口的背景颜色(默认为白色,我希望它为黑色)。最简单的方法是什么?

0 投票
0 回答
942 浏览

c# - 将 WM_INPUT 键盘消息发送到 HWNDHOST 应用程序

我还是 C# 和 WPF 的新手,作为学习练习,我正在非托管 win32 C++ 应用程序的 WPF 中构建一个简单的包装器。HWNDHOST我目前在 WPF 控件中使用托管的非托管应用程序,并且正在接收WM_INPUT鼠标输入消息,但是当涉及键盘输入时,我只接收WM_KEYUP/DOWN键盘消息但没有WM_INPUT消息。

不幸的是,托管应用程序独占使用键盘输入系统RawInput的消息,因此需要WM_INPUT消息才能运行。

用于托管应用程序的 C# 代码如下:

谁能告诉我为什么WM_INPUT没有为托管应用程序生成键盘消息以及如何/如果我可以纠正它?

0 投票
0 回答
400 浏览

wpf - 使用鼠标移动(拖动)HwndHost

这就是我想要完成的任务 - 在 WPF 中创建一个 MDI 应用程序,它可以托管子 Web 应用程序。我正在使用 WPF webbrowser 控件来呈现 web 应用程序。WPF 本身似乎不支持 MDI 应用程序,所以经过一番搜索,我找到了这个项目,它使用 UI 控件来模拟窗口并在 WPF 画布中管理它们。在我开始将 webbrowser 控件对象添加为 MDI 子对象之前,这种方法似乎工作得相当好。

当我将 webbrowser 控件添加为 MDI 子控件时,它始终出现在其他 WPF 元素之上,包括其他 MDI 子控件(如下所示)。据我了解,webbrowser 控件始终出现在除窗口(和弹出窗口)之外的任何其他 WPF 对象之上。假设这是真的,我认为我需要使用实际的 WPF 窗口来避免重叠问题。

在此处输入图像描述

我现在能想到的唯一解决方案是将 WPF 窗口包装在 HwndHost 对象中,然后将其添加为 MDI 子对象。但是,子窗口似乎不能有标题栏。这意味着我需要一个具有虚拟标题栏区域(就像实际窗口标题栏一样)和实际内容区域(将显示 webbrowser 控件)的窗口,如下所示(红色边框是 HwndHost 对象)。

在此处输入图像描述

这种方法似乎解决了重叠问题。我需要尝试的下一件事是让用户单击虚拟标题栏并将 MDI 窗口拖动到画布元素内。

问题 -

  1. 我对 WPF 网络浏览器控制重叠行为的理解正确吗?如果没有,我错过了什么?
  2. 第二种方法是朝着实现我想要的正确方向迈出的一步吗?如果是,我如何实现 HwndHost 的拖动行为?
  3. 我可以尝试其他替代解决方案吗?

笔记:

  1. 尽管许多人认为 MDI 不是一个优雅的解决方案,但我别无选择。(我们尝试了诸如选项卡式窗口/可停靠窗口之类的替代解决方案,但没有受到好评)

  2. 我对互操作编程很陌生,并且不太了解这些概念。如果我对事情有误解,请纠正我。

谢谢!

0 投票
3 回答
5164 浏览

c# - 使用 HwndHost 在 WPF 中托管外部窗口的正确方法

我想在我的 WPF 应用程序中托管一个外部进程的窗口。我是HwndHost这样得出的:

并像这样使用它:

handle我想托管的外部窗口的句柄在哪里,并且PART_Host是我的 WPF 窗口内的边框:

这给了我一个例外:

抱歉,我缺乏知识,但是在 WPF 应用程序中托管外部窗口的正确方法是什么?

0 投票
1 回答
702 浏览

wpf - WndProc 未在 wpf 的托管进程中调用

按照以下说明:

如何在 wpf 应用程序中运行应用程序?

并在 MSDN 中的演练中 ( https://msdn.microsoft.com/en-us/library/ms752055.aspx )

我已经设法在 wpf 中托管我的控制台应用程序。(注意:要托管的应用程序超过 2 个)

在 ControlHost.cs

MainWindow.xaml.cs中:

最后在MainWindow.xaml中:

首先,我将通过单击“获取应用程序”按钮而不是单击“开始”来获取应用程序。结果将如下所示:

在此处输入图像描述

但只有一个托管应用程序接受用户输入。(在这个例子中,它是第一个应用程序,用红色圈出的可以有用户输入)另外 2 个不接受任何用户输入。单击其他 2 个应用程序时不会触发任何内容。

我知道我没有处理过很多情况。但这并没有影响我目前遇到的问题,我想。这是我编写的一个简单的应用程序(不是真正的应用程序),我希望有人能够重现与我相同的错误。

有什么我做错了吗?还是我错过了什么?任何建议将不胜感激。提前致谢!

0 投票
1 回答
194 浏览

wpf - 启用桌面合成时,HwndHost 不显示内容

我正在使用 HwndHost 在我的 WPF 窗口中嵌入一个外部应用程序。我注意到在某些 Windows 7 机器上,如果选择了 Aero 主题并启用了桌面合成,外部应用程序将启动,屏幕上会闪烁片刻然后消失。如果我关闭桌面组合或使用基本主题,应用程序将成功嵌入 WPF 窗口中。

这是我在从 HwndHost 派生的类中使用的代码:

发生问题时,我没有收到任何 Windows 错误。该过程从另一个窗口开始,该窗口将其注入我的班级。我已经检查了任务管理器并且进程运行但它在我的 WPF 窗口中不可见。有什么想法吗?

0 投票
1 回答
768 浏览

c# - 在 C# WPF 中实现 HwndHost 以处理 MouseMove 和 MouseWheel

我正在尝试在 WPF 应用程序中托管 DirectX 内容。我从这个链接中学到的是继承 HwndHost 并创建自己的 WndProc 实现以及 BuildWindowCore 和 DestroyWindowCore。 https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/walkthrough-hosting-a-win32-control-in-wpf#implement-a-class-to-host-the-microsoft- win32控制

然后我在这里找到了非常有用的实现: https ://github.com/Smartrak/WpfSharpDxControl/blob/master/WpfSharpDxControl/Win32HwndControl.cs

现在,我需要实现另外两个方法,例如 WM_MOUSEMOVE (0x0200) 和 WM_MOUSEWHEEL (0x020A)。我不确定如何正确传递信息,例如鼠标滚轮增量和时间戳。朝这个方向的任何指示都会非常有帮助。

谢谢,杰

0 投票
1 回答
321 浏览

c# - 使用 HwndHost 取消同步刷新嵌入在 WPF 应用程序中的 Unity 窗口

由于 HnwdHost,我正在开发嵌入 Win32 应用程序(Unity 窗口)的 WPF 应用程序。

出于性能原因,我们不得不将统一窗口的帧率设置为 30 FPS。但是,当 WPF 应用程序的其他用户控件尝试显示动画时,这些动画并不流畅(例如,当我尝试快速突出显示几个按钮时,突出显示需要时间跟随鼠标的光标)。如果我将 Unity 窗口的帧率设置为 500,我就没有任何问题了。

这就是我分析这种情况的方式:在动画期间,WPF GUI 似乎尝试刷新其所有控件。但是,由于 Unity 主机 (HnwdHost) 的帧速率较慢,刷新需要很长时间,并且所有其他控件似乎都在等待它。

那么,您知道是否有一种方法可以使 WPF 应用程序的渲染和 Unity 窗口的渲染(由于 HwndHost 嵌入)不同步?

0 投票
1 回答
900 浏览

c# - 在 WPF 应用程序中运行的多个 Exes

我的解决方案有 3 个 wpf 应用程序,每个应用程序都是一个 exe。主 exe(称为 Parent)有一个菜单,我想从中调用(打开)其他两个 exe。我可以通过 process.start (myexe) 来做到这一点,并将其分配给父应用程序的窗口句柄。

但是,我希望在我的 wpf 主窗口的特定内容控件(或 tabitem 或棱镜区域)内打开新的 exe。我也尝试过使用 Prism,但我无法将 exe 的主视图分配给一个区域。
我无法从子进程的句柄中获取视图(用户控件)并将其分配给父应用程序主视图的内容控件。
无论如何,最终结果都应该在任务管理器中打开多个 exe(我已经实现),但它们浮动在父应用程序中,我的主要目的是在主应用程序的某个指定控件中显示它们。



有人可以指导如何实现这一目标吗?

0 投票
1 回答
399 浏览

resize - Window 的合成引擎 (DWM) 中的背景颜色伪影

来自Kenny Kerr 博客的上下文:

Windows Vista 引入了一项称为桌面窗口管理器的服务。这个名字过去和现在都具有误导性。将其视为 Windows 合成引擎或合成器。这个合成引擎完全改变了应用程序窗口在桌面上的呈现方式。不是让每个窗口直接渲染到显示器或显示适配器,而是每个窗口都渲染到屏幕外表面或缓冲区。系统为每个顶级窗口分配一个这样的表面,并且所有 GDI、Direct3D 以及,当然还有 Direct2D 图形都被渲染到这些表面。这些屏幕外表面称为重定向表面,因为 GDI 绘图命令甚至 Direct3D 交换链表示请求都被重定向或复制(在 GPU 内)到重定向表面。

在某些时候,独立于任何给定的窗口,合成引擎会根据最新的一批更改决定是时候合成桌面了。这包括将所有这些重定向表面组合在一起,添加非客户区域(通常称为窗口镶边),可能添加一些阴影和其他效果,并将最终结果呈现给显示适配器。


上一个 SO 问题的背景(见图片) :

在 DirectX 中调整大小时,在右/下边缘会出现 win32 背景的伪影。这可以通过应用WS_EX_NOREDIRECTIONBITMAP样式来纠正。由于交换链比窗口小还是大都没有关系,如果没有WS_EX_NOREDIRECTIONBITMAP合成引擎,似乎将一个太小的矩形复制到重定向表面(因为窗口大小滞后于鼠标位置/“拖动矩形”)。


实际问题

但是,WS_EX_NOREDIRECTIONBITMAP仅适用于顶级窗口,我正在尝试将 DirectX 作为子窗口嵌入到 WPF 中,并且来自子窗口背景的工件仍在通过。这让我想到了一些相关的问题:

  1. (可选)当交换链小于窗口大小时,窗口的其余部分被填充为黑色(见图)。这是从交换链复制到重定向表面的结果,其中目标步幅的剩余部分(在源宽度之后)被清零?
  2. (可选)win32后台的神器是怎么出现的?在从交换链复制之前,重定向表面是否填充了这种颜色?
  3. (可选)是否每次调整窗口大小时都会调整重定向表面的大小?
  4. (必需)每个子窗口是否都有一个重定向表面,该重定向表面又被复制到顶级窗口的重定向表面。如果没有,孩子的win32后台神器是怎么出现的?
  5. (必填)这是否意味着嵌入到WPF中的win32窗口的帧率仅限于WPF的可变帧率?(将 DirectX 窗口嵌入 WPF 的目的是获得恒定的 60fps 帧速率)