最近在做一个登陆窗口的时候,把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最小化
{
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最小化
解决方案 »
- 想做一个系统,大家帮忙推荐一下
- 关于帮助文件弹出问题
- XtraGrid中的容易忽视的问题???
- 多用户选择的控件
- 在winform下DataGrid上的列名怎么能显示成汉字?除了用(select id as 序号)这种做法!
- 有个C++的计算24的程序,想把他转为C#的命令行程序,可遇到问题
- NMS怎么实现ActiveMQ的连接?挑战高手
- 请教!DBGRID怎样锁定第一列?
- 请问 http://www.microsoft.com/china/msdn/default.asp 跑哪儿去了?
- 求教:C#中怎样在dbgrid中显示dataset中部分字段内容,怎样用两个DBGrid显示两个一对多关系的表。
- 请教dataGridView单元格能双击选中复制,但不能编辑的方法
- metro中怎么取到一个文件下的所有文件
this.WindowState=FormWindowState.Minimized
或者this.Hide()
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
1楼的方法也可行,之前不知道有这个方法(真是孤陋寡闻)。
3楼的话,如果直接用Hide,在任务栏就没有了,不符合我的要求。
非常感谢,特别是5楼,说得很详细,结贴了。