CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

高分求键盘钩子源码

楼主avbnm54321()2004-12-04 15:55:19 在 VC/MFC / 基础类 提问

需要可用组合键,例如   CTRL+ALT+Y  
  讯息的处理在主程序,DLL只处理发送讯息就好  
  顺道说一下主程序的WNDPROC怎么处理参数 问题点数:100、回复次数:11Top

1 楼mmzr(非法操作)回复于 2004-12-04 16:01:25 得分 30

1       声明热键消息处理函数原型          
    在.h中消息映射声明处(AFX_mSG字样之后)加入如下语句:          
    LRESULT     OnHotKey(WPARAM     wParam,LPARAM     lParam);          
  2.     消息与相应处理函数相关联          
    在.Cpp中加入消息映射宏,使消息与相应处理函数发生关系,      
                ON_MESSAGE(WM_HOTKEY,OnHotKey);          
  3.     为方便以后的操作    
          预先在类中创建一个响应WM_CREATE和WM_DESTROY消息的函数      
                OnCreate()与OnDestroy()的框架  
  4.向系统登记热键          
    在OnCreate()函数中加入如下代码以向系统登记热键,本例子的热键设为      
                Ctrl+Shift+A.          
    RegisterHotKey(m_hWnd,1001,MOD_CONTROL|MOD_SHIFT,'A');          
    RegisterHotKey(m_hWnd,1002,MOD_CONTROL|MOD_SHIFT,'a');          
    5.处理热键          
    在消息处理函数OnHotKey()中对热键进行处理,并可加入用户希望运行的程序代码      
    LRESULT   C****::OnHotKey(WPARAM     wParam,LPARAM     lParam)          
    if(wParam==1001||wParam==1002)          
    CWnd::SetForegroundWindow();//使得被激活窗口出现在前景          
    MessageBox("Hello!");          
                   //用户可在此添加代码          
    return     0;          
    6.程序运行完毕后解除热键          
    在OnDestroy()中通过UnRegisterHotKey()解除热键登记,释放系统资源.          
    UnRegisterHotKey(m_hWnd,1001);          
    UnRegisterHotKey(m_hWnd,1002);          
    7.编译并运行程序  
  Top

2 楼EnochShen(小疯子:真的好菜—知耻而后勇!)回复于 2004-12-04 16:12:15 得分 30

EnochShen@qq.com来问我要吧。Top

3 楼mmzr(非法操作)回复于 2004-12-04 16:22:24 得分 0

下面是实现底层键盘钩子的部分源代码:    
   
  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)    
  {    
    //安装底层键盘钩子  
    HHOOK   hhkLowLevelKybd   =   SetWindow    
    sHookEx(WH_KEYBOARD_LL,   LowLevelKeyboardProc,   hinstExe,   0);    
    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);    
  }  
   
  在低于Windows   NT   4.0   SP2的NT操作系统下    
   
    很遗憾,笔者在低于Windows   NT   4.0   SP2或更低版本的NT操作系统下没有找到能屏蔽掉所有的系统热键的方法,本文介绍的方法仅仅可以屏蔽Alt+Tab和Alt+Esc。该方法是使用RegisterHotKey函数,在调用该函数后进程会在Alt+Tab按下时比系统优先一步得到通知。程序员需要处理的消息是WM_HOTKEY。    
   
    RegisterHotKey函数原型如下:    
   
    BOOL   RegisterHotKey(HWND   hWnd,int   id,UINT   fsModifiers,UINT   vk);    
   
    其中,参数id为自定义的一个ID值,对一个线程来讲其值必需在0x0000~0xBFFF范围之内,对DLL来讲其值必需在0xC000~0xFFFF   范围之内,在同一进程内该值必须唯一;参数fsModifiers指明与热键联合使用的按键,可取值为:MOD_ALT、MOD_CONTROL、MOD_WIN和MOD_SHIFT;参数vk指明热键的虚拟键码。    
   
    //   初始化    
    CMainFrame::CMainFrame()    
    {    
     m_nHotKeyID   =   100;    
     BOOL   m_isKeyRegistered   =   RegisterHotKey   ;  
     (GetSafeHwnd(),   m_nHotKeyID,MOD_ALT,   VK_TAB);    
     ASSERT(m_isKeyRegistered   !=   FALSE);    
    }    
   
    //取消    
    CMainFrame::~CMainFrame()    
    {    
     BOOL   m_iskeyUnregistered   =   UnregisterHotKey(GetSafeHwnd(),   m_nHotKeyID);    
     ASSERT(m_isKeyUnregistered   !=   FALSE);    
    }    
   
    最后需要在文件中定义ON_MESSAGE消息映射。在头文件中添加如下代码:    
    class   CMainFrame   :   public   XXXX    
    {    
     afx_msg   LONG   OnHotKey(WPARAM   wP,   LPARAM   lP);    
    }    
   
    在CPP文件中的MESSAGE_MAP处添加代码:    
   
    ON_MESSAGE(WM_HOTKEY,OnHotKey)    
   
    则该热键在进程运行时一直有效,在进程结束后其状态会被系统自动恢复。    
  Top

