在windows C语言编程中,怎么响应键盘事件??

时间:2021-02-19 17:02:43
我的程序需要实现一项功能,当按下键盘某个键(如ESC或Ctrl+xx)时,程序停止正在做的事情,而去做另一件的事情,请问该功能怎么实现??
非常感谢!!

10 个解决方案

#1


捕获WM_KEYDOWN事件。程序如下:

LRESULT CALLBACK  WnProc( HWND  hWnd, UINT  uMsg, WPARAM  wParam, LPARAM  lParam )
{
   switch( uMsg )
   {
    case .....
       
    case   WM_KEYDOWN:
             DoYourCase(); 
    default:
          break;
   }
   return  DefaultWindowProc( hWnd, uMsg, wParam, lParam );
}
如果窗口在失去了focus的情况下仍然要知道键盘的状态则需要SetCapture( hWnd ).

#2



在vc里面:ON_NOTIFY:

    BEGIN_MESSAGE_MAP(CTabView, CView)
       //{{AFX_MSG_MAP(CTabView)
       ON_WM_CREATE()
       ON_WM_SIZE()
       ON_WM_SETFOCUS()
       ...                              // other message macros
       //}}AFX_MSG_MAP
       ON_NOTIFY(TCN_SELCHANGE, ID_TABCTRL, OnTabSelChange)
       ...                              // other message macros
     END_MESSAGE_MAP()

#3


to楼上的:我的程序是C语言编的,不是VC.

toCaoyu015(酷鱼一代):首先感谢你的的回应.  我的程序是在命令行下的操作(即非图形界面),不知道你的代码行不行的通(因为要实现的东西很多,没法马上测试).WM_KEYDOWN是指任意键吧?DefaultWindowProc需要写代码实现吗?

#4


toCaoyu015(酷鱼一代):你给的代码怎么实现啊??详细一点行吗??

#5


是Console程序吗? 
DefaultWindowProc是 Windows API函数存在于 kernal.dll中(不知道有没有记错)不要自己
来实现。
如果没有图形界面的话,肯定是不行的,因为系统是根据判断HWND来发送消息的。
如果是Console程序的话,试一下用中断驻留,捕获键盘中断。 要不然就用钩子也行。

#6


是Console程序,请问怎么中断驻留,捕获键盘中断啊??

#7


使用 kbhit()函数

请参考:
#include  <conio.h>  
#include  <iostream>  
#include  <iomanip>  
using  namespace  std;  
 
void  main()  
{  
           int  nCount  =  0;  
           do  
           {  
                       if(  ++nCount  >  36  )  
                                   nCount  =  0;  
                       cout  <<  setw(  2  )  <<  nCount  <<  '\r';  
           }  while(  !kbhit(  )  );  
           cout  <<  nCount  <<  endl;  
           system(  "pause"  );  
}

#8


那要是console的话,捕获WM_KEYDOWN,WM_SYSKEYDOWN就不行了.
你要用kbhit()函数来检测.判断是什么键.

#9


对于楼主的要求用kbhit函数肯定不行,因为要求程序无论在作什么事情都要能响应键盘的事件。不可能每做一步就检测一下 kbhit(). 所以除了用中断驻留或者是钩子才合理。
不过我没有在VC中用过中断驻留,在TC环境下就很简单。
如:

void interrput  far  MyIntProc()
{
  ....检查键盘端口....
  .....判断键盘扫描码.......
}

void ( interrupt  *Int_Ptr )( void );
  
int   main()
{
    Int_Ptr = getvect( 中断号 );
    setvect( 中断号, MyIntProc );
    ............

    setvect( 中断号 );
    return  0;


在VC中的话我想要自己动手写写汇编代码, 因为interrput关键字在TC中代表编译器在编译
该函数段时会在函数头push 9个寄存器到堆栈, 在离开时要pop 出9字的保存内容到各个寄存器中。

  
    

#10


http://expert.csdn.net/Expert/topic/2537/2537551.xml?temp=.4020197

#1


捕获WM_KEYDOWN事件。程序如下:

LRESULT CALLBACK  WnProc( HWND  hWnd, UINT  uMsg, WPARAM  wParam, LPARAM  lParam )
{
   switch( uMsg )
   {
    case .....
       
    case   WM_KEYDOWN:
             DoYourCase(); 
    default:
          break;
   }
   return  DefaultWindowProc( hWnd, uMsg, wParam, lParam );
}
如果窗口在失去了focus的情况下仍然要知道键盘的状态则需要SetCapture( hWnd ).

#2



在vc里面:ON_NOTIFY:

    BEGIN_MESSAGE_MAP(CTabView, CView)
       //{{AFX_MSG_MAP(CTabView)
       ON_WM_CREATE()
       ON_WM_SIZE()
       ON_WM_SETFOCUS()
       ...                              // other message macros
       //}}AFX_MSG_MAP
       ON_NOTIFY(TCN_SELCHANGE, ID_TABCTRL, OnTabSelChange)
       ...                              // other message macros
     END_MESSAGE_MAP()

#3


to楼上的:我的程序是C语言编的,不是VC.

toCaoyu015(酷鱼一代):首先感谢你的的回应.  我的程序是在命令行下的操作(即非图形界面),不知道你的代码行不行的通(因为要实现的东西很多,没法马上测试).WM_KEYDOWN是指任意键吧?DefaultWindowProc需要写代码实现吗?

#4


toCaoyu015(酷鱼一代):你给的代码怎么实现啊??详细一点行吗??

#5


是Console程序吗? 
DefaultWindowProc是 Windows API函数存在于 kernal.dll中(不知道有没有记错)不要自己
来实现。
如果没有图形界面的话,肯定是不行的,因为系统是根据判断HWND来发送消息的。
如果是Console程序的话,试一下用中断驻留,捕获键盘中断。 要不然就用钩子也行。

#6


是Console程序,请问怎么中断驻留,捕获键盘中断啊??

#7


使用 kbhit()函数

请参考:
#include  <conio.h>  
#include  <iostream>  
#include  <iomanip>  
using  namespace  std;  
 
void  main()  
{  
           int  nCount  =  0;  
           do  
           {  
                       if(  ++nCount  >  36  )  
                                   nCount  =  0;  
                       cout  <<  setw(  2  )  <<  nCount  <<  '\r';  
           }  while(  !kbhit(  )  );  
           cout  <<  nCount  <<  endl;  
           system(  "pause"  );  
}

#8


那要是console的话,捕获WM_KEYDOWN,WM_SYSKEYDOWN就不行了.
你要用kbhit()函数来检测.判断是什么键.

#9


对于楼主的要求用kbhit函数肯定不行,因为要求程序无论在作什么事情都要能响应键盘的事件。不可能每做一步就检测一下 kbhit(). 所以除了用中断驻留或者是钩子才合理。
不过我没有在VC中用过中断驻留,在TC环境下就很简单。
如:

void interrput  far  MyIntProc()
{
  ....检查键盘端口....
  .....判断键盘扫描码.......
}

void ( interrupt  *Int_Ptr )( void );
  
int   main()
{
    Int_Ptr = getvect( 中断号 );
    setvect( 中断号, MyIntProc );
    ............

    setvect( 中断号 );
    return  0;


在VC中的话我想要自己动手写写汇编代码, 因为interrput关键字在TC中代表编译器在编译
该函数段时会在函数头push 9个寄存器到堆栈, 在离开时要pop 出9字的保存内容到各个寄存器中。

  
    

#10


http://expert.csdn.net/Expert/topic/2537/2537551.xml?temp=.4020197