编程语言中文网今天精心准备的是《getasynckeystate》,下面是详解!
VB GetAsyncKeyState函数问题,高手进
用GetAsyncKeyState函数判断某个键被按下,第一次返回值为1,可是第二次、第三次·····该怎么判断,百科上查了本人菜鸟看的糊涂,求高手详细解释一下!...
用GetAsyncKeyState函数判断某个键被按下,第一次返回值为1,可是第二次、第三次·····该怎么判断,百科上查了本人菜鸟看的糊涂,求高手详细解释一下!
GetAsyncKeyState函数返回的是指定虚拟键瞬时的状态值,它有四种返回值:
0 --- 键当前未处于按下状态,而且自上次调用GetAsyncKeyState后改键也未被按过;
1 --- 键当前未处于按下状态,但在此之前(自上次调用GetAsyncKeyState后)键曾经被按过;
-32768(即16进制数&H8000) --- 键当前处于按下状态,但在此之前(自上次调用GetAsyncKeyState后)键未被按过;
-32767(即16进制数&H8001) --- 键当前处于按下状态,而且在此之前(自上次调用GetAsyncKeyState后)键也曾经被按过。
也就是说,你只要简单的判断GetAsyncKeyState的返回值是否为0,只要不为0就表示键被按下了。如果想精确点就判断一下返回值的二进制数位第0位或第15位是否为0。
C语言 图像 GetAsyncKeyState
GetAsyncKeyState这个函数怎么用为什么这个代码的程序按一下就输出一屏幕?while(1){if(GetAsyncKeyState(VK_LEFT)&0x8000)puts("左");if(GetAsyncKeyState(VK_RIGHT)&0x8000)puts("右...
GetAsyncKeyState这个函数怎么用
为什么这个代码的程序 按一下就输出一屏幕 ?
while(1)
{
if(GetAsyncKeyState(VK_LEFT)&0x8000) puts("左");
if(GetAsyncKeyState(VK_RIGHT)&0x8000) puts("右");
if(GetAsyncKeyState(VK_UP)&0x8000) puts("上");
if(GetAsyncKeyState(VK_DOWN)&0x8000) puts("下");
}
如果想在循环里按一下上下左右就输出一次应该怎么打
展开
把IF嵌套,设置变量,确定已按下哪些键
#include
#include
int main()
{
int ll;
while(1)
{
if(GetAsyncKeyState(VK_UP)&0x8000){
ll=1;}
if(ll==1) {
if(GetAsyncKeyState(VK_DOWN)&0x8000){
ll=2;}}
if(ll==2) {
if(GetAsyncKeyState(VK_LEFT)&0x8000) {
ll=3;}}
if(ll==3) {
if(GetAsyncKeyState(VK_RIGHT)&0x8000){
puts("上");puts("下");puts("左");puts("右");
ll=0;
}}
}
return 0;
}
扩展
说错了 应该是按其中一个方向键就显示一次,如果是其他字符要怎么弄?
补充
每输出一次就跳出循环,再进入循环,还要休眠
#include
#include
int main()
{
h:
Sleep (200);
while(1)
{
if(GetAsyncKeyState(VK_LEFT)&0x8000) {puts("左");goto h;}
if(GetAsyncKeyState(VK_RIGHT)&0x8000) {puts("右");goto h;}
if(GetAsyncKeyState(VK_UP)&0x8000){ puts("上");goto h;}
if(GetAsyncKeyState(VK_DOWN)&0x8000) {puts("下");goto h;}
}
return 0;
}
GetAsyncKeyState的问题,求看看怎么回事儿
你不要简单地检测GetAsyncKeyState的返回值是否非零,因为如果在这个函数运行前指定的键已经被按过,则这个函数的返回值的位0为1;如果这个键目前处于按下状态,则位15为1。换句话说,GetAsyncKeyState这个函数可以返回键盘上某个键的两种实时状态:“曾经被按过”以及“正在被按下”!而这两种状态都会使GetAsyncKeyState的返回值非零,因此用If GetAsyncKeyState(vbKeyA) Then来判断A键是否被按下是不严密的,因为在你的程序启动之前,A键很可能已经被按过了,这种情况下你的程序一启动,GetAsyncKeyState(vbKeyA)就是为“真”的!
因此你要检测返回值的位15是否为1才能够精确判断这个键是不是正在被按着:
If (GetAsyncKeyState(vbKeyA) And &H8000) = &H8000 Then
另外,还有一个API函数GetKeyState是只检测按键的当前状态的(也就是说它不检测这个键是否“曾经被按过”),但仍然要检测位15是否为1(位0为1表示开关键打开,即CapsLock、NumLock、ScrollLock键):
If (GetKeyState(vbKeyA) And &H8000) = &H8000 Then
使用GetAsyncKeyState来设置组合键,就是热键的设置
GetAsyncKeyState的基本代码就是下面的……PrivateDeclareFunctionGetAsyncKeyStateLib"user32"(ByValvKeyAsLong)AsInteger'声明FunctionGetKey()AsStringDimAddKeyAsStringKeyResult...
GetAsyncKeyState的基本代码就是下面的……
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer '声明
Function GetKey() As String
Dim AddKey As String
KeyResult = GetAsyncKeyState(32) '回车键
If KeyResult = -32767 Then
要做的事情……
End If
这里是设为回车键,单个键偶会设~
那设“Ctrl+1”等的组合键该怎么设值呢?
有什么规律或者查表能找到值的呢?
可不可以就用这个程序中实现,不用到注册热键~
展开
【VB声明】
Private Declare Function GetAsyncKeyState Lib "user32" Alias "GetAsyncKeyState" (ByVal vKey As Long) As Integer
【说明】
判断函数调用时指定虚拟键的状态
【返回值】
Long,自对GetAsyncKeyState函数的上一次调用以来,如键已被按过,则位0设为1;否则设为0。如键目前处于按下状态,则位15设为1;如抬起,则为0。微软的win32手册指出:倘若输入焦点从属于与调用函数的输入线程不同的另一个输入线程,则返回值为0(例如,一旦另一个程序拥有焦点,则它应返回零)。证据显示,函数实际是在整个系统的范围内工作的
【备注】
如指定了VK_LBUTTON 或 VK_RBUTTON,按钮的状态就会根据实际的按钮报告——无论是否曾用SwapMouseButton函数对鼠标的位置进行了交换。win32提供了额外的一些虚拟键码,比如VK_LSHIFT
和 VK_RSHIFT,以便在两个完全一样的键中区分出左右(也包括Ctrl 和
Alt)
【参数表】
vKey ---- Long,欲测试的虚拟键的键码
用循环,判断出每个键的状态
VB中GetAsyncKeyState函数,得到键盘按键,清除键...
使用GetAsyncKeyState这个函数时,它得到是键盘上一次按键的键,哪怕上一次按键是在程序运行前。怎么解决让键盘记录清空呢?例:我在Timer事件里用GetAsyncKeyState来判断键盘是不是按...
使用GetAsyncKeyState这个函数时,它得到是键盘上一次按键的键,哪怕上一次按键是在程序运行前。怎么解决让键盘记录清空呢?
例:我在Timer事件里用GetAsyncKeyState来判断键盘是不是按下空格
private sub timer1_timer
if GetAsyncKeyState(VK_SPACE) then Call 事件A
end sub
但在我运行程序这前,最后一次按下的是空格,在运行程序后,我没有按任何键,却调用了事件A。求清除键盘记录!
另:有没有更好的函数,可以判断键盘类似于Form_KeyUp事件能判断键盘松开事件?
展开
你不要简单地检测GetAsyncKeyState的返回值是否非零,因为如果在这个函数运行前指定的键已经被按过,则这个函数的返回值的位0为1;如果这个键目前处于按下状态,则位15为1。所以你检测位15是否为1就可以知道这个键是曾经被按过还是正在被按着:
If (GetAsyncKeyState(VK_SPACE) And &H8000) = &H8000 Then Call 事件A
还有一个API函数GetKeyState是只检测按键的当前状态的,但仍然要检测位15是否为1(位0为1表示开关键打开,即CapsLock、NumLock、ScrollLock键):
If (GetKeyState(VK_SPACE) And &H8000) = &H8000 Then Call 事件A
更多扩展补充
扩展
我再问一下,为什么Form_KeyUp事件不执行呢?、
比如 我的代码是
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
msgbox '"ffdkfjadf"
If GetAsyncKeyState(VK_SPACE) Then
Command5_Click
End If
End Sub
运行时,无论我按什么键,他都不执行!为何?
补充
这是因为键盘事件(包括KeyDown、KeyUp、KeyPress)被窗体上的其他具有焦点的控件抢走了,所以窗体本身就无法响应键盘事件了。解决的办法是把窗体的KeyPreview属性设为True:
Private Sub Form_Load()
Me.KeyPreview = True
End Sub
这样窗体就会优先响应键盘事件(其他控件也可以响应,但排在窗体后面)
扩展
君乃神人也!谢谢啦!
c语言 GetAsyncKeyState好像只能同时按下两个键有...
我想做一个控制台游戏,需要同时响应4个键被按下...
我想做一个控制台游戏,需要同时响应4个键被按下
按键的同时检测如果实在游戏里面windows.h,stdio.hif(GetAsyncKeyState('A')&0x8000)//'A'c|=4;if(GetAsyncKeyState('D')&0x8000)//'D'c|=8;if(c&4&&c&8){printf("hello");c=0;}用了GetAsyncKeyStateapi的函数,这个函数的使用方法很有特点用了get监测按键按下,然后c分别和4,8来或运算,然后if再用与运算监测,确实按下了那两个按键之后执行什么,当然在加&&,可以监测多个按键
这一段是什么意思?
#defineKEYDOWN(vk_code)((GetAsyncKeyState(vk_code)&0x8000)?1:0)#defineKEYUP(vk_code)((GetAsyncKeyState(vk_code)&0x8000)?0:1)...
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
GetAsyncKeyState()函数的使用
我在控制台程序中试用了一下这个函数,起初觉得挺好用,但是在简化过程中出现了严重的问题,在循环中GetAsyncKeyState()会持续不断地返回数值导致我按一次键出现频繁的结果想求教一下...
我在控制台程序中试用了一下这个函数,起初觉得挺好用,但是在简化过程中出现了严重的问题,
在循环中GetAsyncKeyState()会持续不断地返回数值 导致我按一次键出现频繁的结果 想求教一下怎么解决这个问题
展开
你是写在一个循环中的,当你按下一个键还没有弹起的时候,每执行一次循环体(也就是执行一次这个函数),这个函数就会返回一个值,一个代表你按的这个键按下状态的值
C++中GetAsyncKeyState 能不能判断按任意键呢 就是...
如果我只仅仅想判断键盘按键是否按下不管他按的是哪个键有什么方法么...
如果我只仅仅想判断键盘按键是否按下 不管他按的是哪个键有什么方法么
// 重写父类的PreTranslateMessage这个虚函数
BOOL CXXX::PreTranslateMessage(MSG* pMsg)
{
//键盘按下
if (pMsg->message==WM_KEYDOWN)
{
//处理函数
}
return CDialog::PreTranslateMessage(pMsg);
}
SHORT GetAsyncKeyState(int vKey);
参数vKey是某个按键的虚拟码。
功能 :
如果函数成功,则返回值指定此按键自上次上次调用GetAsyncKeyState后是否按下过,以及此按键当前是弹起的还是按下的。如果最高比特位被设置(就是被设为1),此按键就是按下的,如果最低位被设置,则此按键在上次调用GetAsyncKeyState之后(“又”)被按下过。但是你不应该依赖于之前的(按键)行为。
所以GetAsyncKeyState只能判断具体某一个键是否被按下。
更多扩展补充
扩展
是啊 而且我还需要是全局获取按键信息 只能使用钩子,或者ddk.您有这方面的小例子么
补充
你如果只是判断键盘是否按下的话,我上面贴的代码就可以了。
至于如果使用钩子的话,太麻烦了,而且如果不是对钩子很熟悉的话,写起来很困难的。
扩展
今天找到一个钩子例子 迷迷糊糊 就改成功了 不过还是很谢谢你
补充
不客气
GetAsyncKeyState()函数的意思
#defineKEY_DOWN(vk_code)(GetAsyncKeyState(vk_code)&0X8000)?1:0哪位大牛帮看看这个函数是嘛意思!谢谢啊;在后面程序中有调用:if(KEY_DOWN(VK_SHIFT))speed=speed*4;...
#define KEY_DOWN(vk_code)(GetAsyncKeyState(vk_code)&0X8000)?1:0
哪位大牛帮看看这个函数是嘛意思! 谢谢啊;
在后面程序中有调用:
if (KEY_DOWN(VK_SHIFT))
speed=speed*4;