using System.Runtime.InteropServices;
using System.Collections.Generic;
using System;
using System.Windows.Forms; namespace Phoenix
{
//注册系统按键消息
class HotKeys
{
[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, int modifiers, Keys vk);
[DllImport("user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id); public enum HotkeyModifiers
{
Alt = , Control = , Shift = , Win =
} public delegate void HotkeyCallbackHandler();
int keyId = ;
Dictionary<int, HotkeyCallbackHandler> keyMap = new Dictionary<int, HotkeyCallbackHandler>(); /// <summary>
/// 注册快捷键
/// </summary>
/// <param name="hWnd">持有快捷键窗口的句柄</param>
/// <param name="modifiers">组合键</param>
/// <param name="vk">快捷键的虚拟码</param>
/// <param name="callback">回调函数,在按下快捷键后调用</param>
public void Regist(IntPtr hWnd, int modifiers, Keys vk, HotkeyCallbackHandler callback)
{
int id = keyId++;
if (!RegisterHotKey(hWnd, id, modifiers, vk))
{
throw new Exception("RegisterHotKey Error!");
}
keyMap[id] = callback;
}
public void UnRegist(IntPtr hWnd, HotkeyCallbackHandler callback)
{
foreach (var item in keyMap)
{
if (item.Value == callback)
UnregisterHotKey(hWnd, item.Key);
}
} public void ProcessHotKey(Message message)
{
if (message.Msg == 0x312)
{
int id = message.WParam.ToInt32();
HotkeyCallbackHandler handler;
if (keyMap.TryGetValue(id, out handler))
handler();
}
}
}
}
//http://www.cnblogs.com/vvv999vz/archive/2011/08/03/2126503.html

using System;
using System.Collections.Generic; using System.Runtime.InteropServices;
using System.Windows.Forms; namespace Phoenix
{ class MyForm : Form
{
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string className, string titleName);
[DllImport("user32.dll")]
public static extern IntPtr FindWindowEx(IntPtr parent, IntPtr child, string className, string formText);
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, string lParam); HotKeys hotKey = new HotKeys(); protected override void WndProc(ref Message message)
{
hotKey.ProcessHotKey(message);
base.WndProc(ref message);
} //跨越程序输入,向记事本的文本框写入指定字符
public void callBack()
{
const int WM_SETTEXT = 0x00c;
IntPtr hWndNotepad = FindWindow(null, "无标题 - 记事本");
IntPtr hTextbox1 = FindWindowEx(hWndNotepad, IntPtr.Zero, "EDIT", null);
IntPtr hTextbox2 = FindWindowEx(hWndNotepad, hTextbox1, "EDIT", null);
SendMessage(hTextbox1, WM_SETTEXT, IntPtr.Zero, this.Text);
} static void Main(string[] args)
{
MyForm form = new MyForm() { Text = "C#模拟键盘输入" };
form.Load += delegate
{
//register Ctrl+E
form.hotKey.Regist(form.Handle, (int)HotKeys.HotkeyModifiers.Control, Keys.E, form.callBack);
};
Application.Run(form); }
}
}

