// InnerHookDlg.cpp : implementation file //  #include "stdafx.h" #include "InnerHook.h" #include "InnerHookDlg.h"  #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif  ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About  class CAboutDlg : public CDialog { public:  CAboutDlg();  // Dialog Data  //{{AFX_DATA(CAboutDlg)  enum { IDD = IDD_ABOUTBOX };  //}}AFX_DATA   // ClassWizard generated virtual function overrides  //{{AFX_VIRTUAL(CAboutDlg)  protected:  virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support  //}}AFX_VIRTUAL  // Implementation protected:  //{{AFX_MSG(CAboutDlg)  //}}AFX_MSG  DECLARE_MESSAGE_MAP() };  CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) {  //{{AFX_DATA_INIT(CAboutDlg)  //}}AFX_DATA_INIT }  void CAboutDlg::DoDataExchange(CDataExchange* pDX) {  CDialog::DoDataExchange(pDX);  //{{AFX_DATA_MAP(CAboutDlg)  //}}AFX_DATA_MAP }  BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)  //{{AFX_MSG_MAP(CAboutDlg)   // No message handlers  //}}AFX_MSG_MAP END_MESSAGE_MAP()  ///////////////////////////////////////////////////////////////////////////// // CInnerHookDlg dialog  CInnerHookDlg::CInnerHookDlg(CWnd* pParent /*=NULL*/)  : CDialog(CInnerHookDlg::IDD, pParent) {  //{{AFX_DATA_INIT(CInnerHookDlg)   // NOTE: the ClassWizard will add member initialization here  //}}AFX_DATA_INIT  // Note that LoadIcon does not require a subsequent DestroyIcon in Win32  m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }  void CInnerHookDlg::DoDataExchange(CDataExchange* pDX) {  CDialog::DoDataExchange(pDX);  //{{AFX_DATA_MAP(CInnerHookDlg)   // NOTE: the ClassWizard will add DDX and DDV calls here  //}}AFX_DATA_MAP }  BEGIN_MESSAGE_MAP(CInnerHookDlg, CDialog)  //{{AFX_MSG_MAP(CInnerHookDlg)  ON_WM_SYSCOMMAND()  ON_WM_PAINT()  ON_WM_QUERYDRAGICON()  ON_WM_CHAR()  //}}AFX_MSG_MAP END_MESSAGE_MAP()  ///////////////////////////////////////////////////////////////////////////// // CInnerHookDlg message handlers  HHOOK g_hMouseHook; HHOOK g_hKeyHook; HHOOK g_hKeyHook2; HWND g_hWnd; LRESULT CALLBACK MouseProc(          int nCode,      // hook code          WPARAM wParam,  // message identifier          LPARAM lParam   // mouse coordinates          ) {  return 1; }  LRESULT CALLBACK KeyboardProc2(          int code,       // hook code          WPARAM wParam,  // virtual-key code          LPARAM lParam   // keystroke-message information          ) {  if(VK_F2 == wParam)  {   AfxMessageBox("安下了f2");   return 1;  }  else CallNextHookEx(g_hKeyHook2,code,wParam,lParam); } LRESULT CALLBACK KeyboardProc(          int code,       // hook code          WPARAM wParam,  // virtual-key code          LPARAM lParam   // keystroke-message information          ) {  if(wParam == VK_SPACE){   TRACE("空格被阻止\n");   //AfxMessageBox("Key Down");   return 1;  }  else if(wParam == VK_F4 && lParam>>29 & 1)  {   TRACE("alt + f4 pressed");   return 1;  }  else if(wParam == VK_F2)  {   ::SendMessage(g_hWnd,WM_CLOSE,0,0);   UnhookWindowsHookEx(g_hKeyHook);   UnhookWindowsHookEx(g_hKeyHook2);   return 1;  }  else  {   TRACE("没有阻止\n");   return CallNextHookEx(g_hKeyHook,code,wParam,lParam);  } }  BOOL CInnerHookDlg::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_hMouseHook = SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());  g_hWnd = this->m_hWnd;    g_hKeyHook= SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());  g_hKeyHook2 = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc2,NULL,GetCurrentThreadId());    return TRUE;  // return TRUE  unless you set the focus to a control }  void CInnerHookDlg::OnSysCommand(UINT nID, LPARAM lParam) {  if ((nID & 0xFFF0) == IDM_ABOUTBOX)  {   CAboutDlg dlgAbout;   dlgAbout.DoModal();  }  else  {   CDialog::OnSysCommand(nID, lParam);  } }  // If you add a minimize button to your dialog, you will need the code below //  to draw the icon.  For MFC applications using the document/view model, //  this is automatically done for you by the framework.  void CInnerHookDlg::OnPaint()  {  if (IsIconic())  {   CPaintDC dc(this); // device context for painting    SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);    // Center icon in client rectangle   int cxIcon = GetSystemMetrics(SM_CXICON);   int cyIcon = GetSystemMetrics(SM_CYICON);   CRect rect;   GetClientRect(&rect);   int x = (rect.Width() - cxIcon + 1) / 2;   int y = (rect.Height() - cyIcon + 1) / 2;    // Draw the icon   dc.DrawIcon(x, y, m_hIcon);  }  else  {   CDialog::OnPaint();  } }  // The system calls this to obtain the cursor to display while the user drags //  the minimized window. HCURSOR CInnerHookDlg::OnQueryDragIcon() {  return (HCURSOR) m_hIcon; }  void CInnerHookDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)  {  // TODO: Add your message handler code here and/or call default  CString str;  str.Format("char:%c,code:%d",nChar,nChar);  MessageBox(str);  CDialog::OnChar(nChar, nRepCnt, nFlags); }