热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DOTA快捷键助手

仅供娱乐。软件界面:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel

仅供娱乐。


软件界面:




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;


namespace DotaHelper
{
public partial class FrmDotaHelper : Form
{
public FrmDotaHelper()
{
InitializeComponent();


}


public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
static int hHook = 0;
public const int WH_KEYBOARD_LL = 13;
//LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。
private static HookProc KeyBoardHookProcedure;
private static bool IsForbiddenWindows;
//键盘Hook结构函数
[StructLayout(LayoutKind.Sequential)]


public class KeyBoardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
#region DllImport
//设置钩子
[DllImport("user32.dll")]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingCOnvention= CallingConvention.StdCall)]
//抽掉钩子
public static extern bool UnhookWindowsHookEx(int idHook);
[DllImport("user32.dll")]
//调用下一个钩子
public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);


[DllImport("kernel32.dll")]
public static extern int GetCurrentThreadId();


[DllImport("kernel32.dll")]
public static extern IntPtr GetModuleHandle(string name);
//注册系统热键
[DllImport("user32")]
public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint control, Keys vk);//注册热键
[DllImport("user32")]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);//解除热键
[DllImport("user32")]
public static extern void keybd_event(
byte bVk,
byte bScan,
uint dwFlags,
uint dwExtraInfo);//模拟键盘消息
#endregion


#region 目前小键盘7和9 only
byte VK_NUM0 = 96;
//byte VK_NUM1 = 97;
//byte VK_NUM2 = 98;
//byte VK_NUM3 = 99;
//byte VK_NUM4 = 100;
//byte VK_NUM5 = 101;
//byte VK_NUM6 = 102;
byte VK_NUM7 = 103;
byte VK_NUM8 = 104;
//byte VK_NUM9 = 105;
#endregion


#region 热键相关


///
/// 注册热键
/// NOne= 0,
//Alt = 1,
//Ctrl = 2,
//Shift = 4,
//WindowsKey = 8
///

/// 窗口句柄
public void RegisterHotKey()
{




////把shift+Q设为快捷键,快捷键ID为1
RegisterHotKey(Handle, 1, 4, Keys.Q);


////RegisterHotKey(Handle, 1, 4, Keys.D1);//把shift+1 设为快捷键




// RegisterHotKey(Handle, 2, 0, Keys.W);
}


///
/// 取消注册热键
///

/// 窗口句柄
public void UnRegisterHotKey()
{
UnregisterHotKey(Handle, 1);
// UnregisterHotKey(Handle, 2);

}


protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0x0312: //遇到了注册的快捷键ID为1,按下小键盘7
if (m.WParam.ToString().Equals("1"))
{
keybd_event(VK_NUM7, 0, 0, 0);//表示小键盘7键按下
keybd_event(VK_NUM7, 0, 0x7, 0);//小键盘7键弹起(先只做这一个格子的,基本够用了,一般都把跳刀放在这里)
}
//if (m.WParam.ToString().Equals("2"))
//{
// keybd_event(VK_NUM0, 0, 0x8, 0);//表示9键按下
// keybd_event(VK_NUM0, 0, 0x8, 0);//表示9键弹起
//}
break;
}
base.WndProc(ref m);
}


#endregion


#region 钩子相关


///
/// 开始挂钩
///

public static void Hook_Start()
{
// 安装键盘钩子
if (hHook == 0)
{
KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);


//hHook = SetWindowsHookEx(2,
// KeyBoardHookProcedure,
// GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), GetCurrentThreadId());


hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
KeyBoardHookProcedure,
GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
//如果设置钩子失败.
if (hHook == 0)
{
Hook_Clear();
//throw new Exception("设置Hook失败!");
}
}
}
//取消钩子事件
public static void Hook_Clear()
{
bool retKeyboard = true;
if (hHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hHook);
hHook = 0;
}
//如果去掉钩子失败.
if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed.");
}


//这里可以添加自己想要的信息处理
public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
{
if (nCode >= 0)
{
KeyBoardHookStruct keys = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));


if (keys.vkCode == 91 && IsForbiddenWindows)//屏蔽WINDOWS键
{
return 1;
}
//if (keys.vkCode == (int)Keys.F4 &&
// ModifierKeys == Keys.Alt)//如果是ALT+F4
//{
// return 1;
//}
//if (keys.vkCode == (int)Keys.Tab &&
// ModifierKeys == Keys.Alt)//如果是ALT+TAB
//{
// return 1;
//}


return CallNextHookEx(hHook, nCode, wParam, lParam);
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}


#endregion


private void btnStart_Click(object sender, EventArgs e)
{
if (btnStart.Text == "开始")
{
if (chkIsShortKey.Checked)
{
this.RegisterHotKey();
}
Hook_Start();
btnStart.Text = "结束";
}
else
{
if (chkIsShortKey.Checked)
{
this.UnRegisterHotKey();
}
Hook_Clear();
btnStart.Text = "开始";
}
}


private void chkWindows_CheckedChanged(object sender, EventArgs e)
{
IsForbiddenWindows = true;
}
}
}



推荐阅读
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
author-avatar
End---的天空_808
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有