有没有办法为LINQPad应用程序获取IWin32Window?

时间:2016-02-16 20:24:54

标签: linqpad

我试图为WinForm调用ShowDialog(创建表单的实际代码位于.linq脚本中)并且一切正常,但对话框未显示在LINQPad应用程序中居中。当多个监视器正在运行时,这是有问题的,我正在盯着LINQPad,运行我的脚本并在不同的监视器上弹出对话框。我假设将IWin32Window传递给ShowDialog将显示以所有者为中心的对话框,但我不知道如何从LINQPad获取IWin32Window ......它甚至可能吗?

2 个答案:

答案 0 :(得分:1)

您尝试将表单设为父级时遇到的困难是您的查询在与LINQPad.exe不同的进程中运行。

您可以使用LINQPad.Util.HostProcessID获取LINQPad的进程ID,然后使用Process.GetProcessById (Util.HostProcessID).MainWindowHandle获取Windows句柄,但是您仍然无法为您的表单提供帮助。您可以做的最好的事情是调用Win32函数(如GetWindowRect)以获取LINQPad的主窗口位置,然后手动居中显示您的表单。

您是否考虑过倾倒所需的控件?然后,LINQPad将在输出窗格中呈现它并启动消息循环。例如:

var panel = new Panel { Padding = new Padding(10) };
panel.Controls.Add (new TextBox { Dock = DockStyle.Top });
panel.Controls.Add (new Label { Dock = DockStyle.Top, AutoSize=true, Text="Testing" });
panel.Dump();

请注意,您随后在控件上的事件处理程序中显示的任何表单都将居中于父级:

panel.Controls[1].Click += (sender, args) =>
    new Form { StartPosition = FormStartPosition.CenterParent }.ShowDialog();

答案 1 :(得分:1)

作为@Albahari答案的一小部分:

var dialog = new FolderBrowserDialog();
var handle = Process.GetProcessById(Util.HostProcessID).MainWindowHandle;
var win32Window = new NativeWindow();
win32Window.AssignHandle(handle);
if (dialog.ShowDialog(win32Window) != DialogResult.OK)
{
    "Aborted".Dump();
    return;
}