2012-06-11 30 views

回答

4

尝试

Screen.FromControl(this).GetWorkingArea(); 

来计算尺寸(没有任务栏) 然后所述。减去形式ClientSize /尺寸之间的差。 希望有效,没有测试过。

更新:

有点哈克,但我想它和它的作品。

 var frm = new Form(); 
     frm.Opacity = 100; 
     frm.WindowState = FormWindowState.Maximized; 
     frm.Show(); 

     while (!frm.IsHandleCreated) 
      System.Threading.Thread.Sleep(1); 

     var result = frm.ClientSize; 
     frm.Close(); 
     return result; 

UPDATE2:

这是一个更好的解决方案。 我禁用绘制表单,最大化它,获取客户区域,将其设置恢复正​​常并返回结果。运作良好,没有闪烁或什么。

private static Size GetMaximizedClientSize(Form form) 
    { 
     var original = form.WindowState; 
     try 
     { 
      BeginUpdate(form); 

      form.WindowState = FormWindowState.Maximized; 
      return form.ClientSize; 

     } 
     finally 
     { 
      form.WindowState = original; 
      EndUpdate(form); 
     } 
    } 

    [DllImport("User32.dll")] 
    private extern static int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam); 

    private enum Message : int 
    { 
     WM_SETREDRAW = 0x000B, // int 11 
    } 

    /// <summary> 
    /// Calls user32.dll SendMessage(handle, WM_SETREDRAW, 0, null) native function to disable painting 
    /// </summary> 
    /// <param name="c"></param> 
    public static void BeginUpdate(Control c) 
    { 
     SendMessage(c.Handle, (int)Message.WM_SETREDRAW, new IntPtr(0), IntPtr.Zero); 
    } 

    /// <summary> 
    /// Calls user32.dll SendMessage(handle, WM_SETREDRAW, 1, null) native function to enable painting 
    /// </summary> 
    /// <param name="c"></param> 
    public static void EndUpdate(Control c) 
    { 
     SendMessage(c.Handle, (int)Message.WM_SETREDRAW, new IntPtr(1), IntPtr.Zero); 
    } 
+1

当窗体未最大化时,窗体大小中有边框大小,当窗体最大化时,窗体边框消失。所以这是不正确的。 – EFanZh

+0

你是对的,我添加了另一个解决方案,创建一个隐藏的表单并返回客户端大小,假设该值与您的表单相同。你可以存储结果,所以你只需要做一次。 –

相关问题