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

wpf - 将输入事件从 HwndHost 传递到底层 WPF 控件?

有没有办法将发生在 HwndHost 上的输入事件(主要是鼠标,但最终也是键盘输入)传递回底层 WPF 控件(例如面板)?我可以连接到 HwndHost 中的 WndProc 并接收 Windows 消息。我可以手动为鼠标单击创建一个 routedevent 并将其发送给父级以便它冒泡吗?和想法将不胜感激。谢谢 jkersch

0 投票
4 回答
2498 浏览

.net - 强制初始化 HwndHost

在我的 WPF 应用程序中,我使用 HwndHost 托管 Win32 内容。但是,创建 HwndHost 不会创建本机窗口。相反,这是在BuildWindowCore()WPF 稍后调用的重写方法中完成的。

我的托管内容需要本机窗口的窗口句柄来进行自己的初始化。不幸的是,我无法强制创建窗口(即让 WPF 调用 BuildWindowCore),所以我有第二个线程轮询 HwndHost,直到它被初始化。

在 .NET 4.0 / WPF 4.0 中,WindowInteropHelper.EnsureHandle()添加了一个新方法。我曾希望这能解决这种情况,但它只适用于 Window,而不是 HwndHost(它不是从 Window 派生的)。你有什么建议我可以做的吗?

编辑:

我忘了为可能的解决方案添加更多约束:

  1. HwndHost 放置在一个控件中,根据用户设置,该控件可以是应用程序主窗口的子窗口,也可以放置在新窗口中(通过第三方停靠管理器)。这意味着在创建窗口期间,我不确定父窗口(以及它的 hWnd)将是什么。
  2. 虽然本机代码在其初始化期间需要 hWnd,但该窗口仅在用户请求显示时才显示(即一开始它是不可见的)。如果可能,应该避免需要显示窗口,然后立即再次隐藏它。
0 投票
2 回答
2007 浏览

wpf - 强制调用 HwndHost 派生类的 BuildWindowCore 成员

我使用从 HwndHost 派生的类来承载 Win32 窗口。它又在用户控件中使用。除非成功创建内部 Win32 窗口,否则不会显示该用户控件(可见性)。但是,除非 HwndHost 窗口可见,否则似乎不会调用 BuildWindowCore 方法,所以我有一个鸡和蛋的情况。

如果 HwndHost 派生类不可见,是否有另一种方法可以调用它的 BuildWindowCore 方法?

0 投票
6 回答
46192 浏览

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

我们正在 WPF 中开发一个布局管理器,它具有可以由用户移动/调整大小/等的视口。视口通常通过我们在布局管理器中控制的提供程序填充数据(图片/电影/等)。我的工作是检查它是否也可以在视口中托管任何外部 Windows 应用程序(即记事本、calc、adobe 阅读器等)。我遇到了很多问题。

大多数资源都指向使用 HwndHost 类。我正在试验微软本身的这个演练:http: //msdn.microsoft.com/en-us/library/ms752055.aspx

我已经对此进行了调整,因此列表框将替换为来自外部应用程序的 Windows 句柄。谁能帮我解决这些问题:

  1. 演练添加了一个额外的静态子窗口,其中ListBox放置了 。我认为外部应用程序不需要它。如果我忽略它,我必须将外部应用程序设为子窗口(使用 user32.dll 中的 Get/SetWindowLong 设置GWL_STYLEWS_CHILD)。但如果我这样做,应用程序的菜单栏就会消失(因为WS_CHILD样式)并且它不再接收输入。
  2. 如果我确实使用了子窗口,并使外部应用程序成为该事物的子窗口,则可以合理地工作,但有时外部应用程序无法正常绘制。
  3. 此外,我需要将子窗口调整为视口。这可能吗?
  4. 当外部应用程序产生一个子窗口(即记事本->帮助->关于)时,此窗口不由该窗口托管HwndHost(因此可以移动到视口之外)。有什么办法可以防止这种情况发生吗?
  5. 由于我不需要外部应用程序和布局管理器之间的进一步交互,我是否正确地假设我不需要捕获和转发消息?(演练将 HwndSourceHook 添加到子窗口以捕获列表框中的选择更改)。
  6. 当您运行(未修改的)示例 VS2010 并关闭窗口时,VS2010 不会看到程序结束。如果你打破一切,你最终会在没有源代码的情况下组装。有异味发生,但我找不到。
  7. 演练本身的编码似乎很草率,但我没有找到关于这个主题的任何更好的文档。还有其他例子吗?
  8. 另一种方法是不使用HwndHost,但正如这里WindowsFormHost所讨论的那样。它可以工作(而且更简单!)但我无法控制应用程序的大小?另外,WinFormHost 不是真的为此而生吗?

感谢您提供正确方向的任何指示。

0 投票
4 回答
20638 浏览

wpf - “{DependencyProperty.UnsetValue}”不是属性“FocusVisualStyle”的有效值

我有一个奇怪的错误,我试图调试但没有运气。

