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.