怎样截获单独的 Ctrl 键? (From: BaKuBaKu)(100分)

  • 主题发起人 主题发起人 BaKuBaKu
  • 开始时间 开始时间
B

BaKuBaKu

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在控件中截获单独的 Ctrl 键响应一定的事件,比如:

OnKeyUp(...)
begin
case Key of
VK_CONTROL:begin ... end;
...
end;
end;

但是当按下 Ctrl+Space 打开/关闭输入法时该事件也能触发,
怎样截获单独的 Ctrl 键?
From: BaKuBaKu

(From: BaKuBaKu)
 
Who said impossible?
请用一下微软的输入法,它使用 Shift 键切换中/英文状态。你把状态设为
英文状态,然后用 Shift 输入大写字母,就没有触发中/英文的切换,就是说,
它能够区分单独的 Shift 键与 Shift+字母 的组合。
Who said impossible?
From: BaKuBaKu.
 
在ON_KeyUp判断参数SSCtrl
if (SSCtrl in Shift) then
......
当其他键没有按下是key 是17
试试看吧
 
我觉得它是捕获 shift 的 keyup 事件。

这样似乎不容易。
 
参考下面程序:
var
oldkey:byte;
Pctrl,Rctrl:boolean;
...
procedure TForm1.Create(Sender: TObject);
begin
...
asm
in al, 60h
mov oldkey, al
end;
doit := true;
Pctrl := false;
Rctrl := false;
end;
...
procedure TForm1.Timer1Timer(Sender: TObject);
var
key:byte;
begin
asm
in al, 60h
mov key, al
end;
if key <> oldkey then
begin
if key = 29 then Pctrl := true;
//按下Ctrl键
if (key <> 157) and Pctrl and (not Rctrl) then doit := false;
//按下了ctrl键但是还没有放开之前,又按了其他的键
if key = 157 then Rctrl := true;
//放开Ctrl键
end;
if Pctrl and Rctrl and doit then
begin
激发事件...
end;
end;
 
方法好像不太规范啊。
 
完全可以实现,只是一个编程技巧问题:

var b:Boolean;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (key=VK_CONTROL) and b then ShowMessage('Only Ctrl!');
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
b := (ssCtrl in shift) and (key=VK_CONTROL);
end;

to beta: 用Timer可不好呀。:-)
 
o*o 自己试验过这段程序吗?
在窗体上按下 Ctrl+Space 试试看?
From: BaKuBaKu.
 
Ctrl+Space 一起按切换输入法,单按CTRL弹出对话框。
你到底是什么意思?
 
很简单,我不希望按 Ctrl+Space 时弹出对话框。
From: BaKuBaKu.
 
sorry,这个空格很特别,被IME钩住了,我没注意。CTRL+别的键是没问题的。
再说吧。
 
Try This , No Problm!

procedure CNSysKeyDown(var Message: TWMKeyDown); message CN_SYSKEYDOWN;
 
当CTRL按下时,你的程序是收不到SPACE的KEYDOWN的,
但可以收到KEYUP。

OnKeyUp这样写就行了。

if key=VK_SPACE then b:=False;
if (key=VK_CONTROL)and b then showmessage('Only Ctrl!');
 
写一个钩子行不行?谁试过的?
From: BaKuBaKu.
 
o*o的方法子改进一下行不行,在keypress事件中,判断是否有Ctrl键按下,
如果按下的话,就不现实对话框,或者在加一个标志,用来专门判断是不是
ctrl加别的键,哎呀,不在自己的机器上就是不爽!
 
呵呵,我用钩子解决了。
用 API 函数 SetWindowsHookEx 做一个钩子就行了。谢谢各位。
呵呵,见者有份。
From: BaKuBaKu
 
多人接受答案了。
 
后退
顶部