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