要想在上海拍牌的超低中标率中把握机会、占得先机,您不仅需要事先准备好最优的竞拍策略,还要制定若干套应急预案,应对不时之需。既定策略交给计算机自动执行,没有问题。可是谁来召唤应急预案呢?使用全局热键应该是个不错的选择。

正确使用全局热键,您得按下面的步骤来:

  1. 向系统注册HotKey(可以是一个键,也可以是组合键)。
  2. 接收系统WM_HOTKEY消息,触发你的HOTKEY事件。
  3. 完成你的事件处理程序。
  4. 程序结束时,记得注销HotKey。

注册HotKey

先来看看,我们需要用到哪些WinAPI函数:

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk); [DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern ushort GlobalAddAtom(string lpString);

GlobalAddAtom函数的功能是向系统全局原子表添加原子,全局原子表是系统用来共享信息的,我们在这里用它产生一个唯一标识号,供RegisterHotKey函数使用,避免注册的热键与其他程序的热键冲突。

RegisterHotKey注册热键函数的3个传入参数含义分别如下

  • hWnd 响应热键事件的窗口句柄。
  • id 一个唯一标识号,通过GlobalAddAtom函数获得
  • fsModifiers 组合键CTRL、ALT、SHIFT等键(我一般不用,加个组合键影响操作速度)。
  • vk 热键键值

注销HotKey

注册的逆向操作而已,仅给出WinAPI函数声明吧。

[DllImport("kernel32.dll", SetLastError=true, ExactSpelling=true)]
static extern ushort GlobalDeleteAtom(ushort nAtom); [DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool UnregisterHotKey(IntPtr hWnd, int id);

接收HotKey消息

我们需要写一个实现IMessageFilter接口的类,并把这个类实例通过System.Windows.Forms.Application.AddMessageFilter(IMessageFilter)方法添加到消息筛选器中去,当消息产生时会调用IMessageFilter接口的PreFilterMessage方法,通过PreFilterMessage方法可以触发我们自己的消息处理函数。

下面的代码,定义了一个简单的筛选器类:

public delegate void HotkeyEventHandler(int HotKeyID);

public class HotKey : System.Windows.Forms.IMessageFilter
{
IntPtr hWnd;
readonly int WM_HOTKEY = 0x312;
public enum KeyFlags { MOD_ALT = 0x1, MOD_CONTROL = 0x2, MOD_SHIFT = 0x4, MOD_WIN = 0x8 } System.Collections.Hashtable keyIDs = new System.Collections.Hashtable(); public event HotkeyEventHandler OnHotkey; [DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern ushort GlobalAddAtom(string lpString); [DllImport("kernel32.dll", SetLastError=true, ExactSpelling=true)]
static extern ushort GlobalDeleteAtom(ushort nAtom); [DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk); [DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool UnregisterHotKey(IntPtr hWnd, int id); public HotKey(IntPtr hWnd)
{
this.hWnd = hWnd;
System.Windows.Forms.Application.AddMessageFilter(this); //添加到消息筛选器
} public int RegisterHotkey(System.Windows.Forms.Keys Key, KeyFlags keyflags)
{
String keyname = System.Guid.NewGuid().ToString();
int hotkeyid = GlobalAddAtom(keyname); //添加全局原子表
RegisterHotKey((IntPtr)hWnd, hotkeyid, (UInt32)keyflags, (UInt32)Key); //注册热键
keyIDs.Add(keyname,hotkeyid);
return hotkeyid;
} public void UnregisterHotkeys() //注销HotKeys
{
System.Windows.Forms.Application.RemoveMessageFilter(this);
foreach (int key in keyIDs.Values)
{
UnregisterHotKey(hWnd, key);
GlobalDeleteAtom((ushort)key);
}
} public bool PreFilterMessage(ref System.Windows.Forms.Message m) //IMessageFilter接口实现
{
if (m.Msg == WM_HOTKEY)
{
if (OnHotkey != null)
{
foreach (int key in keyIDs.Values)
{
if ((int)m.WParam == key)
{
OnHotkey((int)m.WParam);
return true;
}
}
}
}
return false;
}
}

代码中如何使用

在WinForm程序中,调用方法如下:

HotKey hotKey;
private void Form1_Load(object sender, EventArgs e)
{
...
hotKey = new HotKey(this.Handle);
hotKey.RegisterHotkey(Keys.F2, 0);
hotKey.OnHotkey += hotkey_OnHotkey;
} void hotkey_OnHotkey(int HotKeyID)
{
...
MessageBox.Show("OnHotkey" + HotKeyID);
} private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (hotKey != null)
hotKey.UnregisterHotkeys();
}

结束语

本讲结束了,如何使用计算机替代的工作进行拍牌也讲完了,接下来,我们要开始介绍如何用计算机替代的工作(验证码识别)。

本次的例子,在键鼠模拟之WinAPI的例子中已经包含,可在这里下载

"拍牌神器"是怎样炼成的(三)---注册全局热键的更多相关文章

  1. 2星|《10W+走心文案是怎样炼成的》:标题党。实际是台湾创意总监的一些人生感悟和两三个很一般的创意文案

    10W+走心文案是怎样炼成的 作者是台湾人,曾在台湾奥美担任创意总监,做过一些广告.本书是他的一些经验介绍. 总体来说是标题党,作者的广告基本是电视广告,跟文案也有关系,估计播放量也很容易过10W+, ...

  2. 我的 Github 个人博客是怎样炼成的

    Joey's Blog 长大后才发现政府建造 GFW 真是太 TM 机智了,由于本人自制力较差,且不说 91porn, youporn 等两性知识网站的超强战斗力,单单一个Youtube就可以让我瞬间 ...

  3. 自由是有代价的:聊聊这几年尝试的道路 要想生活好,别看哲学书和思想书。简单看看可以,看多了问题就大了。还是要去研究研究些具体的问题。别jb坐在屋子里,嘴里念着海子的诗,脑袋里想康德想的事情,兜里屁都没有,幻想自己是大国总理,去想影帝是怎么炼成的。

    自由是有代价的:聊聊这几年尝试的道路 现在不愿意写过多的技术文章了,一点是现在做的技术比较偏,写出来看的人也不多,二来是家庭事务比较繁多,没以前那么有时间写了.最近,园子里多了一些写经历的文章,我也将 ...

  4. 测度论--长度是怎样炼成的[zz]

    http://www.58pic.com/newpic/27882296.html http://www.58pic.com/newpic/27893137.html http://699pic.co ...

  5. fir.im Weekly - 论个人技术影响力是如何炼成的

    每个圈子都有一群能力强且懂得经营自己的人,技术圈也是如此.本期 fir.im Weekly 一如往期精选了一些实用的 iOS,Android 开发工具和源码分享,还有一些关于程序员的成长 Tips 和 ...

  6. AI算法工程师炼成之路

    AI算法工程师炼成之路 面试题: l  自我介绍/项目介绍 l  类别不均衡如何处理 l  数据标准化有哪些方法/正则化如何实现/onehot原理 l  为什么XGB比GBDT好 l  数据清洗的方法 ...

  7. 老杜告诉你java小白到大神是怎么炼成的(转载)

    老杜告诉你java小白到大神是怎么炼成的 1. 学习前的准备 一个好的学习方法(应该怎么学习更高效): 一个合格的程序员应该具备两个能力 有一个很好的指法速度(敲代码快) 有一个很好的编程思想(编程思 ...

  8. 开会不用把人都轰进一个小黑屋子——《Office妖精是怎样炼成的》续2

    <Office妖精是怎样炼成的>http://blog.sina.com.cn/s/articlelist_1446470001_6_1.html 一本不是技术图书却含有技术内容的图书,一 ...

  9. 学习型的“文山表海无限发展公司”——《Office妖精是怎样炼成的》续1

    本篇无故事情节版:https://www.cnblogs.com/officeplayer/p/14841590.html <Office妖精是怎样炼成的>http://blog.sina ...

  10. Ring3下无驱动移除winlogon.exe进程ctrl+alt+del,win+u,win+l三个系统热键,非屏蔽热键(子类化SAS 窗口)

    随手而作,纯粹技术研究,没什么实际意义. 打开xuetr,正常情况下.winlogon.exe注册了三个热键.ctrl+alt+del,win+u,win+l三个. 这三个键用SetWindowsHo ...

随机推荐

  1. Composer 镜像原理 (3) —— 完结篇

    相关文章 Composer 镜像原理 (1) -- 初识 Composer Composer 镜像原理 (2) -- composer.json Composer 镜像原理 (3) -- 完结篇 上一 ...

  2. Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream

    伪 分布模式下启动spark报错 从spark1.4以后,所有spark的编译都是没有将hadoop的classpath编译进去的,所以必须在spark-env.sh中指定hadoop中的所有jar包 ...

  3. 提示工程101|与 AI 交谈的技巧和艺术

    随着 ChatGPT 的问世,人工智能(AI)新时代也正式开启.ChatGPT 是一种语言模型.它与用户进行对话交互,以便用户输入问题或提示,模型响应,然后对话可以继续来回进行,类似于在消息传递应用程 ...

  4. .Net Core控制台程序读取Json配置文件

    1 添加依赖(可以直接通过nuget包安装 Microsoft.Extensions.Configuration.Json 这个会依赖其他两个会自动安装依赖的) Microsoft.Extension ...

  5. The language server needs at least PHP 7.1 installed. Version found: 7.0.10

    解决方案: 打开VS Code 文件 -> 首选项 -> 设置 -> 在 settings.json 中编辑 在 settings.json 中,加入: "php.exec ...

  6. c#如何使用WASM跨语言调用?

    介绍Wasm(WebAssembly) WebAssembly(简称Wasm)是一种用于基于堆栈的虚拟机的二进制指令格式.Wasm被设计为编程语言的可移植编译目标,支持在web上部署客户端和服务器应用 ...

  7. AWD-PWN流量监控与抄流量反打

    RE手 在AWD中比较做牢,队伍里也没pwn手,在awd出现pwn靶机比较坐牢.之前都不知道pwn靶机可以抄流量反打. 参考pwn_waf:https://github.com/i0gan/pwn_w ...

  8. 渗透小tis

    知己知彼,百战不殆 1.如果提示缺少参数,如{msg:params error},可尝使用字典模糊测试构造参数,进一步攻击. 2.程序溢出,int最大值为2147483647,可尝试使用该值进行整数溢 ...

  9. 《Web安全基础》02. 信息收集

    @ 目录 1:CDN 绕过 1.1:判断是否有 CDN 服务 1.2:常见绕过方法 1.3:相关资源 2:网站架构 3:WAF 4:APP 及其他资产 5:资产监控 本系列侧重方法论,各工具只是实现目 ...

  10. 深入分布式一致性:Raft 和 etcdRaft

    分布式一致性是构建可靠的分布式系统的关键要素之一.为了确保数据的一致性和可用性,一致性算法的设计变得至关重要.在这篇博文中,我们将深入探讨两个与分布式一致性密切相关的主题:Raft 算法和 etcdR ...