【背景】

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

【知识点】

本代码有如下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. [WinForm] VS2010发布、打包安装程序(超全超详细)

    1. 在vs2010 选择“新建项目”→“ 其他项目类型”→“ Visual Studio Installer→“安装项目”: 命名为:Setup1 . 这是在VS2010中将有三个文件夹, 1.“应 ...

  2. iis8 默认不支持svc解决方法

    最近在IIS8中发布WCF服务应用时,发现IIS8不支持WCF服务svc请求,后来发现IIS8缺少对WCF服务的Managed Handler,按照以下步骤添加后,IIS8即支持WCF服务. 1. 首 ...

  3. springmvc(1)--配置

    最近把spring的使用整理下,版本4.1.1.RELEASE SpringMVC是一个基于DispatcherServlet的MVC框架,每一个请求先访问的都是DispatcherServlet,D ...

  4. Interesting Applications in Machine Learning and Computer Vision

    1.Visually Indicated Sounds 网址:http://vis.csail.mit.edu/ 通过视频预测敲打的声音 2.AI Porn Video Editor 代码网址:htt ...

  5. Python之时间统计

    1. import time start_time = time.time() print('time %ds'%(time.time() - start_time))

  6. PL/SQL在win7X 64下安装

    oracle11g怎么安装在此不作说明,网上到处都是,主要针对PL/SQL的安装配置 下载地址: PLSQL Developer: http://pan.baidu.com/s/1nt7G4cD X6 ...

  7. Table of Contents - Git

    Downloading and  Installing Git Download for Linux and Unix Integration with Eclipse Eclipse 提交工程至 G ...

  8. CSS3--动态实现ToolTip效果(实例)

    效果图如下↓↓↓↓↓  (知识点见代码注释) HTML <!DOCTYPE html> <html lang="en"> <head> < ...

  9. PHP动态函数

    header('Content-type:text/html;Charset=utf8'); function welcome(){ echo 'Welcome to you.'; } functio ...

  10. 在Linux下进行磁盘分区

      1.         分区前的规划   2.         查看本机上的磁盘信息   3.         对第二个磁盘进行交换式分区操作(输入m为帮助信息) 图 1:n为新建分区 图 2:p为 ...