Tab键

pipilu_2004 2016-06-25 07:49:04
最近在写一个键盘的测试工具,在按tab键时,总是和别的键一起显示。有谁知道怎么在按tab键时单独的作用?

if(GetKeyState(VK_TAB)&&0x8000)
{Panel17->Color=clLime;
sw6=true;
}
...全文
171 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
pipilu_2004 2016-06-27
  • 打赏
  • 举报
回复
可以实现。真是谢谢你了!
ooolinux 2016-06-26
  • 打赏
  • 举报
回复
引用 5 楼 pipilu_2004 的回复:
我刚才试了下,if(GetAsyncKeyState(VK_LSHIFT)&&0x8000)这个在DOWN或UP里,屏蔽任何一个就可以起作用,但在up和down里不能同时存在。可是用key==VK_SHIFT时不能识别出左右的键
在Form1上放一个ApplicationEvents1(位于Additional页),编写它的OnIdle事件处理函数如下,不要其它任何代码,所有按键都由GetAsyncKeyState来检测:(注意位运算的&和表示条件and的&&是不同的) TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::ApplicationEvents1Idle(TObject *Sender, bool &Done) { if(GetAsyncKeyState(VK_LCONTROL)<0) Panel1->Color=clLime; if(GetAsyncKeyState(VK_RCONTROL)<0) Panel2->Color=clLime; if(GetAsyncKeyState(VK_LSHIFT)<0) Panel3->Color=clLime; if(GetAsyncKeyState(VK_RSHIFT)<0) Panel4->Color=clLime; if(GetAsyncKeyState(VK_LMENU)<0) Panel5->Color=clLime; if(GetAsyncKeyState(VK_RMENU)<0) Panel6->Color=clLime; Done=false; }
pipilu_2004 2016-06-26
  • 打赏
  • 举报
回复
我刚才试了下,if(GetAsyncKeyState(VK_LSHIFT)&&0x8000)这个在DOWN或UP里,屏蔽任何一个就可以起作用,但在up和down里不能同时存在。可是用key==VK_SHIFT时不能识别出左右的键
pipilu_2004 2016-06-26
  • 打赏
  • 举报
回复
好的我明白了。就是在onshortcut里拦截了TAB的消息。 那因为键盘的shift和ctrl键是分左右的,在识别时只能用if(GetAsyncKeyState(VK_LSHIFT)&&0x8000) { Panel3->Color=clYellow; } 放在keydown的事件里,没有反应,如果用Key==VK_SHIFT就会两边的一起反应。这个要怎么控制?还有怎么拦截系统的连续按5次SHIFT键出现粘键的提示,或者按WIN键拦截不去打开START? 下面这段就是Lshift键按下去有反应,UP回来就没有变成clLime. oid __fastcall TForm2::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if(GetAsyncKeyState(VK_LSHIFT)&&0x8000) {Panel62->Color=clYellow; } if(Key==VK_TAB) { Panel17->Color=clYellow; } } void __fastcall TForm2::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift) { if(GetAsyncKeyState(VK_LSHIFT)&&0x8000) {Panel62->Color=clLime; } if(Key==VK_TAB) { Panel17->Color=clLime; } }
ooolinux 2016-06-26
  • 打赏
  • 举报
回复
引用 11 楼 pipilu_2004 的回复:
VK_WIN按动时会有系统的windows键的作用,要怎么屏蔽系统的作用? 我现在都放在void __fastcall TForm1::ApplicationEvents1Idle(TObject *Sender, bool &Done)中处理的
我也是抄抄改改的,你将就看一下: //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include <assert.h> //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; // 全局Hook ID HHOOK g_HookHwnd = NULL ; // 以下两个仅用于测试Hook安装和卸载的返回值 BOOL bL = NULL; BOOL bLresult = NULL; LRESULT CALLBACK MyHookFun(int nCode, WPARAM wParam, LPARAM lParam); //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { // 安装钩子 g_HookHwnd = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)MyHookFun, HInstance, 0); // 测试.同上 assert(g_HookHwnd); } //--------------------------------------------------------------------------- void __fastcall TForm1::ApplicationEvents1Idle(TObject *Sender, bool &Done) { if(GetAsyncKeyState(VK_LCONTROL)<0) Panel1->Color=clLime; else Panel1->Color=clBtnFace; if(GetAsyncKeyState(VK_RCONTROL)<0) Panel2->Color=clLime; else Panel2->Color=clBtnFace; if(GetAsyncKeyState(VK_LSHIFT)<0) Panel3->Color=clLime; else Panel3->Color=clBtnFace; if(GetAsyncKeyState(VK_RSHIFT)<0) Panel4->Color=clLime; else Panel4->Color=clBtnFace; if(GetAsyncKeyState(VK_LMENU)<0) Panel5->Color=clLime; else Panel5->Color=clBtnFace; if(GetAsyncKeyState(VK_RMENU)<0) Panel6->Color=clLime; else Panel6->Color=clBtnFace; /* if(GetAsyncKeyState(VK_LWIN)<0) //WIN键在钩子过程中处理 Panel7->Color=clLime; else Panel7->Color=clBtnFace; if(GetAsyncKeyState(VK_RWIN)<0) //WIN键在钩子过程中处理 Panel8->Color=clLime; else Panel8->Color=clBtnFace; */ Done=false; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { // 可以卸载钩子了 // 参数就是SetWindowsHookEx返回的ID bLresult = UnhookWindowsHookEx(g_HookHwnd); // ASSERT测试 // 当exp为False,弹出错误框 assert(bLresult); } //--------------------------------------------------------------------------- // 钩子子程 LRESULT CALLBACK MyHookFun(int nCode, WPARAM wParam, LPARAM lParam) { // 这个Structure包含了键盘的信息 /*typedef struct { DWORD vkCode; DWORD scanCode; DWORD flags; DWORD time; ULONG_PTR dwExtraInfo; } KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;*/ // 我们只需要那个vkCode PKBDLLHOOKSTRUCT pVirKey = (PKBDLLHOOKSTRUCT)lParam; // MSDN说了,nCode < 0的时候别处理 if (nCode >= 0) { // 按键消息 switch(wParam) { case WM_KEYDOWN: //键按下 case WM_SYSKEYDOWN: switch(pVirKey->vkCode) { case VK_LWIN: //WIN键 Form1->Panel7->Color=clLime; return 1; // 吃掉消息 case VK_RWIN: Form1->Panel8->Color=clLime; return 1; // 吃掉消息 } break; case WM_KEYUP: //键松开 case WM_SYSKEYUP: switch(pVirKey->vkCode) { case VK_LWIN: //WIN键 Form1->Panel7->Color=clBtnFace; return 1; // 吃掉消息 case VK_RWIN: Form1->Panel8->Color=clBtnFace; return 1; // 吃掉消息 } break; } } return CallNextHookEx(g_HookHwnd, nCode, wParam, lParam); }
pipilu_2004 2016-06-26
  • 打赏
  • 举报
