- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景:我和我的同事正在维护我们继承的百万行遗留应用程序。它的前端是用 VB6 编写的,由于我们将几乎所有资源都投入到将其转换为 C#,因此我们正在寻找针对我们的特定问题的快速而粗略的解决方案。
应用程序以插件式方式运行。有多达 20 个独立的 ActiveX 控件可以在网格样式布局中一次加载。问题是 ActiveX 控件在它们自己的 UI 线程上完成所有处理,并且由于很多控件阻塞等待网络访问,UI 变得非常糟糕。当我们的托管 C# 应用程序加载这些控件时,它变得无响应,因为有多少控件正在吞噬 UI 资源而无所事事。最重要的是,控件很脆弱,会在最轻微的挑衅下崩溃。当它们托管在主 C# 应用程序中时,会造成严重的不稳定。
到目前为止,我和我的同事想到的最好的方法是为每个 ActiveX 控件启动一个进程。这个过程,我们称之为代理,是另一个 winforms 应用程序。它使用命名管道与宿主进程进行通信。托管进程创建一个窗口,加载我们选择的 ActiveX 控件(通过一些反射和 AxHost 魔法),并通过命名管道告诉主进程它的窗口句柄是什么。主进程结合使用 SetParent 和 SetWindowPos 将代理应用程序移入自身以模拟插件。大小更新通过命名管道发送。
在 ActiveX 应用程序执行某种冗长的过程并且我们在主窗口工作时单击它之前,这已经足够好了。主窗口有一段时间是有响应的,但最终它会因为子窗口等待其 UI 线程而变得无响应。我们如何才能让子窗口保持在它们自己的完整线程上,同时仍然获得 SetParent 的好处?
(如果有什么不清楚的,请告诉我!)
最佳答案
我以前做过。它变得凌乱。
我们在其自己的 AppDomain 中运行每个插件,它启动了自己的 UI 线程。当我们没有使用不同的 UI 线程时,我们在遇到很多非常讨厌的问题后才这样做。
这确实意味着您会遇到跨 AppDomain 通信的所有痛苦,但这是可行的。最主要的是您需要在每个 AppDomain/插件中运行 Application.Run
。非常小心地在它们之间进行通信 - 甚至关闭也很棘手。
祝你好运:)
关于c# - 使用 SetParent 窃取另一个进程的主窗口但保持消息循环独立,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5190881/
我有一个布局,我添加了很多自定义小部件,例如 layout.addWidget(widget) .稍后我想删除所有这些自定义小部件并添加新小部件。当谈到 deleteLater 时,我对执行此操作的最
背景:我和我的同事正在维护我们继承的百万行遗留应用程序。它的前端是用 VB6 编写的,由于我们将几乎所有资源都投入到将其转换为 C#,因此我们正在寻找针对我们的特定问题的快速而粗略的解决方案。 应用程
我正在尝试通过 PInvoke 使用 SetParent API 将 childForm 设置为主 Excel 窗口的子窗口: Form childForm = new MyForm(); IntPt
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Embedding HWND into external process using SetParent 我
我试图在 Unity 中以设定的时间间隔生成一颗星星。但我想让这些明星成为 parent ,不要让我的检查员感到困惑。 但是当我尝试这样做时,它给出了“NullReferenceExeption:对象
我有一个表单和一个面板,这是我处理 setparent 的代码,效果很好。 hWnd = FindWindow("MapleStoryClass", null); Panel_Handle(); Se
一旦应用程序现在将其用作父表单,您将如何从表单中取消 Hook ? [DllImport("user32.dll")] public static extern int SetParent(IntPt
我的组件出现错误,TypeError: control.setParent is not a function .使用 FormBuilder,我构建了一个 FormArray 并在构造函数中启动了表
我有一个通用的 Element 类,其中包含同一类的元素。基于此,我将创建具体的类,例如 Boxes extends Element 我不明白的一点是 setParent(this); 为什么我需要转
我使用 PyQt5 开发的 GUI 遇到问题。 应用尝试从不同的线程更新窗口进度条的值(QThreadPool())。当它尝试更新进度条时,Python 会发出如下警告: QObject::setPa
问候语 我有一个后续类(class)。 class MyClass : public QObject { Q_OBJECT public: Q_INVOKABLE QVariant s
我需要为桌面上的一些应用程序窗口创建一个水印窗口(markHwnd),水印窗口样式为: uint dwStyle = Win32API.WS_CLIPSIBLINGS |
user32.dll 的文档 SetParent函数指出 When you change the parent of a window, you should synchronize the UIST
我创建了两个应用程序MainApps和SubApps,SubApps有一个模式类型对话框,例如登录/注销表单等,并且工作正常。 将其附加到 MainApps 后,模态对话框显示为正常的框形式。它的行为
我写了一个 QT - webkit 应用程序。当我的 pSeudo 驱动程序获取字符“l”时,此应用程序会触发回调。但是,应用程序在 firecallback 期间崩溃 - 它说 - QObject:
这不是建议问题的拷贝。来 self 的问题:“我不是在问如何编写代码。代码有效。” + “如果这个 SHELLDLL_DefView 基本上是桌面窗口,因此我应该接受应该避免小工具功能,或者如果这有点
我尝试编写一个 qt 小部件,以便在尝试打开文件时弹出一个对话框。我目前到目前为止: class FileDialog : public QWidget { Q_OBJECT protecte
我想创建一个函数来构建一个可以动态添加到窗口菜单栏的上下文菜单。考虑以下用于添加简单 QMenu 的最小示例: from PyQt5 import QtWidgets class MainWindow
SetParent 函数接受子窗口句柄和新的父窗口句柄。当子窗口处于不同的 Windows 进程中时,这似乎也有效。 我看过a post声称这不受官方支持,但是 current docs别再提这个了。
我正在尝试使用 SetParent 函数将我的进程中的一个窗口嵌入到外部进程的窗口中,遇到了一些问题,我希望有人能帮助我解决这些问题。首先,这是我目前正在做的将我的窗口嵌入到应用程序中的概述: HWN
我是一名优秀的程序员,十分优秀!