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

●●◎怎么截获某个键?100分◎●●

楼主ynkmsun(sun)2003-12-03 21:37:56 在 C++ Builder / 基础类 提问

我想做一个程序,运行之后用来截F1键,然后调用运行一个外部EXE文件,并想把这个程序的图标缩在任务栏的右边的区域。  
   
  请大哥们帮帮我! 问题点数:100、回复次数:13Top

1 楼pzoon(杀死日本人)回复于 2003-12-03 21:46:53 得分 0

UP  
  DEMO里有一个获取图标的,但是你的截获里面没有了,你找一找,很多帖子有Top

2 楼codecb(阿星)回复于 2003-12-03 22:13:11 得分 0

可以注册个热键  
  注册热键方法可以搜索下Top

3 楼huoniao1976(火鸟1976)回复于 2003-12-04 08:45:35 得分 0

Form1->KeyPreview   =   true;  
   
  在自己定义消息,把图标加到系统托盘中  
   
  Top

4 楼huoniao1976(火鸟1976)回复于 2003-12-04 08:46:38 得分 0

Form1->KeyPreview   =   true;  
   
  switch(Key){  
  case   VK_F1:  
  ...Top

5 楼goneaway1981(当我们踏上征程)回复于 2003-12-04 09:16:15 得分 0

同意楼上Top

6 楼yunuo2010000(允诺)回复于 2003-12-04 14:18:27 得分 0

Form1->KeyPreview   =   true;  
   
  在窗体的OnKeyDown事件下写  
   
  if   (Key=112)  
      Key=0;     //如果键值为F1则屏蔽该键值。Top

7 楼bcbsoft(苍之雪)回复于 2003-12-04 17:54:12 得分 70

Form1->KeyPreview   =   true;  
  这种方法不行!  
  //---------------------------  
   
  .h   中这样做:  
   
  private: //   User   declarations  
                  void   __fastcall   OnHotKey(TMessage&   Msg);  
   
  public: //   User   declarations  
                  BEGIN_MESSAGE_MAP  
   
                      MESSAGE_HANDLER(WM_HOTKEY,   TMessage,   OnHotKey)  
   
                  END_MESSAGE_MAP(TForm)  
   
  //------------------------------------------  
  .CPP中  
   
  void   __fastcall   TmainForm::OnHotKey(TMessage&   Msg)  
  {  
   
    做你要做的事  
   
  }  
   
  //------------------------------------------------------------------  
   
  void   __fastcall   TmainForm::FormClose(TObject   *Sender,   TCloseAction   &Action)  
  {  
  UnregisterHotKey(Handle,   2000);  
  }  
   
   
  void   __fastcall   TmainForm::FormCreate(TObject   *Sender)  
  {  
  RegisterHotKey(Handle,   2000,   0,   VK_F1);     //F1     是热键  
  }  
   
  //---------------------------------------  
   
  在主窗体里放上一个TrayIcon,程序在运行时就可以在任务栏的托盘里了,如果要用鼠标弹出菜单,在主窗体中放上PopupMenu,把TrayIcon中的PopupMenu设置为刚才那个PopupMenu。  
   
  Top

8 楼zihan(子寒)回复于 2003-12-04 18:03:47 得分 0

注册热键是一个好的办法,但是要考虑到有可能你这个热键已经被人家的程序注册。  
   
  除了楼上的方法以外,你还可以采用键盘钩子的方法实现,如果检查到是F1,就进行操作。Top

9 楼Santos(快乐的GG)回复于 2003-12-04 18:31:35 得分 0

你其实是两个问题:  
  1、按键捕捉  
  2、系统托盘  
   
  解决:  
  1、Form1->KeyPreview   =   true;  
  Form1::OnKeyUp事件中  
  if(key   ==   VK_F1)  
  ...   //调用外部程序  
   
  2、使用TrayIcon类可以非常简单解决。Top

10 楼aliker(吹口琴的猫)回复于 2003-12-04 19:43:41 得分 0

用键盘或日子钩子Top

11 楼yjy1001(蓝鲸--优秀得郁闷的鱼)回复于 2003-12-04 19:51:07 得分 30

注册热键的方法   bcbsoft(苍之雪)     已经说了  
   
  刚好   小弟今天写了一个全局的   键盘钩子,就发出来   给大家分享下吧。  
  DLL   文件  
  //---------------------------------------------------------------------------  
   
  #pragma   option     -zRShareSEG           //   改变缺省数据段名  
  #pragma   option     -zTShareCLASS       //   改变缺省数据类名  
   
  #include   <vcl.h>  
  #include   <windows.h>  
  #pragma   hdrstop  
   
  #pragma   argsused  
   
  #pragma   data_seg("SharedVar")  
   
  #pragma   data_seg()  
   
  HHOOK     NewHook=NULL;                 //   存放新钩子句柄  
  HINSTANCE     DllHinst;  
  KBDLLHOOKSTRUCT   *pkbhs;  
  char   keyWord;  
  __declspec(dllexport)   LRESULT   CALLBACK   KeyHook(int   code,   WPARAM   wParam,   LPARAM   lParam);  
   
  extern   "C"   __declspec(dllexport)   int   __stdcall   GetKey(char   &key,int   &num);  
  extern   "C"   __declspec(dllexport)   int   __stdcall   EnableHook(bool   flag);   //导出函数EnableHook()  
   
  int   WINAPI   DllEntryPoint(HINSTANCE   hinst,   unsigned   long   reason,   void*   lpReserved)  
  {  
          DllHinst=hinst;  
   
          if   (reason==DLL_PROCESS_ATTACH)           //   DLL入口  
          {  
                    LoadCount+=1;                                   //   装入计数  
          }  
          else  
          {  
                if   (reason==DLL_PROCESS_DETACH)   //   DLL出口处理  
                {  
                        LoadCount-=1;  
                }  
          }  
   
          return   1;  
  }  
  //---------------------------------------------------------------------------  
  //键盘钩子     回送   键盘键虚拟码  
  LRESULT   CALLBACK     KeyHook(int   code,   WPARAM   wParam,   LPARAM   lParam)  
  {  
          EVENTMSG   *keyMSG=(EVENTMSG   *)lParam;  
          if(keyMSG->message==WM_KEYUP)  
          {  
                  keyWord   =   (char)(keyMSG->paramL);   //回送   键盘键虚拟码  
                  DownCount++;  
   
          }  
          return   CallNextHookEx(NewHook,  
                  code,   wParam,   lParam);  
  }  
  //---------------------------------------------------------------------------  
  int   __stdcall     GetKey(char   &key,int   &num)     //   DLL导出函数GetKey()  
  {  
            key   =   keyWord;             //   送出键盘虚拟码  
            js   =   DownCount;               //   送出键盘   按下的次数。  
            return   1;  
  }  
  //---------------------------------------------------------------------------  
  int   __stdcall     EnableHook(bool   flag)                 //   导出函数EnableHook()  
  {  
          if(flag)  
          {  
                  if   (NewHook==NULL){           //     安装新钩子  
                            NewHook=SetWindowsHookEx(WH_JOURNALRECORD,  
                                                (HOOKPROC)KeyHook,  
                                                  DllHinst,0);  
                          return   (NewHook   !=   NULL);   //操作成功   。  
                  }  
          }  
          else  
          {  
                  if   (NewHook!=NULL)  
                  {  
                          UnhookWindowsHookEx(NewHook);  
                          NewHook=NULL;   //   卸掉新钩子  
                          return   1;  
                  }  
   
          }  
  }  
  //-------------------------  
  .def     文件,要和DLL   的工程文件名相同   ——   共享内存用  
  SEGMENTS   ShareSEG   CLASS   'ShareCLASS'   SHARED  
   
  //测试   工程。  
  //---------------------------------------------------------------------------  
   
  #include   <vcl.h>  
  #pragma   hdrstop  
   
  #include   "UnTestHookKeyBoard.h"  
  //---------------------------------------------------------------------------  
  #pragma   package(smart_init)  
  #pragma   resource   "*.dfm"  
  TForm1   *Form1;  
  HINSTANCE   hInst;  
   
  typedef   int   _stdcall   _export   (*TEnableHook)(bool   flag);  
  typedef   int   _stdcall   _export   (*TGetKey)(char   &key,int   &num);  
  TEnableHook   EnableHook;  
  TGetMouse   GetMouse;  
   
  //---------------------------------------------------------------------------  
  __fastcall   TForm1::TForm1(TComponent*   Owner)  
          :   TForm(Owner)  
  {  
          hInst   =   LoadLibrary("HookKeyboard.dll");  
          if(hInst)  
          {  
                  EnableHook   =(TEnableHook)   GetProcAddress(hInst,"EnableHook");  
                  GetKey   =(TGetKey)   GetProcAddress(hInst,"GetKey");  
          }  
          else{  
                  ShowMessage("DLL   Add   Fail");  
          }  
   
  }  
  //---------------------------------------------------------------------------  
   
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)  
  {  
          Button1->Enabled   =   false;  
          if(!EnableHook)  
          {  
                  ShowMessage("获取DLL函数失败");  
                  return;  
          }  
          EnableHook(true);  
   
          char   key;  
          int   downcount;  
     
          while   (!Application->Terminated)  
          {  
                  //   不停在从DLL中取回键盘   按键  
                  GetKey(key,downcount);  
                  Edit1->Text=key;         //按下的字符   (不可见的显示不出来,但已经拦截到了)  
                  Edit2->Text=downcount;     //   key   down   次数  
                  Sleep(50);  
                  Application->ProcessMessages();  
          }  
   
  }  
  //---------------------------------------------------------------------------  
  void   __fastcall   TForm1::Button2Click(TObject   *Sender)  
  {  
          Button1->Enabled   =   true;  
          EnableHook(false);//停止   钩子  
  }  
  //---------------------------------------------------------------------------  
   
  void   __fastcall   TForm1::FormDestroy(TObject   *Sender)  
  {  
          if(hInst)  
          {  
                    FreeLibrary(hInst);  
          }  
  }  
  //---------------------------------------------------------------------------  
  自己想   拦截什么键,自己写吧。Top