我有子类 hwndhost 显示一些内容,我在该类中有以下函数设置为全屏:

这在我的原型 WPF 应用程序中运行良好,但是当我在主应用程序中使用此代码时,在关闭窗口(转义键)和fs.close()通话时出现此错误:

'{DependencyProperty.UnsetValue}' is not a valid value for property 'FocusVisualStyle'.

奇怪的是它发生在窗口关闭后大约 1500 毫秒。我尝试将 FocusVisualStyle 设置fs为 null,但它看起来像别的东西。直觉是它试图在我的应用程序中关注另一个没有此属性的元素,但我真的不知道!

谢谢!

编辑。问题是我的全屏按钮上 FocusVisualStyle 的自定义设置。我设置为 {x:Null} 并且问题消失了。

0 投票
1 回答
1952 浏览

wpf - WPF 互操作 - HwndHost 不会自动销毁托管窗口

我无法确保正确销毁托管窗口。

我有一个HwndHost在 TabControl 中显示的派生类(尽管这可能无关紧要)。我试图在选项卡关闭时销毁托管内容(而不是在包含窗口关闭时。)

我目前有 的代码myControlHost.Dispose(),它确保HwndHost.DestroyWindowCore立即调用它。问题是,DestroyWindowCore 实际上并没有销毁托管的 HWND 内容!

我原以为这足以确保底层CWnd派生的应用程序接收到 aWM_CLOSE或其他内容,但这似乎没有发生 - Spy++ 仅报告正在发送的注册消息“HwndSubclass.DetachMessage”。

我已经读到您不应该在 中明确发送您的托管窗口 a WM_CLOSEDestroyWindowCore因为这应该自动发生。

HwndHost手动删除衍生控件时,确保正确销毁托管窗口的正确方法是什么?

0 投票
1 回答
914 浏览

wpf - 在 HwndHost 父级富编辑控件中键入时,WPF 快捷方式正在激活

我正在编写一个包含旧版 MFC 富文本编辑器的 WPF 应用程序。我已将富文本编辑器包装在 HwndHost 中。HwndHost 控件位于 WPF TabControl 旁边。

在http://www.kempy.co.uk/code/Test.png运行应用程序的屏幕截图

除了我设法解决的聚焦问题和导航问题(上/下/左/右/制表符/回车)之外,我还有一个令人印象深刻的问题:

每当在面板上作为快捷键的富文本控件中键入字符时,都会激活该快捷方式,并且richedit 控件永远不会获取该字符。附上一个简单的测试项目来演示http://www.kempy.co.uk/code/Test.zip上的行为。即使富文本控件具有键盘焦点,在 Rich Edit 控件中按 P 或 C 也会使面板聚焦或单击按钮。

仅供参考,这是允许富编辑控件处理 Tab、Enter、Up、Down、Left、Right 的代码

0 投票
1 回答
922 浏览

c# - 将字符串传递给 dll

如何使用字符串参数从 C# WPF 应用程序调用 c++ dll 中的函数?我通过“添加引用”而不是“[DLLImport]”将 dll 添加到 C# 应用程序

所有的问题是 C# 建议使用 'sbyte*' 参数的函数,而不是 'char*'。带有 'int' 参数的函数可以完美运行。

这是代码:

我在 c++ dll 中的函数:

C#代码:

myFunc 想要 'sbyte*' 参数,而不是 'char*'。为什么?

或者请告诉如何将字符串转换为 sbyte*

0 投票
2 回答
4443 浏览

wpf - 如果窗口包含 HwndHost 元素,自定义 dwm 绘制的窗口框架会在调整大小时闪烁

我已经考虑了几天,但我认为我对 windows 和 wpf 如何在内部工作以解决这个问题缺乏一些基本的了解。

问题是这样的:

我创建了一个窗口,可以让我在 aero 标题栏(如办公室)上绘制 wpf 控件。只要我不向窗口添加 Hwndhost 元素,这种方法就可以正常工作,在这种情况下,每当我调整它的大小时,框架和 HwndHost 就会开始严重闪烁(其他元素似乎可以正确渲染)。我还尝试使用WPF Shell 集成库中的自定义框架窗口实现,结果是一样的,所以我认为这不完全是我的错。

以下代码是重现问题的简单可编译程序。示例在 c# 中,但答案不一定是。

0 投票
1 回答
521 浏览

wpf - 如何将 Win32 SetCursor() 与 WPF 资源和 HwndHost 一起使用

我们的 WPF 应用程序中有一个 HwndHost UIElement,用于显示 Direct3d 图形,我发现为 HwndHost UIElment 设置光标的唯一方法是调用 Win32 API SetCursor()。我们所有的游标都是托管程序集中的资源,我不希望更改它,但我无法找到一种方法来通过任何 Win32 API(如 LoadImage())加载其中一个游标。

有谁知道如何获取作为托管程序集中资源的游标的句柄(hCursor)?

或者,是否有另一种方法可以在显示 Direct3D 图形的 HwndHost 上设置光标?