【问题标题】:Is there a way to get a IWin32Window for LINQPad application?有没有办法为 LINQPad 应用程序获取 IWin32Window?
【发布时间】:2016-02-16 20:24:53
【问题描述】:

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

【问题讨论】:

    标签: linqpad


    【解决方案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;
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 很高兴知道。不是我正在寻找的确切行为。我猜我要么查看 GetWindowRect 要么只是接受在(看似)随机监视器中弹出的表单:)。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 2010-09-07
      • 2019-03-22
      • 1970-01-01
      • 2018-05-05
      • 2016-08-18
      • 1970-01-01
      相关资源
      最近更新 更多