- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的应用程序是一个vb6可执行文件,但系统中一些较新的形式是用C#编写的。我希望能够使用主应用程序窗口的句柄设置 C# 窗体的所有者属性,以便在我的应用程序和其他应用程序之间来回切换时,对话框保持在顶部。
我可以获得主应用程序窗口的hwnd。我不确定我能从那里做什么?
更新 2008 年 10 月 20 日 17:06:
斯科特,
感谢您的回复。我忽略了 Show/ShowDialog 方法参数不是 Form 类型 - 我只查看了 Owner 属性。
我稍微修改了上面使用的代码 - 我们有一个组件,它通常加载我们的表单并调用 ShowDialog。我的代码如下所示:
Form launchTarget = FormFactory.GetForm(xxx); // psuedo-code for generic form loader
launchTarget.StartPosition = FormStartPosition.CenterParent;
IWin32Window parentWindow = GetWindowFromHwnd(hwnd);
launchTarget.ShowDialog(parentWindow);
GetWindowFromHwnd
是代码的方法封装版本:
private IWin32Window GetWindowFromHost(int hwnd)
{
IWin32Window window = null;
IntPtr handle = new IntPtr(hwnd);
try
{
NativeWindow nativeWindow = new NativeWindow();
nativeWindow.AssignHandle(handle);
window = nativeWindow;
}
finally
{
handle = IntPtr.Zero;
}
return window;
}
不幸的是,这并没有达到我希望的效果。该表单确实以模态方式显示,但它没有显示在正确的位置,也没有在我离开并返回父窗口时仍在顶部。我们的模式不在任务栏中显示任务,因此窗口似乎“消失”了(尽管它仍然存在于 alt-tab 窗口列表中)。这对我来说表明我可能没有正确的hwnd。如果您有任何其他建议,请回复。再次感谢。
更新 2008 年 11 月 10 日 16:25
一个后续评论 - 如果您将它分解为 try/finally 中的方法调用,如 Scott 的第 2 篇文章,则 finally block 中的调用应该是:
parentWindow.ReleaseHandle();
最佳答案
所以您正在从 VB6 调用 C# Windows 窗体类,这意味着您可能正在使用 Show()
或 ShowDialog()
,对吗?这两种方法还采用 IWin32Window 参数,该参数仅定义一个返回名为 Handle 的 IntPtr 属性的对象。
所以...您需要为您的 Windows 窗体类添加一个重载构造函数(或 ShowDialog 方法),该类将 long
作为参数,以便您可以将 VB6 hwnd 传递给窗体。一旦进入 C# 代码,您需要从 hwnd 创建一个 IntPtr 并将其分配给一个 NativeWindow
对象,然后将其作为所有者传递。
像这样的东西应该工作,尽管它未经测试:
public DialogResult ShowDialog(long hwnd)
{
IntPtr handle = new IntPtr(hwnd);
try
{
NativeWindow nativeWindow = new NativeWindow();
nativeWindow.AssignHandle(handle);
return this.ShowDialog(nativeWindow);
}
finally
{
handle = IntPtr.Zero;
}
}
关于c# - 我可以使用 hwnd/NativeWindow 获得设置我的 WinForms 窗体所有者的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/213661/
对于一个科学实验,我写了一个turtle.py ,它会打开一个 800x480 的窗口并绘制一个缓慢增长的黑点。 turtle.py以 C:\Users\kaza>python C:\Users\ka
我开发了一个 swing 应用程序,但每次运行应用程序时都会打开一个新窗口。我希望如果一个窗口已经打开,则其他窗口不允许打开。 最佳答案 Here是一个 Java 单一应用实例的例子: A singl
有没有办法检测主进程中 Electron 的结构? process.platform 似乎也在 x64 机器上返回 win32,我没有在文档中找到任何获取架构的选项。 最佳答案 你试过 process
public short[] HanningWindow(short[] signal_in ,int pos ,int size) { for (int i= pos; i < pos+si
我有一个具有这些属性的 Electron 窗口: mainWindow = new BrowserWindow({ width: 800, height: 600, title: "Aqu
我有一个 Ubuntu 工作站,我正在尝试引导一个 Windows 节点。 Windows 节点在端口 2222 上打开了 ssh。我一直在关注 http://docs.opscode.com/plu
我是一名优秀的程序员,十分优秀!