最近在做一个登陆窗口的时候,把WinForm的FormBorderStyle改成了None,然后自己贴图来实现最小化和关闭按钮,用PictureBox来做最小化按钮,单击事件的代码如下:        private void pictureBoxMinimize_Click(object sender, EventArgs e)
        {
            int code = SendMessage(this.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
            Console.WriteLine("SendMessage返回值为:" + code);
        }其中消息常量和SendMessage为public const int WM_SYSCOMMAND = 0x0112;
public const int SC_MINIMIZE = 0xF020;
[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int message, int wParam, int lParam);不知道为什么SendMessage无效(SendMessage返回值为0),窗口没有反应,我重写了WndProc,发现确实能捕获到WM_SYSCOMMAND,并且wParam的值为SC_MINIMIZE。
请教高手,上面的做法有错吗?原因是什么?
WinFormC#SendMessage最小化

解决方案 »

  1.   

    this.WindowState=FormWindowState.Minimized不就行了,为何要发消息?
      

  2.   

    不需要用句柄
    this.WindowState=FormWindowState.Minimized
    或者this.Hide()
      

  3.   

    请用 PostMessage 代替 SendMessage
      

  4.   


            private void button1_Click(object sender, EventArgs e)
            {
                int code = SendMessage(this.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);  // 1            Console.WriteLine("SendMessage返回值为:" + code);  //3
            }        protected override void WndProc(ref Message m)
            {
                if (m.Msg == WM_SYSCOMMAND && m.WParam.ToInt32() == SC_MINIMIZE)  
                {
                    int a = 10;
                    int b = a;    //  2
                }
                base.WndProc(ref m);
            }
    注意以上代码执行顺序  1-》2-》3SendMessage发送的消息是不会经过UI线程消息队列的  也就是说 SendMessage直接调用窗口过程  调用完之后才返回  而PostMessage发送消息到消息队列  马上就返回代码中3处 还没执行完(Click事件处理程序没返回)  却先调用了WndProc  base.WndProc中即使处理了最小化消息  也是没用的Winform中最好不要使用Win API    除非万不得已  不然你完全可以去学MFC
    WInform中Windows消息请参见 http://www.cnblogs.com/xiaozhi_5638/archive/2013/01/03/2843374.html
      

  5.   

    成功了,改成PostMessage是可以的。
    1楼的方法也可行,之前不知道有这个方法(真是孤陋寡闻)。
    3楼的话,如果直接用Hide,在任务栏就没有了,不符合我的要求。
    非常感谢,特别是5楼,说得很详细,结贴了。