Delphi 中的全局快捷键+给指定窗体发送按键
【背景】
公司做视频影像采集,平时采集图像的时候都需要打开采集窗口,然后需要开着采集窗口来进行图像采集。同事问我能不能做一个全局快捷键,哪怕我没有操作也可以采集图像。说干就干,一直想做全局快捷键了,网上找了一些代码,凑合了一下,达到了实现的效果,同事反应使用效果不错。
【知识点】
本代码有如下Delphi知识可以参考学习:
1、Delphi ini文件的读取写入。
2、Delphi全局快捷键的检测和注册。
3、Delphi给指定窗体发送按键。
4、Delphi任务栏显示、隐藏自己的程序。
5、Delphi中给你的程序置顶.
【效果】
【代码】
unit U_Main; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, IniFiles; type
Tfrm_Main = class(TForm)
btn_Capture: TButton;
lbl_Tip: TLabel;
btn_Close: TButton;
procedure btn_CaptureClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormDestroy(Sender: TObject);
procedure btn_CloseClick(Sender: TObject);
private
aatom: ATOM; // 全局快捷键
procedure hotykey(var msg: TMessage); message WM_HOTKEY; // 定义全局热键消息事件
{ Private declarations }
public
{ Public declarations }
end; var
frm_Main: Tfrm_Main;
KeyValue: Integer; implementation {$R *.dfm} procedure Tfrm_Main.btn_CaptureClick(Sender: TObject);
var
h: THandle;
begin
h := FindWindow(nil, ('视频影像'));
if h > then
lbl_Tip.Caption := '视频影像已打开,可以采集!'
else
lbl_Tip.Caption := '视频影像未打开,不可采集!';
// SetForegroundWindow(h);
PostMessage(h, WM_KEYDOWN, VK_SPACE, ); end; procedure Tfrm_Main.hotykey(var msg: TMessage);
var
h: THandle;
begin
if TWMHotKey(msg).HotKey = aatom then
begin
// ShowMessage('s');
end; if (msg.LParamHi = KeyValue) then
begin
// 全局快捷键处理事件
// ShowMessage('视频影像采集开始');
h := FindWindow(nil, ('视频影像'));
if h > then
lbl_Tip.Caption := '视频影像已打开,可以采集!'
else
lbl_Tip.Caption := '视频影像未打开,不可采集!';
PostMessage(h, WM_KEYDOWN, VK_SPACE, );
end;
end; procedure Tfrm_Main.btn_CloseClick(Sender: TObject);
begin
Self.Close;
end; procedure Tfrm_Main.FormCreate(Sender: TObject);
var
Config: Tinifile;
begin // 读取位置
Config := Tinifile.Create(ExtractFilePath(Application.Exename)
+ 'Config.ini');
Self.Top := StrToInt(Config.ReadString('Config', 'strTop', ''));
Self.Left := StrToInt(Config.ReadString('Config', 'strLeft', ''));
KeyValue := StrToInt(Config.ReadString('Config', 'Key', '')); if KeyValue <> then
begin
case KeyValue of
:
btn_Capture.Caption := '【F1 视频图像采集】';
:
btn_Capture.Caption := '【F2 视频图像采集】';
:
btn_Capture.Caption := '【F3 视频图像采集】';
:
btn_Capture.Caption := '【F4 视频图像采集】';
:
btn_Capture.Caption := '【F5 视频图像采集】';
:
btn_Capture.Caption := '【F6 视频图像采集】';
:
btn_Capture.Caption := '【F7 视频图像采集】';
:
btn_Capture.Caption := '【F8 视频图像采集】';
:
btn_Capture.Caption := '【F9 视频图像采集】';
:
btn_Capture.Caption := '【F10 视频图像采集】';
:
btn_Capture.Caption := '【F11 视频图像采集】';
:
btn_Capture.Caption := '【F12 视频图像采集】'; end;
end; // 建立全局快捷键
if FindAtom('HotKey') = then
begin
aatom := GlobalAddAtom('HotKey');
end;
if RegisterHotKey(Handle, aatom, , KeyValue) then
begin
// MessageBox(Handle, '按F8', '提示', MB_OK);
end; lbl_Tip.Caption := '';
SetWindowPos(frm_Main.Handle, HWND_TOPMOST, frm_Main.Left, frm_Main.Top,
frm_Main.Width, frm_Main.Height, );
// 在任务栏隐藏
SetWindowLong(frm_Main.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); // btn_CaptureClick(Sender);
// 在任务栏显示
// SetWindowLong(frm_Main.Handle, GWL_EXSTYLE, WS_EX_APPWINDOW);
end; procedure Tfrm_Main.FormDestroy(Sender: TObject);
begin
UnregisterHotKey(Handle, aatom);
GlobalDeleteAtom(aatom);
end; procedure Tfrm_Main.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
Config: Tinifile;
begin
if (ssleft in Shift) then
begin
ReleaseCapture;
Perform(WM_syscommand, $F012, );
end; // 读取位置
Config := Tinifile.Create(ExtractFilePath(Application.Exename)
+ 'Config.ini'); Config.WriteString('Config', 'strTop', IntToStr(Self.Top));
Config.WriteString('Config', 'strLeft', IntToStr(Self.Left)); end; end.
Delphi 中的全局快捷键+给指定窗体发送按键的更多相关文章
- 在WPF中使用全局快捷键
今天写一个小程序中使用到了全局快捷键,找到了我之前写的文章在c#中使用全局快捷键翻了一下,发现它是WinForm版本的,而我现在大部分写WPF程序了,便将其翻译了为WPF版本的了. static cl ...
- delphi中的idhttpserver如何才能收到idhttp发送来的exe\rar文件呢
http://zhidao.baidu.com/link?url=-q2oXqYCKBZ9OgFDEHAcQwQEY_NroHcqGvVfKW67X5sF9LdjAAB_HPXQo04VxStFVS7 ...
- 在 WinForms 项目中使用全局快捷键
借助于全局快捷键,用户可以在任何地方操控程序,触发对应的功能.但 WinForms 框架并没有提供全局快捷键的功能.想要实现全局快捷键需要跟 Windows API 打交道.本文就交你如何使用 Win ...
- 用C#调用Windows API向指定窗口发送按键消息 z
用C#调用Windows API向指定窗口发送 一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.Interop ...
- C#中使用 SendMessage 向非顶端窗体发送组合键
开门见山,不废话了, 直接举例说明一下: 比如发送ALT + F 以下是 用spy++截取的消息内容 <00001> 000310DC P WM_SYSKEYDOWN nVirtKey:V ...
- 用C#调用Windows API向指定窗口发送按键消息
一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.InteropServices; 2.引用需要使用的方法,格式 ...
- Delphi中SendMessage使用说明(所有消息说明) good
Delphi中SendMessage使用说明 SendMessage基础知识 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.而函数Po ...
- delphi中SendMessage使用说明
SendMessage基础知识 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.而函数PostMessage不同,将一个消息寄送到一个线 ...
- Delphi中实现MDI子窗体(转)
Delphi中实现MDI子窗体 用MDI实现浏览子窗口,具有窗口管理功能,同屏观看多个网页的内容 ① 多文档窗体(MDI) MDI窗体是一种具有主子结构的窗体体系,微软的Word便是其中的一 ...
随机推荐
- iOS 关于流媒体 的初级认识与使用
1.流媒体指在Internet/Intranet中使用流式传输技术的连续时基媒体,如:音频.视频或多媒体文件.流式媒体在播放前并不下载整个文件,只将开始部分内容存入内存,流式媒体的数据流随时传送随时播 ...
- Boost.Foreach
BOOST_FOREACH简化了C++的循环遍历序列元素. 支持的序列类型:Boost.Range识别的序列 STL容器 数组 Null-terminated String std::pair of ...
- UITabbar的简单操作和实际应用
简易编辑Tabbar //**标签栏控制器的初始化 UITabBarController * tabbarC = [[UITabBarController alloc] init]; //设置tab ...
- web 分类 和使用Dreamweaver
1.iE 2.火狐的fox 3.谷歌的Chrome 在编写的代码要符合W3c统一的国际标准 二:使用Dreamweaver: Dreamweaver只能用辅助,生成的代码要修改,…… ———编写的代码 ...
- Chrome隐身模式有什么用
最近发布的Chrome浏览器,小编发现有一个个“隐身窗口”功能,那么这是什么功能呢?原来这是Chrome隐身模式!那么这个隐身模式有什么功能呢? Chrome隐身模式有什么用? 从官方的介绍来看,“隐 ...
- 为Asp.Net Web Api添加Http基本认证
Asp.net Web Api提供了RESTFul web服务的编程接口.默认RESTFul 服务没有提供任何验证或者基于角色的验证,这显然不适合Put.Post.Delete这些操作.Aps.net ...
- 剑指Offer09 数值的整数次方
/************************************************************************* > File Name: 09_Power. ...
- BZOJ 2819: Nim dfs序维护树状数组,倍增
1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析: ...
- freeCodeCamp:Where art thou
写一个 function,它遍历一个对象数组(第一个参数)并返回一个包含相匹配的属性-值对(第二个参数)的所有对象的数组.如果返回的数组中包含 source 对象的属性-值对,那么此对象的每一个属性- ...
- 浅析为什么char类型的范围是 —128~+127
转载于daiyutage 在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是-128~127,这个问题貌似看起来 ...