4 楼avbnm54321()回复于 2004-12-04 16:27:39 得分 0

EnochShen(小疯子抢分了,拦我者重伤!)    
  信件已经发过去了有收到吗?  
   
  请问各位有现成的源码吗,我想直接用就好了  
  谢谢各位大侠Top

5 楼laiyiling(陌生人[MVP])回复于 2004-12-04 16:29:46 得分 5

http://www.vckbase.com/document/viewdoc/?id=271Top

6 楼hjunxu(hjun)回复于 2004-12-04 16:38:24 得分 10

#define   NUMHOOKS   7    
     
  //   Global   variables    
     
  typedef   struct   _MYHOOKDATA    
  {    
          int   nType;    
          HOOKPROC   hkprc;    
          HHOOK   hhook;    
  }   MYHOOKDATA;    
     
  MYHOOKDATA   myhookdata[NUMHOOKS];    
     
  LRESULT   WINAPI   MainWndProc(HWND   hwndMain,   UINT   uMsg,   WPARAM   wParam,    
          LPARAM   lParam)    
  {    
          static   BOOL   afHooks[NUMHOOKS];    
          int   index;    
          static   HMENU   hmenu;    
     
          switch   (uMsg)    
          {    
                  case   WM_CREATE:    
     
                          //   Save   the   menu   handle.    
     
                          hmenu   =   GetMenu(hwndMain);    
     
                          //   Initialize   structures   with   hook   data.   The   menu-item    
                          //   identifiers   are   defined   as   0   through   6   in   the    
                          //   header   file.   They   can   be   used   to   identify   array    
                          //   elements   both   here   and   during   the   WM_COMMAND    
                          //   message.    
     
                          myhookdata[IDM_CALLWNDPROC].nType   =   WH_CALLWNDPROC;    
                          myhookdata[IDM_CALLWNDPROC].hkprc   =   CallWndProc;    
                          myhookdata[IDM_CBT].nType   =   WH_CBT;    
                          myhookdata[IDM_CBT].hkprc   =   CBTProc;    
                          myhookdata[IDM_DEBUG].nType   =   WH_DEBUG;    
                          myhookdata[IDM_DEBUG].hkprc   =   DebugProc;    
                          myhookdata[IDM_GETMESSAGE].nType   =   WH_GETMESSAGE;    
                          myhookdata[IDM_GETMESSAGE].hkprc   =   GetMsgProc;    
                          myhookdata[IDM_KEYBOARD].nType   =   WH_KEYBOARD;    
                          myhookdata[IDM_KEYBOARD].hkprc   =   KeyboardProc;    
                          myhookdata[IDM_MOUSE].nType   =   WH_MOUSE;    
                          myhookdata[IDM_MOUSE].hkprc   =   MouseProc;    
                          myhookdata[IDM_MSGFILTER].nType   =   WH_MSGFILTER;    
                          myhookdata[IDM_MSGFILTER].hkprc   =   MessageProc;    
     
                          //   Initialize   all   flags   in   the   array   to   FALSE.    
     
                          memset(afHooks,   FALSE,   sizeof(afHooks));    
     
                          return   0;    
     
                  case   WM_COMMAND:    
                          switch   (LOWORD(wParam))    
                          {    
                                    //   The   user   selected   a   hook   command   from   the   menu.    
     
                                  case   IDM_CALLWNDPROC:    
                                  case   IDM_CBT:    
                                  case   IDM_DEBUG:    
                                  case   IDM_GETMESSAGE:    
                                  case   IDM_KEYBOARD:    
                                  case   IDM_MOUSE:    
                                  case   IDM_MSGFILTER:    
     
                                          //   Use   the   menu-item   identifier   as   an   index    
                                          //   into   the   array   of   structures   with   hook   data.    
     
                                          index   =   LOWORD(wParam);    
     
                                          //   If   the   selected   type   of   hook   procedure   isn't    
                                          //   installed   yet,   install   it   and   check   the    
                                          //   associated   menu   item.    
     
                                          if   (!afHooks[index])    
                                          {    
                                                  myhookdata[index].hhook   =   SetWindowsHookEx(    
                                                          myhookdata[index].nType,    
                                                          myhookdata[index].hkprc,    
                                                          (HINSTANCE)   NULL,   GetCurrentThreadId());    
                                                  CheckMenuItem(hmenu,   index,    
                                                          MF_BYCOMMAND   |   MF_CHECKED);    
                                                  afHooks[index]   =   TRUE;    
                                          }    
     
                                          //   If   the   selected   type   of   hook   procedure   is    
                                          //   already   installed,   remove   it   and   remove   the    
                                          //   check   mark   from   the   associated   menu   item.    
     
                                          else    
                                          {    
                                                  UnhookWindowsHookEx(myhookdata[index].hhook);    
                                                  CheckMenuItem(hmenu,   index,    
                                                          MF_BYCOMMAND   |   MF_UNCHECKED);    
                                                  afHooks[index]   =   FALSE;    
                                          }    
     
                                  default:    
                                          return   (DefWindowProc(hwndMain,   uMsg,   wParam,    
                                                  lParam));    
                          }    
                          break;    
     
                          //  
                          //   Process   other   messages.    
                          //  
     
                  default:    
                          return   DefWindowProc(hwndMain,   uMsg,   wParam,   lParam);    
          }    
          return   NULL;    
  }Top

