2017-08-20 12 views
0

何かがウィンドウと重なっているかどうかを確認するにはどうすればよいですか?何かがウィンドウに重なっていないか確認してください。

私はトリックを行う必要があり、このWinFormsのコードが見つかりました:

public static bool IsOverlapped(IWin32Window window) 
{ 
    if (window == null) 
     throw new ArgumentNullException("window"); 
    if (window.Handle == IntPtr.Zero) 
     throw new InvalidOperationException("Window does not yet exist"); 
    if (!IsWindowVisible(window.Handle)) 
     return false; 

    IntPtr hWnd = window.Handle; 
    HashSet<IntPtr> visited = new HashSet<IntPtr> { hWnd }; 

    // The set is used to make calling GetWindow in a loop stable by checking if we have already 
    // visited the window returned by GetWindow. This avoids the possibility of an infinate loop. 

    RECT thisRect; 
    GetWindowRect(hWnd, out thisRect); 

    while ((hWnd = GetWindow(hWnd, GW_HWNDPREV)) != IntPtr.Zero && !visited.Contains(hWnd)) 
    { 
     visited.Add(hWnd); 
     RECT testRect, intersection; 
     if (IsWindowVisible(hWnd) && GetWindowRect(hWnd, out testRect) && IntersectRect(out intersection, ref thisRect, ref testRect)) 
      return true; 
    } 

    return false; 
} 

[DllImport("user32.dll")] 
private static extern IntPtr GetWindow(IntPtr hWnd, int uCmd); 
[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool GetWindowRect(IntPtr hWnd, [Out] out RECT lpRect); 
[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool IntersectRect([Out] out RECT lprcDst, [In] ref RECT lprcSrc1, [In] ref RECT lprcSrc2); 
[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool IsWindowVisible(IntPtr hWnd); 

private const int GW_HWNDPREV = 3; 

[StructLayout(LayoutKind.Sequential)] 
private struct RECT 
{ 
    public int left; 
    public int top; 
    public int right; 
    public int bottom; 
} 

をしかし、私はそれがWPFで動作させる方法がわからないです、誰かが私を助けることができますか? 私はすでに多くのことを試しました..

答えて

1

与えられたWPFウィンドウのハンドルを取得したい場合は、System.Windows.Interop.WindowInteropHelperクラスを使用できます。 IsOverlappedへの更新を使用すると、リサイズコードと対話できるようになる:

public static bool IsOverlapped(Window window) 
{ 
    if (window == null) 
     throw new ArgumentNullException("window"); 

    var hWnd = new WindowInteropHelper(window).Handle; 
    if (hWnd == IntPtr.Zero) 
     throw new InvalidOperationException("Window does not yet exist"); 
    if (!IsWindowVisible(hWnd)) 
     return false; 

    HashSet<IntPtr> visited = new HashSet<IntPtr> { hWnd }; 

    // The set is used to make calling GetWindow in a loop stable by checking if we have already 
    // visited the window returned by GetWindow. This avoids the possibility of an infinate loop. 

    RECT thisRect; 
    GetWindowRect(hWnd, out thisRect); 

    while ((hWnd = GetWindow(hWnd, GW_HWNDPREV)) != IntPtr.Zero && !visited.Contains(hWnd)) 
    { 
     visited.Add(hWnd); 
     RECT testRect, intersection; 
     if (IsWindowVisible(hWnd) && GetWindowRect(hWnd, out testRect) && IntersectRect(out intersection, ref thisRect, ref testRect)) 
      return true; 
    } 

    return false; 
} 
+0

はどうもありがとうございました! :D残念ながら、私はそれを試してみましたが、そうではなくても重なっていると思います。 :( – SikuliXUser

1

私はそれをこのように解決:

[System.Runtime.InteropServices.DllImport("user32.dll")] 
    public static extern IntPtr GetForegroundWindow(); 

    private void TmrCheckTopmost_Tick(object sender, EventArgs e) 
    { 
     if (!GetForegroundWindow().Equals(new WindowInteropHelper(this).Handle)) 
     { 
      Topmost = false; 
      Topmost = true; 
      Focus(); 
     } 
    } 
関連する問題