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.

 

posted @ 2013-11-23 08:24  不平凡总在于坚持!  阅读(3540)  评论(0编辑  收藏  举报