7 楼hjunxu(hjun)回复于 2004-12-04 16:39:48 得分 0

/****************************************************************    
      WH_CALLWNDPROC   hook   procedure    
    ****************************************************************/    
     
  LRESULT   WINAPI   CallWndProc(int   nCode,   WPARAM   wParam,   LPARAM   lParam)    
  {    
          CHAR   szCWPBuf[256];    
          CHAR   szMsg[16];    
          HDC   hdc;    
          static   int   c   =   0;    
          int   cch;    
     
          if   (nCode   <   0)     //   do   not   process   message    
                  return   CallNextHookEx(myhookdata[CALLWNDPROC].hhook,   nCode,    
                                  wParam,   lParam);    
     
          //   Call   an   application-defined   function   that   converts   a   message    
          //   constant   to   a   string   and   copies   it   to   a   buffer.    
     
          LookUpTheMessage((PMSG)   lParam,   szMsg);    
     
          hdc   =   GetDC(hwndMain);    
     
          switch   (nCode)    
          {    
                  case   HC_ACTION:    
                          cch   =   wsprintf(szCWPBuf,    
                                "CALLWNDPROC   -   tsk:   %ld,   msg:   %s,   %d   times       ",    
                                  wParam,   szMsg,   c++);    
                          TextOut(hdc,   2,   15,   szCWPBuf,   cch);    
                          break;    
     
                  default:    
                          break;    
          }    
     
          ReleaseDC(hwndMain,   hdc);    
          return   CallNextHookEx(myhookdata[CALLWNDPROC].hhook,   nCode,    
                  wParam,   lParam);    
  }    
     
  /****************************************************************    
      WH_GETMESSAGE   hook   procedure    
    ****************************************************************/    
     
  LRESULT   CALLBACK   GetMsgProc(int   nCode,   WPARAM   wParam,   LPARAM   lParam)    
  {    
          CHAR   szMSGBuf[256];    
          CHAR   szRem[16];    
          CHAR   szMsg[16];    
          HDC   hdc;    
          static   int   c   =   0;    
          int   cch;    
     
          if   (nCode   <   0)   //   do   not   process   message    
                  return   CallNextHookEx(myhookdata[GETMESSAGE].hhook,   nCode,    
                          wParam,   lParam);    
     
          switch   (nCode)    
          {    
                  case   HC_ACTION:    
                          switch   (wParam)    
                          {    
                                  case   PM_REMOVE:    
                                          lstrcpy(szRem,   "PM_REMOVE");    
                                          break;    
     
                                  case   PM_NOREMOVE:    
                                          lstrcpy(szRem,   "PM_NOREMOVE");    
                                          break;    
     
                                  default:    
                                          lstrcpy(szRem,   "Unknown");    
                                          break;    
                          }    
     
                          //   Call   an   application-defined   function   that   converts   a    
                          //   message   constant   to   a   string   and   copies   it   to   a    
                          //   buffer.    
     
                          LookUpTheMessage((PMSG)   lParam,   szMsg);    
     
                          hdc   =   GetDC(hwndMain);    
                          cch   =   wsprintf(szMSGBuf,    
                                  "GETMESSAGE   -   wParam:   %s,   msg:   %s,   %d   times       ",    
                                  szRem,   szMsg,   c++);    
                          TextOut(hdc,   2,   35,   szMSGBuf,   cch);    
                          break;    
     
                  default:    
                          break;    
          }    
     
          ReleaseDC(hwndMain,   hdc);    
          return   CallNextHookEx(myhookdata[GETMESSAGE].hhook,   nCode,    
                  wParam,   lParam);    
  }    
     
  /****************************************************************    
      WH_DEBUG   hook   procedure    
    ****************************************************************/    
     
  LRESULT   CALLBACK   DebugProc(int   nCode,   WPARAM   wParam,   LPARAM   lParam)    
  {    
          CHAR   szBuf[128];    
          HDC   hdc;    
          static   int   c   =   0;    
          int   cch;    
     
          if   (nCode   <   0)     //   do   not   process   message    
                  return   CallNextHookEx(myhookdata[DEBUG].hhook,   nCode,    
                          wParam,   lParam);    
     
          hdc   =   GetDC(hwndMain);    
     
          switch   (nCode)    
          {    
                  case   HC_ACTION:    
                          cch   =   wsprintf(szBuf,    
                                  "DEBUG   -   nCode:   %d,   tsk:   %ld,   %d   times       ",    
                                  nCode,wParam,   c++);    
                          TextOut(hdc,   2,   55,   szBuf,   cch);    
                          break;    
     
                  default:    
                          break;    
          }    
     
          ReleaseDC(hwndMain,   hdc);    
          return   CallNextHookEx(myhookdata[DEBUG].hhook,   nCode,   wParam,    
                  lParam);    
  }Top

