title: getting active window name based on mouse clicks in c#
body: <p>I am trying to make an application get the mouse click location  and titles(names ) of the windows on which the user clicks. I at present have used the  LowLevelMouseProc, which gives fine results but it makes the application crash whenever I click on Google chrome.
  Here is the code:</p>
  
  <pre><code> using System;
   using System.Collections.Generic;
   using System.Linq;
   using System.Text;
   using System.Runtime.InteropServices;
    using System.Windows.Forms;
   using System.Diagnostics;
  
          //An attempt to print the screen name of the active window and mouse coordinates at every mouse click
  namespace Project1
   {
  class InterceptMouse
  {
  
      private static LowLevelMouseProc _proc = HookCallback;
      private static IntPtr _hookID = IntPtr.Zero;
  
      public static void Main()
      {
          _hookID = SetHook(_proc);
          Application.Run();
          UnhookWindowsHookEx(_hookID);
          Application.Exit();
      }
  
      private static IntPtr SetHook(LowLevelMouseProc proc)
      {
          using (Process curProcess = Process.GetCurrentProcess())
          using (ProcessModule curModule = curProcess.MainModule)
          {
              return SetWindowsHookEx(WH_MOUSE_LL, proc,
                  GetModuleHandle(curModule.ModuleName), 0);
          }
      }
  
      private delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam);
  
      private static IntPtr HookCallback(
          int nCode, IntPtr wParam, IntPtr lParam)
      {
          int nodeCount;
          LinkedListNode&lt;StringBuilder&gt; nodefirst = new LinkedListNode&lt;StringBuilder&gt;(null);
          LinkedListNode&lt;StringBuilder&gt; nodeprev = new LinkedListNode&lt;StringBuilder&gt;(null);
          LinkedList&lt;StringBuilder&gt; windowlist = new LinkedList&lt;StringBuilder&gt;();
  
  
          if (nCode &gt;= 0 &amp;&amp;
              MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam)
          {
              MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
              Console.WriteLine(hookStruct.pt.x + ", " + hookStruct.pt.y);
             IntPtr hwnd = GetForegroundWindow();
             StringBuilder windowtitle = new StringBuilder();
             if(GetWindowText(hwnd, windowtitle, 2000)&gt;0)
             Console.WriteLine(windowtitle);
             //Console.WriteLine(nodeCount);
  
             if (nodeCount == 0)
             {
                 nodefirst = windowlist.AddFirst(windowtitle);
                 nodeCount++;
             }
             else
             {
                 if (nodeCount == 1)
                 {
                     nodeprev = windowlist.AddAfter(nodefirst, windowtitle);
                     nodeCount++;
                 }
                 if (nodeCount &gt; 1)
                 {
                     nodeprev = windowlist.AddAfter(nodeprev, windowtitle);
                     nodeCount++;
                 }
  
             }
  
          }
  
          return CallNextHookEx(_hookID, nCode, wParam, lParam);
  
      }
  
      private const int WH_MOUSE_LL = 14;
  
      private enum MouseMessages
      {
          WM_LBUTTONDOWN = 0x0201,
          WM_LBUTTONUP = 0x0202,
          WM_MOUSEMOVE = 0x0200,
          WM_MOUSEWHEEL = 0x020A,
          WM_RBUTTONDOWN = 0x0204,
          WM_RBUTTONUP = 0x0205
      }
  
      [StructLayout(LayoutKind.Sequential)]
      private struct POINT
      {
          public int x;
          public int y;
      }
  
      [StructLayout(LayoutKind.Sequential)]
      private struct MSLLHOOKSTRUCT
      {
          public POINT pt;
          public uint mouseData;
          public uint flags;
          public uint time;
          public IntPtr dwExtraInfo;
          IntPtr hwnd;
  
      }
  
      [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
      private static extern IntPtr SetWindowsHookEx(int idHook,
          LowLevelMouseProc lpfn, IntPtr hMod, uint dwThreadId);
  
      [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
      [return: MarshalAs(UnmanagedType.Bool)]
      private static extern bool UnhookWindowsHookEx(IntPtr hhk);
  
      [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
      private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
          IntPtr wParam, IntPtr lParam);
  
      [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
      private static extern IntPtr GetModuleHandle(string lpModuleName);
  
      [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
      public static extern IntPtr GetForegroundWindow();
  
      [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
      static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
      }
    }
  </code></pre>
  
  <p>Though when I don't use low level hook and just use Thread.sleep(5000) and keep getting active window names every 5 seconds then it does not crash.
  Please help me find out why? . Please help me.</p>