【背景】

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

【知识点】

本代码有如下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 中的全局快捷键+给指定窗体发送按键的更多相关文章

  1. 在WPF中使用全局快捷键

    今天写一个小程序中使用到了全局快捷键,找到了我之前写的文章在c#中使用全局快捷键翻了一下,发现它是WinForm版本的,而我现在大部分写WPF程序了,便将其翻译了为WPF版本的了. static cl ...

  2. delphi中的idhttpserver如何才能收到idhttp发送来的exe\rar文件呢

    http://zhidao.baidu.com/link?url=-q2oXqYCKBZ9OgFDEHAcQwQEY_NroHcqGvVfKW67X5sF9LdjAAB_HPXQo04VxStFVS7 ...

  3. 在 WinForms 项目中使用全局快捷键

    借助于全局快捷键,用户可以在任何地方操控程序,触发对应的功能.但 WinForms 框架并没有提供全局快捷键的功能.想要实现全局快捷键需要跟 Windows API 打交道.本文就交你如何使用 Win ...

  4. 用C#调用Windows API向指定窗口发送按键消息 z

    用C#调用Windows API向指定窗口发送 一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.Interop ...

  5. C#中使用 SendMessage 向非顶端窗体发送组合键

    开门见山,不废话了, 直接举例说明一下: 比如发送ALT + F 以下是 用spy++截取的消息内容 <00001> 000310DC P WM_SYSKEYDOWN nVirtKey:V ...

  6. 用C#调用Windows API向指定窗口发送按键消息

    一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.InteropServices; 2.引用需要使用的方法,格式 ...

  7. Delphi中SendMessage使用说明(所有消息说明) good

    Delphi中SendMessage使用说明 SendMessage基础知识 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.而函数Po ...

  8. delphi中SendMessage使用说明

    SendMessage基础知识 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.而函数PostMessage不同,将一个消息寄送到一个线 ...

  9. Delphi中实现MDI子窗体(转)

        Delphi中实现MDI子窗体 用MDI实现浏览子窗口,具有窗口管理功能,同屏观看多个网页的内容  ① 多文档窗体(MDI) MDI窗体是一种具有主子结构的窗体体系,微软的Word便是其中的一 ...

随机推荐

  1. iOS uiscrollView 嵌套 问题 的解决

    苹果官方文档里面提过,最好不要嵌套scrollView,特别提过UITableView和UIWebView,因为在滑动时,无法知道到底是希望superScrollView滑动还是subScrollVi ...

  2. 2015 FVDI V6.3 Software Free Download

    2015 FVDI with software USB dongle has newly upgraded to V6.3. Here software upgrade list: ABRITES C ...

  3. TFS 2010 使用手册(二)项目集合与项目

    1.项目集合 1.1 项目集合创建 打开TFS管理控制台,点击“团队项目集合”. 图1点击“团队项目集合” 图2 点击“创建集合” 然后按照向导一步步完成项目集合的创建. 1.2 项目集合的删除 选中 ...

  4. IOS开发篇UI之重用scrollView

    1.scrollView的介绍 scrollView是UI中的基础视图,他有着至关重要的作用,也是我们在UI中常用的控件.他的代理有很多我们需要用,这里我们就不再一一介绍了. 2.简单scrollVi ...

  5. [转]Android 应用的自动升级、更新模块的实现

    本文转自:http://www.oschina.net/question/163910_28462 我们看到很多Android应用都具有自动更新功能,用户一键就可以完成软件的升级更新.得益于Andro ...

  6. 正则转nfa:bug消除

    正则到nfabug的解决方法 前面提到了这个bug,为了解决这个bug,我们必须在每次引用到一个假名的时候,都构建一个拷贝.现在假设我们遇到了一个假名,并得到了他的开始节点和结束节点,当前的难题就是构 ...

  7. POJ 2031 Building a Space Station (最小生成树)

    Building a Space Station Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5173   Accepte ...

  8. Linux公社资料库地址

    免费下载地址在 http://linux.linuxidc.com/用户名与密码都是http://www.linuxidc.com

  9. C#用反射判断一个类型是否是Nullable同时获取它的根类型(转自网络)

    在我们的应用程序中我们使用类描述我们的业务对象,为我们产生一些报表之类的,那就依赖大量不同的对象,我们创建一个帮助方法来转换我们的业务对象,或是一个List的业务对象到DataTables. 由于数据 ...

  10. Android开发之AlarmManager详解

    AlarmManager实质是一个全局的定时器,是Android中常用的一种系统级别的提示服务,在指定时间或周期性启动其它组件(包括Activity,Service,BroadcastReceiver ...