WIN2K下屏蔽ALT+F4的问题 不要告诉我用OnSysCommand,这样会使我的程序也无法正常关闭不要告诉我用钩子,我不想那么麻烦我重载了OnKeyDown函数但是发现在98下可以,在2K下就失效了该怎么办?最好有代码 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不用钩子是不可能的,2K下一定要使用它!我前一段时间才用钩子实现了评比系统热键的功能。不止Alt+F4,很多键都被我屏蔽了。需要原码和使用说明吗? 应该重载主窗口的WM_CLOSE消息 SeainBlue(爱海):在WM_CLOSE里面怎么处理? LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; TCHAR szHello[MAX_LOADSTRING]; LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); switch (message) { case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: Add any drawing code here... RECT rt; GetClientRect(hWnd, &rt); DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER); EndPaint(hWnd, &ps); break; case MSG_SERVER_WATCHDOG: {// PostMessage(FindWindow( "TWATCHDOG", "WATCHDOG"), PostMessage((HWND)lParam, MSG_SERVER_WATCHDOGACK, wParam, 1); //MessageBeep(MB_ICONEXCLAMATION);// DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); } break; case WM_DESTROY: PostQuitMessage(0); break; case WM_CLOSE: break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0;} http://www.csdn.net/expert/topic/1095/1095526.xml?temp=.7241175 如果是SDI或者MDI的VC工程,只需要处理CMainFrame::OnClose(),对应消息WM_CLOSE,如果是基于对话框的工程,重载对话框的OnCancel()虚函数。原理是:Alt+F4组合键关闭窗口,对于SDI和MDI都是向主窗口发送了WM_CLOSE,而对于对话框,则是运行函数CDialog::OnCancel()同时,CDialog::OnCancel()也是Esc键的响应函数,CDialog::OnOK()是Enter键的响应函数。处理WM_CLOSE消息、OnCancel()、OnOK()就能屏蔽相应的键 根据你程序的条件,如果不想关闭窗口,就不要调用基类的相应函数,例如:CMyMainFrame::OnClose() //处理Alt + F4组合键{ if( 不想关闭 ) return; CMainFrame::OnClose();}CMyDialog::OnCancle() //处理Alt + F4组合键、Esc键{ if( 不想关闭 ) return; CDialog::OnCancle();}CMyDialog::OnOK() //处理Enter键{ if( 不想关闭 ) return; CDialog::OnOK();} 其實用Alt+f4會觸發程序去找到OnCancle();也就是去尋找默認的CDialog::OnCancle();...你只要像樓上的想法做也就可以了.或者說取消CDialog::OnCancle() 如何屏蔽系统低级键?(angerboy发表于2001-8-23 13:41:02) 在windows中,通常只有很少的方法能够中断一些系统事件.我们首先考虑的机制是一个hook,因为微软给hook提供了全面的支持,它也存在于系统中,这样他能够中断某种事件.假如hook部工作的话,那么我考虑API hook. 微软并不想正式的支持API hook,所以如果可能的话,我会尽量的避免使用API hook.幸运的是,这个特别的问题可以通过设置hook来解决.在window NT 4.0 Service Pack 3时候,微软为系统增加了一个低级的键盘hook,WH_KEYBOARD_LL..通常,高级的键盘hook,WH_KEYBOARD,是在一个线程的消息队列中被移走的时候截获的.WH_KEYBOARD hook比大多数的应用程序的优先级要高.然而,有一些击键并没有直接发送到线程的消息队列中. Ctrl+Esc,Alt+Tab就是很好的例子.这些击键在系统的raw输入线程中进行内部处理.由于应用程序不能接收到这些消息,所以应用程序没有办法截获到它们,保护正常的进程.这种行为是为了用户能够切换到另外一个应用程序,不管应用程序的线程已经进入循环,或者挂起.当然,只有很少的应用程序真正的需要截获这些消息.为了适应这些应用程序,微软介绍了一种WH_KEYBOARD_LL hook.这个hook将被用于用户输入后,系统接收到它们之前进行处理.但是这个hook又一个严重的缺点:容易引起无限循环或者挂起. 假如这样发生了,系统就不能正确的处理击键消息了.为了减轻这种痛苦,微软放了一个时间限制在这个hook上面. 当系统发送一个通知给一个低级键盘hook的过滤函数时,系统给这个函数一定的时间去执行.假如在允许时间内没有返回的话,系统将忽略它.并进行正常处理.这个时间通过LowLevelHooksTimeout值来实现(HKEY_CURRENT_USER\Control Panel\Desktop ) /************************************************************************ Module: DisableLowLevelKeys.cpp Notices: Written 2000 Jeffrey Richter **************************************************************************/ #define _WIN32_WINNT 0x0400 #include <Windows.h> ///////////////////////////////////////////////////////////////////////// LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { BOOL fEatKeystroke = FALSE; if (nCode == HC_ACTION) { switch (wParam) { case WM_KEYDOWN: case WM_SYSKEYDOWN: case WM_KEYUP: case WM_SYSKEYUP: PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam; fEatKeystroke = ((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0)) || ((p->vkCode == VK_ESCAPE) && ((p->flags & LLKHF_ALTDOWN) != 0)) || ((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0)); break; } } return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam)); } ///////////////////////////////////////////////////////////////////////// int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) { // Install the low-level keyboard & mouse hooks HHOOK hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hinstExe, 0); // Keep this app running until we’re told to stop MessageBox(NULL, TEXT("Alt+Esc, Ctrl+Esc, and Alt+Tab are now disabled.\n") TEXT("Click \"Ok\" to terminate this application and re-enable these keys."), TEXT("Disable Low-Level Keys"), MB_OK); UnhookWindowsHookEx(hhkLowLevelKybd); return(0); } void CMyTabExampleDlg::OnClose() { // TODO: Add your message handler code here and/or call default if((0x1000&GetKeyState(VK_MENU))&&(0x1000&GetKeyState(VK_F4))) { return; } CDialog::OnClose();} Cline(营营) 的方法很简单实用,推荐大家使用顺便请Cline详细解释一下判断条件是怎么设置的if((0x1000&GetKeyState(VK_MENU))&&(0x1000&GetKeyState(VK_F4))) 这个方法的毛病:按住alt+F4,点出系统菜单,点击"关闭",关不掉...............zhouyonggang(周周) ( ) :找MSDN,上面很清楚。 调用W32ICC.DLL的问题 怎样使屏幕抖动???????? 求助,使用ATL开发基于Edit的控件不能设置文本自动滚动. 两个问题 那位有jrtplib的source发一份给我吗??网上的连接打不开了。 这几天就要去北京打工了,先散200,到京后结帖。。。。 请高手帮忙分析一下我的IIS日志 -菜鸟的简单问题:怎样把一组实际为16进制的字符串转换为10进制整数? 关于CAsyncSocket的多客户端-单服务器端程序!在线等! 如何使用API建立文件的快捷方式? test 怎样在程序运行目录寻找指定文件?
在WM_CLOSE里面怎么处理?
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); switch (message)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
EndPaint(hWnd, &ps);
break;
case MSG_SERVER_WATCHDOG:
{
// PostMessage(FindWindow( "TWATCHDOG", "WATCHDOG"),
PostMessage((HWND)lParam,
MSG_SERVER_WATCHDOGACK, wParam, 1);
//MessageBeep(MB_ICONEXCLAMATION);
// DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
}
break; case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_CLOSE:
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
原理是:
Alt+F4组合键关闭窗口,对于SDI和MDI都是向主窗口发送了WM_CLOSE,而对于对话框,则是运行函数CDialog::OnCancel()
同时,CDialog::OnCancel()也是Esc键的响应函数,CDialog::OnOK()是Enter键的响应函数。处理WM_CLOSE消息、OnCancel()、OnOK()就能屏蔽相应的键
CMyMainFrame::OnClose() //处理Alt + F4组合键
{
if( 不想关闭 )
return;
CMainFrame::OnClose();
}CMyDialog::OnCancle() //处理Alt + F4组合键、Esc键
{
if( 不想关闭 )
return;
CDialog::OnCancle();
}CMyDialog::OnOK() //处理Enter键
{
if( 不想关闭 )
return;
CDialog::OnOK();
}
(angerboy发表于2001-8-23 13:41:02) 在windows中,通常只有很少的方法能够中断一些系统事件.我们首先考虑的机制是一个hook,因为微软给hook提供了全面的支持,它也存在于系统中,这样他能够中断某种事件.假如hook部工作的话,那么我考虑API hook. 微软并不想正式的支持API hook,所以如果可能的话,我会尽量的避免使用API hook.幸运的是,这个特别的问题可以通过设置hook来解决.在window NT 4.0 Service Pack 3时候,微软为系统增加了一个低级的键盘hook,WH_KEYBOARD_LL..通常,高级的键盘hook,WH_KEYBOARD,是在一个线程的消息队列中被移走的时候截获的.WH_KEYBOARD hook比大多数的应用程序的优先级要高.然而,有一些击键并没有直接发送到线程的消息队列中. Ctrl+Esc,Alt+Tab就是很好的例子.这些击键在系统的raw输入线程中进行内部处理.由于应用程序不能接收到这些消息,所以应用程序没有办法截获到它们,保护正常的进程.这种行为是为了用户能够切换到另外一个应用程序,不管应用程序的线程已经进入循环,或者挂起.
当然,只有很少的应用程序真正的需要截获这些消息.为了适应这些应用程序,微软介绍了一种WH_KEYBOARD_LL hook.这个hook将被用于用户输入后,系统接收到它们之前进行处理.但是这个hook又一个严重的缺点:容易引起无限循环或者挂起. 假如这样发生了,系统就不能正确的处理击键消息了.
为了减轻这种痛苦,微软放了一个时间限制在这个hook上面. 当系统发送一个通知给一个低级键盘hook的过滤函数时,系统给这个函数一定的时间去执行.假如在允许时间内没有返回的话,系统将忽略它.并进行正常处理.这个时间通过LowLevelHooksTimeout值来实现(HKEY_CURRENT_USER\Control Panel\Desktop ) /************************************************************************
Module: DisableLowLevelKeys.cpp
Notices: Written 2000 Jeffrey Richter
**************************************************************************/ #define _WIN32_WINNT 0x0400
#include <Windows.h> /////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK LowLevelKeyboardProc(int nCode,
WPARAM wParam, LPARAM lParam) { BOOL fEatKeystroke = FALSE; if (nCode == HC_ACTION) {
switch (wParam) {
case WM_KEYDOWN: case WM_SYSKEYDOWN:
case WM_KEYUP: case WM_SYSKEYUP:
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
fEatKeystroke =
((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||
((p->vkCode == VK_ESCAPE) &&
((p->flags & LLKHF_ALTDOWN) != 0)) ||
((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) &
0x8000) != 0));
break;
}
}
return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam,
lParam));
} /////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) { // Install the low-level keyboard & mouse hooks
HHOOK hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL,
LowLevelKeyboardProc, hinstExe, 0); // Keep this app running until we’re told to stop
MessageBox(NULL,
TEXT("Alt+Esc, Ctrl+Esc, and Alt+Tab are now disabled.\n")
TEXT("Click \"Ok\" to terminate this application and re-enable
these keys."),
TEXT("Disable Low-Level Keys"), MB_OK);
UnhookWindowsHookEx(hhkLowLevelKybd);
return(0);
}
{
// TODO: Add your message handler code here and/or call default
if((0x1000&GetKeyState(VK_MENU))&&(0x1000&GetKeyState(VK_F4)))
{
return;
}
CDialog::OnClose();
}
if((0x1000&GetKeyState(VK_MENU))&&(0x1000&GetKeyState(VK_F4)))
按住alt+F4,点出系统菜单,点击"关闭",关不掉...............zhouyonggang(周周) ( ) :找MSDN,上面很清楚。