0

我有一个应用程序需要覆盖另一个应用程序的窗口。随着重叠的移动,我需要我的应用程序随之移动。

我正在使用以下代码来获取窗口并将我的窗口定位在它上面。

public static void DockToWindow(IntPtr hwnd, IntPtr hwndParent)
    {
        RECT rectParent = new RECT();
        GetWindowRect(hwndParent, ref rectParent);

        RECT clientRect = new RECT();
        GetWindowRect(hwnd, ref clientRect);
        SetWindowPos(hwnd, hwndParent, rectParent.Left, 
                                     (rectParent.Bottom - (clientRect.Bottom - 
                                      clientRect.Top)),  // Left position
                                     (rectParent.Right - rectParent.Left),
                                     (clientRect.Bottom - clientRect.Top),
                                     SetWindowPosFlags.SWP_NOZORDER);

     }

我还将 form.TopMost 设置为 true。我遇到的问题是覆盖将焦点从覆盖的窗口中移开。我只希望我的叠加层位于此窗口的顶部,但不会窃取焦点。如果用户单击覆盖的窗口,我希望它像放置覆盖之前那样工作。但是,如果用户单击叠加层,我需要在叠加层上捕获鼠标。

有任何想法吗?谢谢

4

3 回答 3

1

在 winforms 中,您可以通过覆盖 ShowWithoutActivation 来避免焦点设置

protected override bool ShowWithoutActivation
{
  get { return true; }
}

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.showwithoutactivation.aspx

于 2013-05-22T14:20:55.293 回答
0

Floating Controls, Tooltip-style,在你的覆盖表单上试试这个:

private const int WM_NCHITTEST             = 0x0084;
private const int HTTRANSPARENT            = (-1);

/// <summary>
/// Overrides the standard Window Procedure to ensure the
/// window is transparent to all mouse events.
/// </summary>
/// <param name="m">Windows message to process.</param>
protected override void WndProc(ref Message m)
{
  if (m.Msg == WM_NCHITTEST)
  {
    m.Result = (IntPtr) HTTRANSPARENT;
  }
  else
  {
    base.WndProc(ref m);
  }
}
于 2013-05-22T14:31:30.393 回答
0

通过更新 SetWindowPos 代码以使用覆盖窗体的 Left、Top、Right 和 Bottom 属性而不是使用 GetWindowRect,我能够找到解决此问题的方法。

 RECT rect = new RECT();
 GetWindowRect(hostWindow, ref rect);
 SetWindowPos(this.Handle, NativeWindows.HWND_TOPMOST,
                                         rect.Left+10,
                                         rect.Bottom - (Bottom - Top),
                                        (rect.Right - rect.Left),
                                         Bottom - Top,
                                         0);

此代码沿主机窗口的底部边缘对齐覆盖窗口。我现在遇到的问题是我的叠加层位于所有窗口之上,而不仅仅是我想要叠加的窗口。我试过 HWND_TOP 做同样的事情,以及覆盖窗口句柄,它将我的覆盖层放在窗口下方。

任何想法 - 我需要使用 SetParent() 吗?

于 2013-05-24T15:55:37.750 回答