【背景】

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

【知识点】

本代码有如下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. Asynctask的使用及理解

    1.对于耗时的操作,我们的一般方法是开启“子线程”.如果需要更新UI,则需要使用handler 2.如果耗时的操作太多,那么我们需要开启太多的子线程,这就会给系统带来巨大的负担,随之也会带来性能方面的 ...

  2. Animation 动画详解(一)——alpha、scale、translate、rotate、set的xml属性及用法

    一.概述 Android的animation由四种类型组成:alpha.scale.translate.rotate,对应android官方文档地址:<Animation Resources&g ...

  3. 【Android 界面效果26】listview android:cacheColorHint,android:listSelector属性作用

    ListView是常用的显示控件,默认背景是和系统窗口一样的透明色,如果给ListView加上背景图片,或者背景颜色时,滚动时listView会黑掉, 原因是,滚动时,列表里面的view重绘时,用的依 ...

  4. 关于MSSQL导入导出时主键与约束丢失的问题解决

    导入数据时,使用默认选项,会丢失主键.约束.默认值等属性,按如下步骤操作: -->导出向导 -->选择数据源 -->选择目的 -->指定表复制或查询:不要使用默认选项,选择“在 ...

  5. 【转】ASP.NET 高效分页存储过程

    代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-- ...

  6. 浅析js中的this

    this的用法 this在日常javascript编码中很常见, 但是一直以来没有好好总结过. 今天在这里好好总结一下. 本文只讨论浏览器环境. this指向全局 var name = "w ...

  7. EL函数

    EL表达式语法允许开发人员开发自定义函数,以调用Java类的方法. •示例:${prefix:method(params)} •在EL表达式中调用的只能是Java类的静态方法. •这个Java类的静态 ...

  8. PAT1005—— 继续(3n+1)猜想

    卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对n=3进行验证的时候, ...

  9. 2015影响因子Excel版

    现在终于有影响因子2015的Excel版了,这个版本除了还包括杂志全称和缩写等基本信息还,包括中科院分区, 应该是迄今2015影响因子最奢华的版本了吧. 看了这个版本,发现中国的SCI杂志还是不少的, ...

  10. 在ASP.NET中发送电子邮件的实例教程

    首先.导入命名空间: 代码如下 复制代码 using System.Net.Mail; 定义发送电子邮件的方法[网上很多不同的,可以对比着看一下,WinForm的也适用]: 代码如下 复制代码 /// ...