我的程序,需要捕获按键 ctrl 的状态。(在我的程序有输入焦点和没有输入焦点的情况下都要正常捕获)
我用了两种方法
1.使用API函数 GetAsyncKeyState(VK_CONTROL)
2.安装系统级的键盘钩子可是这两种方法都存在问题:就是第一次能捕获到这个ctrl的状态可是下一次即使是他处于没有按下状态,但是两种方法的捕获结果都说是按下的(有记忆?)是不是要清除键盘缓冲区?请问这个问题怎么解决?得到答案,立刻给分!

解决方案 »

  1.   

    GetAsyncKeyState函数的返回值有三种情况:
    1. 返回0, 表示自上次调用GetAsyncKeyState函数之后, 没有按过某个键
    2. 返回1, 表示自上次调用GetAsyncKeyState函数之后, 有按过某个键, 但是这个键目前没有被按下
    3. 返回-32767, 表示这个键目前正被按下
    下面是一个测试的代码:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Timer1: TTimer;
        Label1: TLabel;
        procedure Timer1Timer(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      Timer1.Interval := 2000;      //这里有意将定时器间隔定得比较长, 这样能看清楚不同情况下的函数返回值是不同的
      Timer1.Enabled := True;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Label1.Caption := IntToStr(GetAsyncKeyState(VK_CONTROL));
    end;end.