有没有办法为LINQPad应用程序获取iwin32窗口?

有没有办法为LINQPad应用程序获取iwin32窗口?,linqpad,Linqpad,我正在尝试调用WinForm的ShowDialog(创建表单的实际代码位于.linq脚本中),所有工作正常,但该对话框不会在LINQPad应用程序中居中显示。当多个监视器在运行时,我盯着LINQPad,运行脚本,在不同的监视器上弹出对话框时,这是有问题的。我假设将Iwin32窗口传递给ShowDialog将显示以所有者为中心的对话框,但我不知道如何从LINQPad获取Iwin32窗口……这有可能吗?尝试将表单设置为父窗体时遇到的困难是,您的查询运行在与LINQPad.exe不同的进程中 您可以使

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

尝试将表单设置为父窗体时遇到的困难是,您的查询运行在与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();

作为对@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;
}

很高兴知道。但不是我想要的那种行为。我想我要么查看GetWindowRect,要么接受随机监视器中弹出的表单:)。谢谢