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.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM