【背景】
公司做視頻影像采集,平時采集圖像的時候都需要打開采集窗口,然后需要開着采集窗口來進行圖像采集。同事問我能不能做一個全局快捷鍵,哪怕我沒有操作也可以采集圖像。說干就干,一直想做全局快捷鍵了,網上找了一些代碼,湊合了一下,達到了實現的效果,同事反應使用效果不錯。
【知識點】
本代碼有如下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.