- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有一个 wpf 应用程序,它应该由遗留 win32 winform 应用程序“引导”。 (我们不拥有代码;))
遗留应用程序应通过我们应提供的 Windows 类名称来引导我们的应用程序(最小化、置于最前面、关闭等),我们应将其作为写入 ini 文件的配置参数提供。
问题是我们不能让它与 wpf 一起工作,因为如果我们插入 Spy++ 给我们的类名,什么也不会发生。重点是 Spi++ 返回类似这样的东西
HwndWrapper[MyWpfProgram.exe;;16978ce2-3b8d-4c46-81ee-e1c6d6de4e6d]
每次运行时随机生成 guid。
有什么办法可以解决这个问题吗?
谢谢。
最佳答案
没有办法按照我的要求去做。但是我们找到了解决方法。 “简单地”将 xaml 窗口嵌入到窗口窗体中。
这些是我们遵循的步骤:
1 - 向项目添加 Windows 窗体。
2 - 删除 app.xaml 并使新表单成为应用程序的入口点。
3 - 因为我们需要 main.xaml 的 hwnd,所以我们将这个 Prop 添加到它的代码后面
public IntPtr Hwnd
{
get { return new WindowInteropHelper(this).Handle; }
}
4 - 然后我们从窗体的构造函数创建 wpf 窗口类的实例
private Main app;
public ContainerForm()
{
InitializeComponent();
app = new Main();
ElementHost.EnableModelessKeyboardInterop(app);
}
我们需要
ElementHost.EnableModelessKeyboardInterop(app);
因为我们希望所有键盘输入都从 windows 窗体传递到 xaml 窗口
5 - 现在我们要将 xpf 窗口绑定(bind)到 winform。为此,我们需要使用 Windows Api,并且我们在窗体的 OnShow 事件中执行此操作(稍后将解释原因)。
[DllImport("user32.dll", SetLastError = true)]
private static extern long SetFocus(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true)]
private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll", SetLastError = true)]
private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);
[DllImport("user32.dll", EntryPoint = "SetWindowLongA", SetLastError = true)]
private static extern long SetWindowLong(IntPtr hwnd, int nIndex, long dwNewLong);
private const int GWL_STYLE = (-16);
private const int WS_VISIBLE = 0x10000000;
private void ContainerForm_Shown(object sender, EventArgs e)
{
app.Show();
SetParent(app.Hwnd, this.Handle);
SetWindowLong(app.Hwnd, GWL_STYLE, WS_VISIBLE);
MoveWindow(app.Hwnd, 0, 0, this.Width, this.Height, true);
SetFocus(app.Hwnd);
}
与
SetParent(app.Hwnd, this.Handle);
我做魔术,然后用
SetWindowLong(app.Hwnd, GWL_STYLE, WS_VISIBLE);
我们从 wpf 窗口中删除了所有的 chrome(即使窗口定义为无边框,也有边框,不要问我为什么)
然后我们让wpf窗口填满winform的所有客户区
MoveWindow(app.Hwnd, 0, 0, this.Width, this.Height, true);
然后我们聚焦wpf窗口
SetFocus(app.Hwnd);
这就是我们在展会事件中竭尽全力的原因。因为如果我们在窗体的构造函数中执行此操作,那么 wpf 窗口将失去焦点,因为在 winform 中主窗口从操作系统获得焦点。
我们不明白为什么我们需要在此时添加其他 api 调用,但如果我们将它们留在构造函数中,这个技巧就不起作用了。
无论如何,问题解决了;)
关于Wpf 和 Hwnd 唯一名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18103738/
如何将 hwnd 类型数据存储和检索到一个平面文件中,并将其返回到 hwnd 类型变量中? 我是这样写的: HWND g_hWndApp, g_hWndApp1; ofstream myfile; m
我需要一些具体的帮助。我知道类名、所有者 hwnd 和窗口的大小。我如何获得它的hwnd?或者,至少,获取满足这些条件的所有窗口的列表。 提前致谢! 瓦利 最佳答案 您可以尝试使用此代码。它将为您提供
我确实了解如何重载运算符,但显然不完全了解。 谁能解释一下这部分的用法 WWindow::operator HWND() { // This overloaded operator allow
我尝试使用 DirectXTK 在我的游戏引擎中实现鼠标和键盘支持。这对于键盘来说非常简单,但是我在实现适当的鼠标支持方面遇到了问题。我在关注 THIS用于在我的引擎中实现鼠标。这篇来自 Micros
我有 2 个应用程序,一个是隐藏窗口(“hW”),另一个是控制台应用程序(“CA”),来自我想向硬件发送命令。在控制台应用程序中,我得到了硬件句柄,这是一个问题:如果我正在运行: PostMessag
我一直在改进我一直致力于的类(class),其中之一就是创建库来处理某些在我的主项目中并不真正需要看到的任务。但是,当我调用该类并实例化我刚刚创建的库时,我得到: Intellisense: argu
我正在应用程序中处理 ESC 键,收到此键后我希望关闭当前窗口。 我应该简单地调用DestroyWindow(hWnd)还是应该SendMessage(WM_CLOSE, hWnd, 0, 0),或者
我是说 WndProc_OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify) 可以这样重写 WndProc_OnCommand(hWn
假设 GetDC(hWnd) 作为 WM_CREATE 上的第一条 指令被调用,对于窗口 hWnd, GetDC() 是否可能返回 NULL? 我担心 GetDC() 可能因资源不足而失败。当发生这种
我是这个社区的新手,在使用我的自动化脚本 1 时遇到问题,我想获取 HWND 的创建时间。 我在从 FindWindowEx 检索到的数组中有一组 HWND,我想在数组中找到最后根据系统时间创建的 H
我使用CreateCoreWebView2Host()方法创建了边缘浏览器窗口。此方法使用父窗口句柄并创建子窗口,我们可以在其中导航网页。导航完成后,我需要返回我的窗口句柄,但我认为我无法返回。 在S
当我们使用WindowFromPoint winapi函数时,我们通常可以得到这样的情况:Point指定窗口内的某个控件。在这种情况下,WindowFromPoint 返回该控件的句柄,而不是返回处理
我想知道您是否可以将句柄转换为窗口“HWND”。我需要使用“FindWindow”方法调用“PostMessage”函数。 我目前必须采购 HANDLE mainProcess; BOOL APIEN
为什么我在此处将桌面作为我的模态对话框的父 HWND? class CSaveProfileAsDlg: public CSimpleDialog { .... LRESULT OnInit
我正在将我的 HWND 传递给一个子流程,这样它就可以向我发送有关其进度的消息。有时我从未收到来自子流程的任何消息。在调查过程中,我发现我传递给子进程的 GetSafeHwnd() 似乎返回了我不期望
我又是伙计们,到目前为止,我已经设法学习了有关窗口创建和消息系统的大多数基础知识,现在我想问一下格式化,因为我没有设法在谷歌上找到任何关于我的特殊情况的信息。这是到目前为止的样子: 其中带有 0 的框
GetDesktopWindow() 仅返回主桌面。我也试过 EnumDisplayMonitors(),但没有返回桌面句柄。 最佳答案 您可以使用可用的函数来执行此操作,如下所示: 方法 1(对于重
我正在尝试创建一个简单的窗口,但我遇到了一些问题。编译器不会报错,但它根本无法创建窗口的 hWnd。它还表示正在使用“msg”变量而未初始化。这不是错误,只是警告,但是我感到不舒服。当我单击调试屏幕中
如何在另一个第三方应用程序中使用 C++ 获取 Combobox 的 HWND? MSDN 有一个函数叫做 GetDlgItem()但是第二个参数需要控件的 ID。有函数 GetDlgCtrlID()
当我编译我的代码时,应该打开一个窗口,但它没有。我已经创建了一个类、HWND 和应用程序处理程序;依然没有。 我有点新,很抱歉这个问题。 应用程序运行良好,没有错误,但窗口似乎没有出现。 #inclu
我是一名优秀的程序员,十分优秀!