【问题标题】:SetWindowPos not working on Form.Show()SetWindowPos 不适用于 Form.Show()
【发布时间】:2013-09-04 22:58:05
【问题描述】:

我在某个 Form 上调用 Form.Show() 并在之后做一些事情 导致显示表单上的一些更新。

我想在这段时间内使用 SetWindowPos 将此窗口窗体移动到另一个位置和另一个进程。 可悲的是,调用 SetWindowPos 完全没有任何作用。 可能是因为它从不闲置?

知道谁来解决这个问题吗?

谢谢

编辑:一些代码:

main.Show();
main.initBase(); //Takes 2-3 seconds
main.HideMainForm(); //Moves the form to (10000, 10000), to hide it (can't change that it's an old programm)

main.Shown 事件中,我调用了另一个程序,而不是调用 SetWindowPos(pd.CurrentHandle, HWND_TOPMOST, r.X, r.Y, r.Width, r.Height, SetWindowPosFlags.DoNotChangeOwnerZOrder);

其中 r 是所选显示器的矩形

我试过了

EventHandler ev = new EventHandler((s, e) =>
{
    main.Close();
ev = new EventHandler((s2, e2) => { });
});

main.Shown += ev;       

main.ShowDialog();
main.Show();

效果很好,但只是丑陋的代码,我正在努力寻找更好的解决方案。

【问题讨论】:

  • 调用SetWindowPos成功?
  • stackoverflow.com/q/8443502/56778 的回答和类似问题表明这是可能的。给我们看一些代码。也许你错过了什么。
  • @AlessandroD'Andria 是的。
  • @JimMischel 添加了一些代码也许有帮助

标签: c# winapi


【解决方案1】:

我想到了两种可能性。

首先,您说在main.Shown,外部程序调用SetWindowPos 来移动窗口。显示表单的代码需要 2 或 3 秒来初始化,然后将窗口移出屏幕。调用SetWindowPos 的外部程序是否有可能在调用HideMainForm 之前执行

如果您注释掉 HideMainForm 会发生什么?窗口会移动吗?

第二,你有:

SetWindowPos(
    pd.CurrentHandle, 
    HWND_TOPMOST,
    r.X, r.Y, r.Width, r.Height,
    SetWindowPosFlags.DoNotChangeOwnerZOrder);

可能是DoNotChangeOwnerZOrder 标志干扰了HWND_TOPMOST 请求,导致函数失败。 documentation 说:

可以通过将 hWndInsertAfter 参数设置为 HWND_TOPMOST 并确保未设置 SWP_NOZORDER 标志,或者通过设置窗口在 Z 顺序中的位置,使其位于任何现有的最顶层窗口之上,可以使窗口成为最顶层窗口。当非最顶层窗口成为最顶层时,其拥有的窗口也被置为最顶层。然而,它的所有者并没有改变。

当然,这并没有说明SWP_NOOWNERZORDER 标志,但在一般情况下,如果将某些东西放在它上面,所有者的 Z 顺序将会改变。因此,如果您请求该标志并且函数无法确保它,则该函数可能会失败。

需要查看SetWindowPos的返回值:

bool success = SetWindowPos(...);
if (!success)
{
    int err = Marshal.GetLastWin32Error();
    // the err value will give you information about why it failed.
}

为此,您的DllImport 必须具有SetLastError=true

【讨论】:

    【解决方案2】:

    你在使用 Form.showDialog() 吗?

    如果是这样,它就会发生。请改用 Form.show()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多