8 楼hjunxu(hjun)回复于 2004-12-04 16:40:21 得分 0

/****************************************************************    
      WH_CBT   hook   procedure    
    ****************************************************************/    
     
  LRESULT   CALLBACK   CBTProc(int   nCode,   WPARAM   wParam,   LPARAM   lParam)    
  {    
          CHAR   szBuf[128];    
          CHAR   szCode[128];    
          HDC   hdc;    
          static   int   c   =   0;    
          int   cch;    
     
          if   (nCode   <   0)     //   do   not   process   message    
                  return   CallNextHookEx(myhookdata[CBT].hhook,   nCode,   wParam,    
                          lParam);    
     
          hdc   =   GetDC(hwndMain);    
     
          switch   (nCode)    
          {    
                  case   HCBT_ACTIVATE:    
                          lstrcpy(szCode,   "HCBT_ACTIVATE");    
                          break;    
     
                  case   HCBT_CLICKSKIPPED:    
                          lstrcpy(szCode,   "HCBT_CLICKSKIPPED");    
                          break;    
     
                  case   HCBT_CREATEWND:    
                          lstrcpy(szCode,   "HCBT_CREATEWND");    
                          break;    
     
                  case   HCBT_DESTROYWND:    
                          lstrcpy(szCode,   "HCBT_DESTROYWND");    
                          break;    
     
                  case   HCBT_KEYSKIPPED:    
                          lstrcpy(szCode,   "HCBT_KEYSKIPPED");    
                          break;    
     
                  case   HCBT_MINMAX:    
                          lstrcpy(szCode,   "HCBT_MINMAX");    
                          break;    
     
                  case   HCBT_MOVESIZE:    
                          lstrcpy(szCode,   "HCBT_MOVESIZE");    
                          break;    
     
                  case   HCBT_QS:    
                          lstrcpy(szCode,   "HCBT_QS");    
                          break;    
     
                  case   HCBT_SETFOCUS:    
                          lstrcpy(szCode,   "HCBT_SETFOCUS");    
                          break;    
     
                  case   HCBT_SYSCOMMAND:    
                          lstrcpy(szCode,   "HCBT_SYSCOMMAND");    
                          break;    
     
                  default:    
                          lstrcpy(szCode,   "Unknown");    
                          break;    
          }    
     
          cch   =   wsprintf(szBuf,   "CBT   -   nCode:   %s,   tsk:   %ld,   %d   times       ",    
                  szCode,   wParam,   c++);    
          TextOut(hdc,   2,   75,   szBuf,   cch);    
          ReleaseDC(hwndMain,   hdc);    
          return   CallNextHookEx(myhookdata[CBT].hhook,   nCode,   wParam,    
                  lParam);    
  }    
     
  /****************************************************************    
      WH_MOUSE   hook   procedure    
    ****************************************************************/    
     
  LRESULT   CALLBACK   MouseProc(int   nCode,   WPARAM   wParam,   LPARAM   lParam)    
  {    
          CHAR   szBuf[128];    
          CHAR   szMsg[16];    
          HDC   hdc;    
          static   int   c   =   0;    
          int   cch;    
     
          if   (nCode   <   0)     //   do   not   process   the   message    
                  return   CallNextHookEx(myhookdata[MOUSE].hhook,   nCode,    
                          wParam,   lParam);    
     
          //   Call   an   application-defined   function   that   converts   a   message    
          //   constant   to   a   string   and   copies   it   to   a   buffer.    
     
          LookUpTheMessage((PMSG)   lParam,   szMsg);    
     
          hdc   =   GetDC(hwndMain);    
          cch   =   wsprintf(szBuf,    
                  "MOUSE   -   nCode:   %d,   msg:   %s,   x:   %d,   y:   %d,   %d   times       ",    
                  nCode,   szMsg,   LOWORD(lParam),   HIWORD(lParam),   c++);    
          TextOut(hdc,   2,   95,   szBuf,   cch);    
          ReleaseDC(hwndMain,   hdc);    
          return   CallNextHookEx(myhookdata[MOUSE].hhook,   nCode,   wParam,    
                  lParam);    
  }    
     
  /****************************************************************    
      WH_KEYBOARD   hook   procedure    
    ****************************************************************/    
     
  LRESULT   CALLBACK   KeyboardProc(int   nCode,   WPARAM   wParam,   LPARAM   lParam)    
  {    
          CHAR   szBuf[128];    
          HDC   hdc;    
          static   int   c   =   0;    
          int   cch;    
     
          if   (nCode   <   0)     //   do   not   process   message    
                  return   CallNextHookEx(myhookdata[KEYBOARD].hhook,   nCode,    
                          wParam,   lParam);    
     
          hdc   =   GetDC(hwndMain);    
          cch   =   wsprintf(szBuf,   "KEYBOARD   -   nCode:   %d,   vk:   %d,   %d   times   ",    
                  nCode,   wParam,   c++);    
          TextOut(hdc,   2,   115,   szBuf,   cch);    
          ReleaseDC(hwndMain,   hdc);    
          return   CallNextHookEx(myhookdata[KEYBOARD].hhook,   nCode,   wParam,    
                  lParam);    
  }    
     
  /****************************************************************    
      WH_MSGFILTER   hook   procedure    
    ****************************************************************/    
     
  LRESULT   CALLBACK   MessageProc(int   nCode,   WPARAM   wParam,   LPARAM   lParam)    
  {    
          CHAR   szBuf[128];    
          CHAR   szMsg[16];    
          CHAR   szCode[32];    
          HDC   hdc;    
          static   int   c   =   0;    
          int   cch;    
     
          if   (nCode   <   0)     //   do   not   process   message    
                  return   CallNextHookEx(myhookdata[MSGFILTER].hhook,   nCode,    
                          wParam,   lParam);    
     
          switch   (nCode)    
          {    
                  case   MSGF_DIALOGBOX:    
                          lstrcpy(szCode,   "MSGF_DIALOGBOX");    
                          break;    
     
                  case   MSGF_MENU:    
                          lstrcpy(szCode,   "MSGF_MENU");    
                          break;    
     
                  case   MSGF_SCROLLBAR:    
                          lstrcpy(szCode,   "MSGF_SCROLLBAR");    
                          break;    
     
                  default:    
                          wsprintf(szCode,   "Unknown:   %d",   nCode);    
                          break;    
          }    
     
          //   Call   an   application-defined   function   that   converts   a   message    
          //   constant   to   a   string   and   copies   it   to   a   buffer.    
     
          LookUpTheMessage((PMSG)   lParam,   szMsg);    
     
          hdc   =   GetDC(hwndMain);    
          cch   =   wsprintf(szBuf,    
                  "MSGFILTER     nCode:   %s,   msg:   %s,   %d   times         ",    
                  szCode,   szMsg,   c++);    
          TextOut(hdc,   2,   135,   szBuf,   cch);    
          ReleaseDC(hwndMain,   hdc);    
          return   CallNextHookEx(myhookdata[MSGFILTER].hhook,   nCode,    
                  wParam,   lParam);    
  }    
  Top

