title: Getting foreground window size wrong all the time
body: <p>I am writing a program on c# that implements mouse and keyboard hooks and once a specified key clicked it will go and grab foreground window and save it's x,y, height and width into xml file.</p>
  
  <p>I am not sure what is wrong, but I keep getting wrong sizes and wrong parameters.</p>
  
  <p>I would appreciate a help on this one as I been struggling for two days with it now.</p>
  
  <p>Bellow is relevant code.</p>
  
  <p>Standard declarations:</p>
  
  <pre><code>//rectangle for the windows size
          [StructLayout(LayoutKind.Sequential)]
          public struct RECT
          {
              public int Left;
              public int Top;
              public int Right;
              public int Bottom;
          }
  
  
          //win API
          [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
          public static extern IntPtr GetForegroundWindow();
  
          [return: MarshalAs(UnmanagedType.Bool)]
          [DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
          public static extern bool SetForegroundWindow(IntPtr hwnd);
  
          [DllImport("user32.dll", SetLastError = true)]
          static extern bool GetWindowRect(IntPtr hWnd, ref RECT Rect);
  </code></pre>
  
  <p>And the relevant code itself</p>
  
  <pre><code>void mouseHook_MouseDown(object sender, MouseEventArgs e)
          {
              this.handle = GetForegroundWindow();   
          }
  
          #region keyboard pressed
          void keyboardHook_KeyDown(object sender, KeyEventArgs e)
          {            
              if (e.KeyCode == Keys.F9) //if slot selected
              {
                  RECT Rect = new RECT();
                  SetForegroundWindow(this.handle);
                  //this.handle = GetForegroundWindow();    
                  GetWindowRect(this.handle, ref Rect);
  
                  Grid newSlot = new Grid();
                  newSlot.topX = Rect.Top;
                  newSlot.topY = Rect.Left;
                  newSlot.width = Rect.Right - Rect.Left;
                  newSlot.height = Rect.Bottom - Rect.Top;
  
                  layoutGrid.Add(newSlot);
                  lbl_slots.Text = layoutGrid.Count().ToString();
              }
              else if (e.KeyCode == Keys.F10) //if main stack slot selected
              {
                  RECT Rect = new RECT();
                  SetForegroundWindow(handle);
                  GetWindowRect(GetForegroundWindow(), ref Rect);    
                  for (int i = 0; i &lt; layoutGrid.Count(); i++) //selecting slot for main stack
                  {
                      layoutGrid[i].slot_number = i + 1; //setting slots numbers
                      if (layoutGrid[i].topX != Rect.Top &amp;&amp; layoutGrid[i].topY != Rect.Left)
                          layoutGrid[i].is_stack = false;
                      else
                      {
                          layoutGrid[i].is_stack = true;
                          lbl_stackSlot.Text = (i + 1).ToString();
  
                      }
                  }
              }
          }
  </code></pre>
  
  <p><strong>EDIT:</strong>
  I have tried to use both public struct RECT and Rectangle, the values with RECT I receive seems to be random, I mean left and top and height and width, sometimes it will find the proper points , but sometimes it seems completely random ones. The values I receive with Rectangle seems to have proper left and top but return wrong height and width.</p>