非常感谢!!
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 ).
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需要写代码实现吗?
toCaoyu015(酷鱼一代):首先感谢你的的回应. 我的程序是在命令行下的操作(即非图形界面),不知道你的代码行不行的通(因为要实现的东西很多,没法马上测试).WM_KEYDOWN是指任意键吧?DefaultWindowProc需要写代码实现吗?
#4
toCaoyu015(酷鱼一代):你给的代码怎么实现啊??详细一点行吗??
#5
是Console程序吗?
DefaultWindowProc是 Windows API函数存在于 kernal.dll中(不知道有没有记错)不要自己
来实现。
如果没有图形界面的话,肯定是不行的,因为系统是根据判断HWND来发送消息的。
如果是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" );
}
请参考:
#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()函数来检测.判断是什么键.
你要用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字的保存内容到各个寄存器中。
不过我没有在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 ).
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需要写代码实现吗?
toCaoyu015(酷鱼一代):首先感谢你的的回应. 我的程序是在命令行下的操作(即非图形界面),不知道你的代码行不行的通(因为要实现的东西很多,没法马上测试).WM_KEYDOWN是指任意键吧?DefaultWindowProc需要写代码实现吗?
#4
toCaoyu015(酷鱼一代):你给的代码怎么实现啊??详细一点行吗??
#5
是Console程序吗?
DefaultWindowProc是 Windows API函数存在于 kernal.dll中(不知道有没有记错)不要自己
来实现。
如果没有图形界面的话,肯定是不行的,因为系统是根据判断HWND来发送消息的。
如果是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" );
}
请参考:
#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()函数来检测.判断是什么键.
你要用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字的保存内容到各个寄存器中。
不过我没有在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