C#利用WIN32实现按键注册的更多相关文章

  1. ASP.net(C#)利用SQL Server实现注册和登陆功能

    说说我现在吧,楼主现在从事的事IT行业,主攻DotNet技术:当然这次上博客园我也是有备而来,所有再次奉献鄙人拙作,以飨诸位,望诸位不吝赐教. 世界上大多数的工作都是熟练性的工种,编程也不例外,做久了 ...

  2. 怎么利用WinPE恢复系统注册表?

    我们的电脑总是会遇到各种各样的问题,最好用的方式就是电脑重装,重装系统的方式有很多,光盘安装.硬盘安装.U盘安装等.但是碰到电脑系统瘫痪无法启动,甚至连安全模式也进不了的时候,你的光盘.硬盘就没有用处 ...

  3. 如何利用WordPress创建自定义注册表单插件

    来源:http://www.ido321.com/1031.html 原文:Creating a Custom WordPress Registration Form Plugin 译文:创建一个定制 ...

  4. 利用 Win32 启动和检测 UWP App 的方法

    一种启动和检测 UWP 应用的方法 背景 我们发布过多款 UWP 平台的同类型 App ,最近有一个需求:用传统 Win32 程序启动我们的 UWP 程序.因为我们的每一个UWP App在客户机器上都 ...

  5. 利用_winreg模块在注册表中分析无线访问热点

    _winreg.OpenKey(key, sub_key, res, sam)     key是一个已经打开的键,或者是HKEY_CLASSES_ROOT.HKEY_CURRENT_USER.HKEY ...

  6. AutoCAD C# 利用反射导出所注册的命令

    主函数导出某一程序集AutoCAD 注册命令 /// <summary> ///提取所有的命令 /// </summary> /// <param name=" ...

  7. 利用etcd实现服务注册和服务发现

    文章目录 服务注册 服务发现 协议编写 服务端实现 客户端实现 实验结果 参考文章 服务注册 主要逻辑在go func函数里面,先是去etcd获取一下服务,没有获取到的话就注册进去. package ...

  8. 1、win32创建窗口函数(windows程序内部运行机制)

    利用win32创建窗口函数,主要操作步骤为: 1.设计一个窗口类 2.注册窗口类 3.创建窗口 4.显示及窗口更新 5.消息循环 6.窗口过程函数   (1)设计一个窗口类 设计窗口类,这样的类型已经 ...

  9. win32创建窗口函数(windows程序内部运行机制)

    利用win32创建窗口函数,主要操作步骤为: 1.设计一个窗口类 2.注册窗口类 3.创建窗口 4.显示及窗口更新 5.消息循环 6.窗口过程函数   (1)设计一个窗口类 设计窗口类,这样的类型已经 ...

随机推荐

  1. AJAX跨域

    AJAX跨域AJAX不允许跨域访问. 跨域是指浏览器B显示的是服务器S1的数据,全是从S1取得的数据则是同域:但如果B显示的S1上的数据的某个比如img是从S2上取得的数据,则是跨域.端口不一样也是跨 ...

  2. same story,different day

    多亏了这个重感冒,宏伟计划险些又断了. 我是说当然断了一天,但是比起鄙人过往的八千多个日子,喔,虚惊一场. 又看了段lietome,作为不会看眼色的人,这样的美剧太有吸引力了.想象一下,一个八分半美女 ...

  3. System.DateUtils 3. IsPM、IsAM 判断是否为上、下午

    编译版本:Delphi XE7 function IsPM(const AValue: TDateTime): Boolean; inline;function IsAM(const AValue: ...

  4. 3.基础点的移动web

    1.移动端的屏幕适配 在Web开发中可以使用px(像素).em.pt(点).in(英寸).cm(厘米)做为长度单位,我们最常用px(像素)做为长度单位. 我们可以将上述的几种长度单位划分成相对长度单位 ...

  5. shiro中的filterChainDefinitions

    anno:对所有请求放行 logout:立刻退出当前登录用户,并重定向到指定redirectUrl,如果没有指定redirectUrl,貌似是默认重定向到登录页面. authc:当访问需要通过权限验证 ...

  6. Android-Lopper类的介绍(Handler背后的类)

    转载来自:http://www.open-open.com/lib/view/open1325668588515.html Android中的Looper类,是用来封装消息循环和消息队列的一个类,用于 ...

  7. linux修改mysql密码

    以root为列. 查看文件安装路径whereis mysql   查询运行文件所在路径(文件夹地址) which mysql /usr/bin/mysqld_safe: line 178: 5930 ...

  8. nginx文件目录权限设置

    1.有时我们web服务器上的某个文件夹只允许特定人员访问,这时我们需要在nginx配置文件中配置该文件夹的访问权限. 2.生成用户名单在nginx中我们使用htpasswd来生成用户名单下载这个pyt ...

  9. [转]require(),include(),require_once()和include_once()区别

    require(),include(),require_once()和include_once()区别 面试中最容易提到的一个PHP的问题,我想和大家共勉一下: require()和include() ...

  10. Spring源码解析 - AntPathMatcher

    文章摘要: 1. ant匹配规则 2. PathMatcher接口 3. 通过测试用例看AntPathMatcher的使用 ant匹配规则 AntPathMatcher如名使用的ant 的匹配规则,我 ...