回复
VK_WIN按动时会有系统的windows键的作用,要怎么屏蔽系统的作用? 我现在都放在void __fastcall TForm1::ApplicationEvents1Idle(TObject *Sender, bool &Done)中处理的
pipilu_2004 2016-06-26
  • 打赏
  • 举报
回复
我知道了,在else再加一个有没有按过的判断就可以了。 非常感谢你的指导,谢谢!
pipilu_2004 2016-06-26
  • 打赏
  • 举报
回复
这样可以实现 up和down的颜色不同,在键盘最初时有一种色,也就是一开始Panel->Color=clBtnFace,DOWN时Panel->Color=clLime, UP后panel->Color=clSilver.这要怎么实现?这样可以区分这个键有没有按过,和模拟敲击时的状态。
ooolinux 2016-06-26
  • 打赏
  • 举报
回复
引用 7 楼 pipilu_2004 的回复:
谢谢!这样可以实现区分左右,按过一次有显示clLime. 但能实现down一种色,up后一种色吗?
void __fastcall TForm1::ApplicationEvents1Idle(TObject *Sender, bool &Done) { if(GetAsyncKeyState(VK_LCONTROL)<0) Panel1->Color=clLime; else Panel1->Color=clBtnFace; if(GetAsyncKeyState(VK_RCONTROL)<0) Panel2->Color=clLime; else Panel2->Color=clBtnFace; if(GetAsyncKeyState(VK_LSHIFT)<0) Panel3->Color=clLime; else Panel3->Color=clBtnFace; if(GetAsyncKeyState(VK_RSHIFT)<0) Panel4->Color=clLime; else Panel4->Color=clBtnFace; if(GetAsyncKeyState(VK_LMENU)<0) Panel5->Color=clLime; else Panel5->Color=clBtnFace; if(GetAsyncKeyState(VK_RMENU)<0) Panel6->Color=clLime; else Panel6->Color=clBtnFace; Done=false; }
pipilu_2004 2016-06-26
  • 打赏
  • 举报
回复
谢谢!这样可以实现区分左右,按过一次有显示clLime. 但能实现down一种色,up后一种色吗?
ooolinux 2016-06-26
  • 打赏
  • 举报
回复
参考:BCB处理Tab按键事件 http://blog.csdn.net/longhaoyou/article/details/7161211 TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { KeyPreview=true; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormShortCut(TWMKey &Msg, bool &Handled) { if(Msg.CharCode==VK_TAB) Msg.Result=0; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if(Key==VK_CONTROL) { Panel1->Color=clLime; } if(Key==VK_TAB) { Panel2->Color=clLime; } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift) { if(Key==VK_CONTROL) { Panel1->Color=clBtnFace; } if(Key==VK_TAB) { Panel2->Color=clBtnFace; } } //---------------------------------------------------------------------------
pipilu_2004 2016-06-25
  • 打赏
  • 举报
回复
就是像下面的代码,按大写键时panel颜色会变成clLime, 但是按TAB键就不会变clLime,在按另外键的时候TAB又会变成clLime. 我想实现就是界面上一个键盘的布局,按对应的键,可以在panel上变个颜色,最好能把WINDOWS对应的这些消息拦截掉。比如按win,不会启动start。但现在遇到了按tab没反应的问题。 void __fastcall TForm2::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if(GetKeyState(VK_TAB)&&0x8000) {Panel17->Color=clLime; sw6=true; } if(Key==VK_CAPITAL) { Panel48->Color=clLime; sw6=true; } }
ooolinux 2016-06-25
  • 打赏
  • 举报
回复
总是和别的键一起显示 什么意思? 怎么在按tab键时单独的作用??

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