以最少的资源耗用显示系统键状态

八神与剑圣

八神与剑圣

2016-02-19 12:48

给自己一点时间接受自己,爱自己,趁着下午茶的时间来学习图老师推荐的以最少的资源耗用显示系统键状态,过去的都会过去,迎接崭新的开始,释放更美好的自己。

  有不少人讨论过显示系统键(CapsLock、NumLock、Insert、ScrollLock等)状态的问题,用得最多的方法是添加一个Timer,在事件中刷新系统键状态显示;另一个方法是做一个系统HOOK,在HOOK中刷新显示。这两种方式都会严重占用系统资源,第一种方法还存在延迟的问题。现在介绍第三种方法:

  键盘按钮被按下时系统会发送WM_KEYDOWN、WM_CHAR、WM_KEYUP消息给当前的激活应用程序,消息的wParam是键盘扫描码,这样我们就可以知道按键是否被按下或释放,在这里面刷新按键状态显示是最佳的时候。不过这里还有一个问题,应用程序在非激活状态时是收不到以上消息的,因此需要在程序被激活时检测并刷新状态显示。

  下面给出实现代码:

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  unit Unit1;

  interface

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ComCtrls;

  type
    TForm1 = class(TForm)
      StatusBar1: TStatusBar;
      procedure FormCreate(Sender: TObject);
    private
      procedure AppActivate(Sender: TObject);
      procedure AppOnMsg(var Msg: tagMSG; var Handled: Boolean);
      procedure ShowKeyState; //显示系统按键状态

    end;

  var
    Form1: TForm1;

  implementation

  {$R *.dfm}

  procedure TForm1.FormCreate(Sender: TObject);
  begin
      //显示系统键状态,指定事件代理
  
    ShowKeyState;
      Application.OnMessage := AppOnMsg;
      Application.OnActivate := AppActivate;
  end;

  procedure TForm1.AppActivate(Sender: TObject);
  begin
      ShowKeyState;   //应用程序被激活时刷新系统键状态
  
end;

  procedure TForm1.ShowKeyState;
  begin
      if (GetKeyState(145) and 1)0 then
          StatusBar1.Panels.Items[6].Text := 'SCOR'
      else
          StatusBar1.Panels.Items[6].Text := '';
      if (GetKeyState(144) and 1)0 then
          StatusBar1.Panels.Items[5].Text := 'NUM'
      else
          StatusBar1.Panels.Items[5].Text := '';
      if (GetKeyState(45) and 1)0 then
          StatusBar1.Panels.Items[4].Text := '插入'
      else
          StatusBar1.Panels.Items[4].Text := '覆盖';
      if (GetKeyState(20) and 1)0 then
          StatusBar1.Panels.Items[3].Text := '大写'
      else
          StatusBar1.Panels.Items[3].Text := '小写';
  end;

  procedure TForm1.AppOnMsg(var Msg: tagMSG; var Handled: Boolean);
  begin
      if Msg.message = 256 then begin //WM_KEYDOWN
  
        case Msg.wParam of  //根据按键切换显示
  
            145:  //Scorll
  
                if (GetKeyState(145) and 1)0 then
                      StatusBar1.Panels.Items[6].Text := 'SCOR'
                  else
                      StatusBar1.Panels.Items[6].Text := '';
              144:   //Num
  
                if (GetKeyState(144) and 1)0 then
                      StatusBar1.Panels.Items[5].Text := 'NUM'
                  else
                      StatusBar1.Panels.Items[5].Text := '';
              45:   //Ins
  
                if (GetKeyState(45) and 1)0 then
                      StatusBar1.Panels.Items[4].Text := '插入'
                  else
                      StatusBar1.Panels.Items[4].Text := '覆盖';
              20:   //Caps
  
                if (GetKeyState(20) and 1)0 then
                      StatusBar1.Panels.Items[3].Text := '大写'
                  else
                      StatusBar1.Panels.Items[3].Text := '小写';
          end;
      end;

      Handled := false;   //让系统继续处理消息
  
end;

  end.
  

展开更多 50%)
分享

猜你喜欢

以最少的资源耗用显示系统键状态

编程语言 网络编程
以最少的资源耗用显示系统键状态

显示WinXP资源管理器中的状态栏

windows 操作系统
显示WinXP资源管理器中的状态栏

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Win7系统显示“系统资源不足”的原因及解决方案

电脑网络
Win7系统显示“系统资源不足”的原因及解决方案

输入状态显示功能简介

电脑入门
输入状态显示功能简介

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

用Delphi检测特殊键状态

Delphi
用Delphi检测特殊键状态

管理系统进程 优化系统资源

windows 操作系统
管理系统进程 优化系统资源

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

你、仍不离 我、终不弃 - QQ情侣分组

你、仍不离 我、终不弃 - QQ情侣分组

组件制作之一(概念)

组件制作之一(概念)
下拉加载更多内容 ↓