在 XP环境下
  下面是我作的 代码 把SendMessage放到了 dll中DLL代码#include <windows.h>
HHOOK g_hKeyborad=NULL;
HWND m_hwnd=NULL;LRESULT CALLBACK KeyboardProc(
  int code,       // hook code
  WPARAM wParam,  // virtual-key code
  LPARAM lParam   // keystroke-message information
)
{ if(VK_F2==wParam)
{
::SendMessage(m_hwnd,WM_CLOSE,0,0);
UnhookWindowsHookEx(g_hKeyborad); }
return 1;
}
void SetHook(HWND hwnd)
{
m_hwnd=hwnd; g_hKeyborad=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0);
}以下是MFC中OnInitDialog的 代码
_declspec(dllimport) void SetHook(HWND hwnd);BOOL CHookDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
} // Set the icon for this dialog.  The framework does this automatically
//  when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here
g_hWnd=m_hWnd;
 //  g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());
// g_hKeyborad=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());
SetHook(m_hWnd); return TRUE;  // return TRUE  unless you set the focus to a control
}
F2是后门键,这个能屏蔽enter和spare键 但是不能屏蔽
ctrl+Esc和Win键 以及atl+tab

解决方案 »

  1.   

    需要用低级键盘钩子才可以的。屏蔽WIN、ALT+TAB、CTRL+ESC键的低级键盘钩子
    http://www.xiaozhou.net/cooldog/article.asp?id=30
      

  2.   

    //在OnSysCommand里屏蔽所有的系统命令
    void CDZSZDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }
    else
    {
    if ((nID & 0xFFF0) == SC_CLOSE) 
    {
    if  (AfxMessageBox("是否确定退出系统?",MB_YESNO) == IDYES)
    {
    SendMessage(WM_EXIT_SYS,0,0);
    }
    else
    {
    return;
    }
    }
    CDialog::OnSysCommand(nID, lParam);
    }
    }