用方向键替代TAB键?(100分)

  • 主题发起人 主题发起人 hcf
  • 开始时间 开始时间
H

hcf

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样用方向键替代TAB键在控件上移动?
 
form1.keypreview:=True;
form1.onshortcut事件中:

if(msg.CharCode=VK_RIGHT)then
msg.CharCode:=VK_TAB;
 
在控件的OnkeyDown事件
if key=vk_down then (或key=任何方向键)
key:=vk_tab;

 
按键模拟1:
keybd_event(VK_MENU,0,0,0);//ALT键
keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0)
按键模拟2:
procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_RETURN then
begin
PostMessage(DBGrid1.Handle, WM_KEYDOWN, VK_TAB, 0);
end;
end;


提醒注意:
Delphi5中已经有所变化,在OnShortCut事件中直接进行处理,最好跟踪运行一遍.
procedure TForm1.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
if Msg.CharCode=13 then
begin
Msg.CharCode:=9;
Handled:=False;//消息没有处理.
end;

需要用回车键代替TAB键下移一个控件时,把KeyPress设为True,加入下列代码拦截击键:
Procedure TForm1.FormKeyPress(Sender:Tobject;Var Key:Char);
Begin
 if key=#13 then { 判断是按执行键}
 if not (ActiveControl is TDbgrid) Then
 Begin { 不是在TDbgrid控件内}
  key:=#0;
  perform(WM_NEXTDLGCTL,0,0);{移动到下一个控件}
 end else
 if (ActiveControl is TDbgrid) Then{是在 TDbgrid 控件内}
 begin
  With TDbgrid(ActiveControl) Do
  if Selectedindex<(FieldCount-1) then
  Selectedindex:=Selectedindex+1{ 移动到下一字段}
  else Selectedindex:=0;
 end;
End;




 
hcf 你好,
 
截获:
做键盘钩子(Hook)

模拟:(举例)
//回车
keybd_event(13, MapVirtualKey(13, 0), 0, 0);
keybd_event(13, MapVirtualKey(13, 0), KEYEVENTF_KEYUP, 0);
//tab
keybd_event(9, MapVirtualKey(9, 0), 0, 0);
keybd_event(9, MapVirtualKey(9, 0), KEYEVENTF_KEYUP, 0);
//del
keybd_event(VK_Delete, MapVirtualKey(VK_Delete, 0), 0, 0);
keybd_event(VK_Delete, MapVirtualKey(VK_Delete, 0),
KEYEVENTF_KEYUP, 0);

 
怎样模拟shift+tab键来控制焦点转移
返回前一个焦点处
在Form的KeyDown事件里:
if Key = VK_UP then
SendMessage(MYForm.Handle, WM_NEXTDLGCTL, 1, 0);
if key= VK_??(按下) then
SendMessage(MYForm.Handle, WM_NEXTDLGCTL, 0, 0);
搞定~给分吧~嘿,灌水~~
 
在Form的KeyDown事件里:
if Key = VK_UP then
begin
keybd_event(VK_SHIFT,0,0,0);
keybd_event(VK_TAB,0,0,0);
keybd_event(VK_TAB,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
end;
if Key=Vk_down
begin
//keybd_event(VK_SHIFT,0,0,0);
keybd_event(VK_TAB,0,0,0);
keybd_event(VK_TAB,0,KEYEVENTF_KEYUP,0);
//keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
end;
对不住,系统快崩溃了,要重启~

 
请看一下“EDIT控件”(http://www.delphibbs.com/delphibbs/DispQ.asp?LID=180296)中的答案。

TWinControl.SelectNext(CurControl: TWinControl;
GoForward, CheckTabStop: Boolean)的GoForward=False产生的动作就和按下
shift-tab一样的效果。
 
给hsw加分吧!
 
谢谢wumeng,真是“生我者父母,知我者wumeng也”
hcf,如果你给我100分的话,请分给wumeng1~5分,我想感谢他
如果少于100分,就不要给wumeng了,我看wumeng高风亮节,一表人材,
相貌堂堂,是不会在意这几分的~给他简直是一种侮辱、凌辱、羞辱
...
至于lich007,他的回答是错误的,就不要给他分了,
lich007你也真是的,灌水也要有点专业精神嘛,你
这样乱说,会伤害到小朋友的;就算伤害不到小朋友,
伤害到花花草草,也是不好的~……你这样看着我干什么?
你不喜欢听啊~你不喜欢听,你说嘛~
不可能,你不想听,而我却一定要说;而你想听,而我
却偏不说给你听……
而“烂泥”也不要不给他分~就给1~2分吧~
呓?“烂泥”你喜欢?~你这样看着我干什么?
你不喜欢?你说不喜欢嘛~不可能,你不喜欢,而我却一定要怎么说;
而你想喜欢,而我却偏不怎么说你……或者你比wumeng更高风亮节、
更一表人材、更相貌堂堂、更玉树临风、....
更是不会在意这几分的~给他更是一种侮辱、凌辱、羞辱
...

 
而我就不同了,我比那些所谓的“灌水”高手(包括:CAkk、
SupperMMx、歪就歪)更专业~
因为,我每天都在灌水,我一不“灌水”就会~~
我比他们更有资格作“版主”~

 
烂泥:贵姓?
hsw: 姓林。
烂泥:哦,原来你就是我大哥常说的哪个“林青霞”
hsw: 你大哥?
烂泥:昨天被你灌水的那个家伙,叫”稀泥“
hsw: 烂泥。稀泥?想骗我?
烂泥:嘻嘻,你真是聪明伶俐。其实我大哥真名叫做秦汉,
hsw: 你在这儿干什么?
烂泥:我......我很仰慕你!
 
后退
顶部