12 楼constantine(飘遥的安吉儿)回复于 2003-12-04 20:15:27 得分 0

不就是注册热键吗!Top

13 楼ynkmsun(sun)回复于 2003-12-06 23:24:57 得分 0

bcbsoft(苍之雪)的方法试成功了!yjy1001(蓝鲸--优秀得郁闷的鱼)的方法我还同有全搞懂,估计应该可以的,先给分了,谢谢各位大哥的帮助!Top

相关问题

  • 在VC中怎么能让窗体先截获键盘信息
  • 各位大侠,如何在某个事件中截获键盘事件!!!急!!!
  • 怎么让钩子(HOOK) 截获按键,并转化为别的按键!
  • 如何截获ALT+U键???
  • 关于截获Alt+Tab键~~
  • PreTranslateMessage怎么截获WM_CHAR消息啊?
  • 谁知道怎么截获IP包?
  • 怎么截获WM_IME_CHAR,消息?
  • 怎么截获Net send的消息?
  • 怎么截获CB_SETCURSEL消息

关键词

  • 键盘
  • 函数
  • enablehook
  • newhook
  • 钩子
  • hinst
  • keypreview
  • fastcall
  • dllhinst
  • downcount

得分解答快速导航

  • 帖主:ynkmsun
  • bcbsoft
  • yjy1001

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

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