例子:
单击按钮后,先使用EnableWindow函数禁止按钮接收鼠标消息与键盘消息。然后执行长时间操作。最后使用EnableWindow函数允许按钮接收鼠标消息与键盘消息。以此来防止用户多次单击按钮。
但是,按照以上思路在使用EnableWindow函数的过程中会造成EnableWindow函数"失效",而造成多次单击按钮的现象。
原因:
使用EnableWindow函数禁用按钮后,在线程执行长时间操作的过程中,未能及时处理EnableWindow函数产生的消息,且此时用户多次单击按钮,在最后使用EnableWindow函数启用按钮后,系统会将之前未处理的WM_LBUTTONDOWN与WM_LBUTTONUP消息插入线程的消息队列。因此,造成了多次单击按钮的现象。
解决办法以下两种:
1、在执行长时间操作前,先处理EnableWindow函数产生的消息。
2、在长时间操作完成后,使用PeekMessage函数删除按钮所有的WM_LBUTTONDOWN消息。
代码如下:
以下仅列出办法2的代码
LRESULT CALLBACK LoginWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
MSG msg;
switch(uMsg)
{
.
.
.
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case BUTTON_ID: //按钮ID
{
//禁用按钮
EnableWindow(button_hwnd,0);
//使用Sleep函数模拟长时间操作
Sleep(5000);
//启用按钮
EnableWindow(button_hwnd,1);
//将消息队列中属于按钮的WM_LBUTTONDOWN消息与WM_LBUTTONUP消息清除
while(PeekMessage(&msg,button_hwnd,\
WM_LBUTTONDOWN,WM_LBUTTONUP,PM_REMOVE));
return 0;
}
}
.
.
.
}
}