title: How to get Window under mouse properly?
body: <p>As I have read, the way to get window under mouse is to use <code>WindowFromPoint</code> and that's what I did, but, it will always return the window handle of my window, if I place mouse over other window, it will always return my window handle!</p>
  
  <p>Here is my code:</p>
  
  <pre><code>NativeMethods.POINT p;
  
  if (NativeMethods.GetCursorPos(out p))
              {
  
                  IntPtr hWnd = NativeMethods.WindowFromPoint(p);
                  NativeMethods.GetWindowModuleFileName(hWnd, fileName, 2000);
  
  string WindowTitle= fileName.ToString().Split('\\')[fileName.ToString().Split('\\').Length - 1];
  // WindowTitle will never change, it will get my window only!
  
              }
  
  ////////////////////////////////////////////////////////////////////////////////////////
  
  static class NativeMethods
          {
  
              [DllImport("user32.dll")]
              public static extern IntPtr WindowFromPoint(POINT Point);
  
              [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
              public static extern uint GetWindowModuleFileName(IntPtr hwnd,
                  StringBuilder lpszFileName, uint cchFileNameMax);
  
              [DllImport("user32.dll")]
              public static extern bool GetCursorPos(out NativeMethods.POINT lpPoint);
  
  
              [StructLayout(LayoutKind.Sequential)]
              public struct POINT
              {
                  public int X;
                  public int Y;
  
                  public POINT(int x, int y)
                  {
                      this.X = x;
                      this.Y = y;
                  }
  
                  public static implicit operator System.Drawing.Point(POINT p)
                  {
                      return new System.Drawing.Point(p.X, p.Y);
                  }
  
                  public static implicit operator POINT(System.Drawing.Point p)
                  {
                      return new POINT(p.X, p.Y);
                  }
              }
  
              [StructLayout(LayoutKind.Sequential)]
              public struct RECT
              {
                  public int Left;
                  public int Top;
                  public int Right;
                  public int Bottom;
              }
          }
  </code></pre>
  
  <p>EDIT</p>
  
  <p>As I am working in WPF, here is my try to use invoke in WPF:</p>
  
  <pre><code>void dispatcherOp_Completed(object sender, EventArgs e)
          {
  
              System.Threading.Thread thread = new System.Threading.Thread(
                  new System.Threading.ThreadStart(
                    delegate()
                    {
                        System.Windows.Threading.DispatcherOperation
                          dispatcherOp = this.Dispatcher.BeginInvoke(
                          System.Windows.Threading.DispatcherPriority.Normal,
                          new Action(
                            delegate()
                            {
                                NativeMethods.POINT p;
                                if (NativeMethods.GetCursorPos(out p))
                                {
                                    IntPtr hWnd = NativeMethods.WindowFromPoint(p);
                                    NativeMethods.GetWindowModuleFileName(hWnd, fileName, 2000);
  
                                    uint processID = 0;
                                    uint threadID = GetWindowThreadProcessId(hWnd, out processID);
                                    string filename= Process.GetProcessById((int)processID).MainModule.FileName;
                                }
  
                            }
                        ));
                        dispatcherOp.Completed -= new EventHandler(dispatcherOp_Completed);
                        dispatcherOp.Completed += new EventHandler(dispatcherOp_Completed);
                    }
                ));
  
  
              thread.Start();
          }
  </code></pre>