9 楼avbnm54321()回复于 2004-12-04 18:30:16 得分 0

各位大侠的答案好像跟我要的有点不一样;  
  可以有谁给我一份源码就好吗?  
  我自己研究看看,刚刚回的答案好像都有点不够我需要的***  
  Top

10 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-12-04 19:27:48 得分 0

作一个llkeyboard的hook  
  然后处理CTRL+ALT+Y按键Top

11 楼longyii(【深渊上的缥缈】)(☆)回复于 2004-12-05 00:18:16 得分 25

我已经在另一贴里回复了  
  邮件也发过去了Top

相关问题

  • 有关键盘钩子函数的使用!(源码分析)
  • 键盘钩子
  • 键盘钩子
  • 实用代码:【源码下载】全局键盘钩子的VB实现
  • 谁能给我一份鼠标和键盘全局钩子的源码。谢谢
  • 50分请教 获得键盘的全局钩子的问题。?????
  • 200分做个键盘钩子,(详细内容见里面)
  • 100分,求键盘钩子源代码,不够可另开贴
  • 100分,求键盘钩子源代码,不够可另开贴
  • 键盘钩子的问题

关键词

  • 函数
  • 键盘
  • 映射
  • 消息
  • 代码
  • 热键
  • nhotkeyid
  • registerhotkey
  • myhookdata
  • onhotkey

得分解答快速导航

  • 帖主:avbnm54321
  • mmzr
  • EnochShen
  • laiyiling
  • hjunxu
  • longyii

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo