• Delphi 中的全局快捷键+给指定窗体发送按键


    【背景】

    公司做视频影像采集,平时采集图像的时候都需要打开采集窗口,然后需要开着采集窗口来进行图像采集。同事问我能不能做一个全局快捷键,哪怕我没有操作也可以采集图像。说干就干,一直想做全局快捷键了,网上找了一些代码,凑合了一下,达到了实现的效果,同事反应使用效果不错。

    【知识点】

    本代码有如下Delphi知识可以参考学习:

    1、Delphi ini文件的读取写入。

    2、Delphi全局快捷键的检测和注册。

    3、Delphi给指定窗体发送按键。

    4、Delphi任务栏显示、隐藏自己的程序。

    5、Delphi中给你的程序置顶.

    【效果】

    【代码】

      1 unit U_Main;
      2  
      3 interface
      4  
      5 uses
      6   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      7   Dialogs, StdCtrls, ExtCtrls, IniFiles;
      8  
      9 type
     10   Tfrm_Main = class(TForm)
     11     btn_Capture: TButton;
     12     lbl_Tip: TLabel;
     13     btn_Close: TButton;
     14     procedure btn_CaptureClick(Sender: TObject);
     15     procedure FormCreate(Sender: TObject);
     16     procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
     17       Shift: TShiftState; X, Y: Integer);
     18     procedure FormDestroy(Sender: TObject);
     19     procedure btn_CloseClick(Sender: TObject);
     20   private
     21     aatom: ATOM; // 全局快捷键
     22     procedure hotykey(var msg: TMessage); message WM_HOTKEY; // 定义全局热键消息事件
     23     { Private declarations }
     24   public
     25     { Public declarations }
     26   end;
     27  
     28 var
     29   frm_Main: Tfrm_Main;
     30   KeyValue: Integer;
     31  
     32 implementation
     33  
     34 {$R *.dfm}
     35  
     36 procedure Tfrm_Main.btn_CaptureClick(Sender: TObject);
     37 var
     38   h: THandle;
     39 begin
     40   h := FindWindow(nil, ('视频影像'));
     41   if h > 0 then
     42     lbl_Tip.Caption := '视频影像已打开,可以采集!'
     43   else
     44     lbl_Tip.Caption := '视频影像未打开,不可采集!';
     45   // SetForegroundWindow(h);
     46   PostMessage(h, WM_KEYDOWN, VK_SPACE, 0);
     47  
     48 end;
     49  
     50 procedure Tfrm_Main.hotykey(var msg: TMessage);
     51 var
     52   h: THandle;
     53 begin
     54   if TWMHotKey(msg).HotKey = aatom then
     55   begin
     56     // ShowMessage('s');
     57   end;
     58  
     59   if (msg.LParamHi = KeyValue) then
     60   begin
     61     // 全局快捷键处理事件
     62     // ShowMessage('视频影像采集开始');
     63     h := FindWindow(nil, ('视频影像'));
     64     if h > 0 then
     65       lbl_Tip.Caption := '视频影像已打开,可以采集!'
     66     else
     67       lbl_Tip.Caption := '视频影像未打开,不可采集!';
     68     PostMessage(h, WM_KEYDOWN, VK_SPACE, 0);
     69   end;
     70 end;
     71  
     72 procedure Tfrm_Main.btn_CloseClick(Sender: TObject);
     73 begin
     74   Self.Close;
     75 end;
     76  
     77 procedure Tfrm_Main.FormCreate(Sender: TObject);
     78 var
     79   Config: Tinifile;
     80 begin
     81  
     82   // 读取位置
     83   Config := Tinifile.Create(ExtractFilePath(Application.Exename)
     84       + 'Config.ini');
     85   Self.Top := StrToInt(Config.ReadString('Config', 'strTop', '100'));
     86   Self.Left := StrToInt(Config.ReadString('Config', 'strLeft', '100'));
     87   KeyValue := StrToInt(Config.ReadString('Config', 'Key', '118'));
     88  
     89   if KeyValue <> 0 then
     90   begin
     91     case KeyValue of
     92       112:
     93         btn_Capture.Caption := '【F1 视频图像采集】';
     94       113:
     95         btn_Capture.Caption := '【F2 视频图像采集】';
     96       114:
     97         btn_Capture.Caption := '【F3 视频图像采集】';
     98       115:
     99         btn_Capture.Caption := '【F4 视频图像采集】';
    100       116:
    101         btn_Capture.Caption := '【F5 视频图像采集】';
    102       117:
    103         btn_Capture.Caption := '【F6 视频图像采集】';
    104       118:
    105         btn_Capture.Caption := '【F7 视频图像采集】';
    106       119:
    107         btn_Capture.Caption := '【F8 视频图像采集】';
    108       120:
    109         btn_Capture.Caption := '【F9 视频图像采集】';
    110       121:
    111         btn_Capture.Caption := '【F10 视频图像采集】';
    112       122:
    113         btn_Capture.Caption := '【F11 视频图像采集】';
    114       123:
    115         btn_Capture.Caption := '【F12 视频图像采集】';
    116  
    117     end;
    118   end;
    119  
    120   // 建立全局快捷键
    121   if FindAtom('HotKey') = 0 then
    122   begin
    123     aatom := GlobalAddAtom('HotKey');
    124   end;
    125   if RegisterHotKey(Handle, aatom, 0, KeyValue) then
    126   begin
    127     // MessageBox(Handle, '按F8', '提示', MB_OK);
    128   end;
    129  
    130   lbl_Tip.Caption := '';
    131   SetWindowPos(frm_Main.Handle, HWND_TOPMOST, frm_Main.Left, frm_Main.Top,
    132     frm_Main.Width, frm_Main.Height, 0);
    133   // 在任务栏隐藏
    134   SetWindowLong(frm_Main.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
    135  
    136   // btn_CaptureClick(Sender);
    137   // 在任务栏显示
    138   // SetWindowLong(frm_Main.Handle, GWL_EXSTYLE, WS_EX_APPWINDOW);
    139 end;
    140  
    141 procedure Tfrm_Main.FormDestroy(Sender: TObject);
    142 begin
    143   UnregisterHotKey(Handle, aatom);
    144   GlobalDeleteAtom(aatom);
    145 end;
    146  
    147 procedure Tfrm_Main.FormMouseDown(Sender: TObject; Button: TMouseButton;
    148   Shift: TShiftState; X, Y: Integer);
    149 var
    150   Config: Tinifile;
    151 begin
    152   if (ssleft in Shift) then
    153   begin
    154     ReleaseCapture;
    155     Perform(WM_syscommand, $F012, 0);
    156   end;
    157  
    158   // 读取位置
    159   Config := Tinifile.Create(ExtractFilePath(Application.Exename)
    160       + 'Config.ini');
    161  
    162   Config.WriteString('Config', 'strTop', IntToStr(Self.Top));
    163   Config.WriteString('Config', 'strLeft', IntToStr(Self.Left));
    164  
    165 end;
    166  
    167 end.
  • 相关阅读:
    bootstrap 超大屏幕(Jumbotron)
    Bootstrap历练实例:激活导航状态
    Bootstrap 徽章(Badges)
    Bootstrap历练实例:标签修饰
    Bootstrap 标签
    bootstrap 翻页的状态
    [uiautomator篇][10] uiautomator进阶
    [adb 学习篇] adb pull
    安装adb工包
    [python IO学习篇] 补充中文编码
  • 原文地址:https://www.cnblogs.com/yhsc/p/3438600.html
Copyright © 2020-2023  润新知