调用win32 API,实现全局系统热键小结

python+tkinter+pywin32实现程序后台运行! 最近利用pyautogui和tkinter写了一个类似按键精灵的小程序,然后突然想起了好多程序都有一个老板键的功能,就是按下热键界面就隐藏了,进入后台运行,再按一下就出来,为什么叫老板键,当然是为了上班摸鱼不被老板发现。 话不多说,直奔主题: 实现该功能的核心是利用pywin32模块,也在搜索过许多帖子,用的ctypes模块,不够直白啊,今天我们来个简单粗暴。 隆重介绍出厂的第一位API,显示或隐藏窗口函数 win32gui.ShowWindow(hWnd, cmdShow ) 第一个参数窗口句柄,第二个参 阅读详情
      最近在做客服呼叫中心的项目,是C/S的windows系统,其中有个模块要实现象QQ那样的热键呼出,所以总结了一下这方面的代码。
//API辅助操作类
using System;
using System.Windows.Forms; // for Key namespace
using System.Runtime.InteropServices;
 
namespace hotkeytest
{
 /// <summary>
 /// WIN32 Windows API辅助操作类.
 /// </summary>
 public class NativeWIN32
 {
  public NativeWIN32()
  {}
  /* ------- using WIN32 Windows API in a C# application ------- */
 
  [DllImport("user32.dll", CharSet=CharSet.Auto)]
  static public extern IntPtr GetForegroundWindow(); //
 
  [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
   public struct STRINGBUFFER
  {
   [MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)]
   public string szText;
  }
 
  [DllImport("user32.dll", CharSet=CharSet.Auto)]
  public static extern int GetWindowText(IntPtr hWnd,  out STRINGBUFFER ClassName, int nMaxCount);
 
  [DllImport("user32.dll", CharSet=CharSet.Auto)]
  public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
 
  [DllImport("user32.dll", CharSet=CharSet.Auto)]
  public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam);
 
  public const int WM_SYSCOMMAND = 0x0112;
  public const int SC_CLOSE = 0xF060;
 
  public delegate bool EnumThreadProc(IntPtr hwnd, IntPtr lParam);
 
  [DllImport("user32.dll", CharSet=CharSet.Auto)]
  public static extern bool EnumThreadWindows(int threadId, EnumThreadProc pfnEnum, IntPtr lParam);
 
  [DllImport("user32.dll", CharSet=CharSet.Auto)]
  public static extern IntPtr FindWindowEx(IntPtr parent, IntPtr next, string sClassName, IntPtr sWindowTitle);
 

  /* ------- using HOTKEYs in a C# application -------
 
  in form load :
   bool success = RegisterHotKey(Handle, 100,     KeyModifiers.Control | KeyModifiers.Shift, Keys.J);
 
  in form closing :
   UnregisterHotKey(Handle, 100);
  
 
  protected override void WndProc( ref Message m )
  { 
   const int WM_HOTKEY = 0x0312;  
   
   switch(m.Msg) 
   { 
    case WM_HOTKEY:  
     MessageBox.Show("Hotkey pressed");  
     break; 
   }  
   base.WndProc(ref m );
  }
 
  ------- using HOTKEYs in a C# application ------- */
 
  [DllImport("user32.dll", SetLastError=true)]
  public static extern bool RegisterHotKey( IntPtr hWnd, // handle to window   
   int id,            // hot key identifier   
   KeyModifiers fsModifiers,  // key-modifier options   
   Keys vk            // virtual-key code   
   );
  
  [DllImport("user32.dll", SetLastError=true)]
  public static extern bool UnregisterHotKey( IntPtr hWnd,  // handle to window   
   int id      // hot key identifier   
   );
 
  [Flags()]
   public enum KeyModifiers
  { 
   None = 0,
   Alt = 1,   
   Control = 2,   
   Shift = 4,   
   Windows = 8
  }
 

 }
}
________________________________________
窗体代码:
  protected const String m_sFilename = "config.xml";
  protected Keys m_hotkey;
  protected bool m_ctrlhotkey, m_shifthotkey, m_althotkey, m_winhotkey;
 
  //监视热键
  protected override void WndProc( ref Message m )
  {
   const int WM_HOTKEY = 0x0312; 
           
   switch(m.Msg)
   {
    case WM_HOTKEY: 
     MessageBox.Show("您点了热键!");
     break;
 
   } 
   base.WndProc(ref m );
  }
  //注册热键
  public void SetHotKey(Keys c, bool bCtrl, bool bShift, bool bAlt, bool bWindows)
  {
   //先赋到变量
   m_hotkey = c;
   m_ctrlhotkey = bCtrl;
   m_shifthotkey = bShift;
   m_althotkey = bAlt;
   m_winhotkey = bWindows;
 
   //注册系统热键
   NativeWIN32.KeyModifiers modifiers = NativeWIN32.KeyModifiers.None;
   if (m_ctrlhotkey)
    modifiers |= NativeWIN32.KeyModifiers.Control;
   if (m_shifthotkey)
    modifiers |= NativeWIN32.KeyModifiers.Shift;
   if (m_althotkey)
    modifiers |= NativeWIN32.KeyModifiers.Alt;
   if (m_winhotkey)
    modifiers |= NativeWIN32.KeyModifiers.Windows;   
   NativeWIN32.RegisterHotKey(Handle, 100, modifiers, c);
  }
 

  private void Form1_Load(object sender, System.EventArgs e)
  {
   //设置初始热键// default hotkey is Ctrl+Shift+J
//   m_hotkey = Keys.Home;
//   m_hotkey = Keys.J;
//   m_ctrlhotkey = true;
//   m_shifthotkey = true;
//   m_althotkey = false;
//   m_winhotkey = false;
//   SetHotKey(m_hotkey, m_ctrlhotkey, m_shifthotkey, m_althotkey, m_winhotkey);
 

   //读取配置热键
   LoadSetting();////读配置文件(读取热键到变量)
   ShowHotkey();//显示热键到文本框
 
  }
 
  //显示热键到文本框
  public void ShowHotkey()
  {
   String sHotKey = "";
   if (m_ctrlhotkey)
    sHotKey += "Ctrl";
 
   if (m_shifthotkey)
   {
    if (sHotKey.Length!=0)
     sHotKey += " + ";
    sHotKey += "Shift";
   }
   if (m_althotkey)
   {
    if (sHotKey.Length!=0)
     sHotKey += " + ";
    sHotKey += "Alt";
   }
   if (m_winhotkey)
   {
    if (sHotKey.Length!=0)
     sHotKey += " + ";
    sHotKey += "Win";
   }
   if (sHotKey.Length!=0)
    sHotKey += " + ";
   sHotKey += (char)(int)m_hotkey;
   this.textBox1.Text=sHotKey;
   this.textBox1.Select(0,0);
  }
    //读配置文件 方法2 (读取热键到变量)
  public void LoadSetting()
  {
   System.Xml.XmlTextReader reader = null;   
   if (!System.IO.File.Exists(m_sFilename)) return;
   try
   {             
    reader = new System.Xml.XmlTextReader(m_sFilename);
    reader.WhitespaceHandling = System.Xml.WhitespaceHandling.None;
 
    bool bEnablePageContent = false; //是否有page节点
    bool bEnableHotkeyContent = false; //是否有hotkey节点
    
    while (reader.Read())
    {
     switch (reader.NodeType)
     {
      case System.Xml.XmlNodeType.Element:// are we parsing a <page> element        
       bEnablePageContent = (reader.Name=="page");//是否有page节点
       bEnableHotkeyContent = (reader.Name=="hotkey");//是否有hotkey节点
       if (bEnableHotkeyContent)
       {
        if (reader["ctrl"]!=null)
         m_ctrlhotkey = (reader["ctrl"]=="true")?true:false;
        if (reader["shift"]!=null)
         m_shifthotkey = (reader["shift"]=="true")?true:false;
        if (reader["alt"]!=null)
         m_althotkey = (reader["alt"]=="true")?true:false;
        if (reader["windows"]!=null)
         m_winhotkey = (reader["windows"]=="true")?true:false;        
       }
       break;
      case System.Xml.XmlNodeType.Text:       
       if (bEnableHotkeyContent)
       {      
 
        m_hotkey = (Keys) System.Int32.Parse(reader.Value);
        SetHotKey(m_hotkey, m_ctrlhotkey, m_shifthotkey, m_althotkey, m_winhotkey); // register hotkey
       }
       bEnablePageContent = false;
       bEnableHotkeyContent = false;
       break;
      case System.Xml.XmlNodeType.Attribute:
       if (bEnableHotkeyContent)
       {
        if (reader.Name=="ctrl")
         m_ctrlhotkey = (reader.Value=="true")?true:false;
        if (reader.Name=="shift")
         m_shifthotkey = (reader.Value=="true")?true:false;
        if (reader.Name=="alt")
         m_althotkey = (reader.Value=="true")?true:false;
        if (reader.Name=="windows")
         m_winhotkey = (reader.Value=="true")?true:false;
       }
       break;
 
     }      
    } // end while     
   }
   catch( System.Xml.XmlException e)
   {
    e.ToString();
   }
   finally
   {
    if (reader!=null) reader.Close();
   }
  }
  
 
  // 存储热键到配置文件
  public void SaveSetting()
  {
   System.Xml.XmlTextWriter w = new System.Xml.XmlTextWriter(m_sFilename, new System.Text.UTF8Encoding());
   w.Formatting = System.Xml.Formatting.Indented;
   w.WriteStartDocument();
   w.WriteStartElement("setting");
 
 
   w.WriteStartElement("hotkey"); // <hotkey>
   w.WriteAttributeString("ctrl",m_ctrlhotkey?"true":"false");
   w.WriteAttributeString("shift",m_shifthotkey?"true":"false");
   w.WriteAttributeString("alt",m_althotkey?"true":"false");
   w.WriteAttributeString("windows",m_winhotkey?"true":"false");
   int n = (int) m_hotkey;
   w.WriteString( n.ToString() );
   w.WriteEndElement(); // </hotkey>
 
   w.WriteEndElement(); // </popupkiller>
   w.Close();
  }
 
  private void button1_Click(object sender, System.EventArgs e)
  {  
   SetHotKey(m_hotkey, m_ctrlhotkey, m_shifthotkey, m_althotkey, m_winhotkey);
   SaveSetting();
//   Close();
  }
 
  //设置热键
   private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
  {
//   SetHotKey(e.KeyCode,
//    (ModifierKeys&Keys.Control)>0?true:false,
//    (ModifierKeys&Keys.Shift)>0?true:false,
//    (ModifierKeys&Keys.Alt)>0?true:false,
//    ((ModifierKeys&Keys.LWin)>0||(ModifierKeys&Keys.RWin)>0)?true:false  );
 
   m_hotkey = e.KeyCode;
   m_ctrlhotkey = (ModifierKeys&Keys.Control)>0?true:false;
   m_shifthotkey = (ModifierKeys&Keys.Shift)>0?true:false;
   m_althotkey = (ModifierKeys&Keys.Alt)>0?true:false;
   m_winhotkey = ((ModifierKeys&Keys.LWin)>0||(ModifierKeys&Keys.RWin)>0)?true:false;
 
   ShowHotkey();//显示热键到文本框
  
  }
vb6使用RegisterHotKey注册全局后台热键响应demo 本demo演示了使用RegisterHotKey函数注册两个全局后台热键并完成事件响应的完整过程,不包含冗余代码,包含完整的WM_HOTKEY参数解析判断过程。工程并兼容了使用Win32Api.tlb的代码并附赠Win32Api.tlb类型库 本人编写的Win32Api.tlb类型库包含3700余条API函数声明及两万多API常用常量声明和结构体声明,极大的免除了繁琐的复制声明过程 立即下载

相关推荐

自定义任意全局热键

可以定义任意个全局热键. (有点小bug,不知道有没有人可以解决)

pyqt的全局键盘热键

**pyqt或qt默认不支持全局鼠标事件和全局键盘事件。以下将介绍全局键盘热键的写法:**全局键盘事件需要调用win32 api的功能。首先说明python自带的pywin32并不完整,所以我们要直接调用系统win32dll。但是我还是要说一下pywin32的安装。1.网上的教程一般都用到了pyHook这个库。但是我用的python3,所以需要一些特别的步骤来弄出python3版的pyHook。ht

u012863565的博客 6867

全局范围内的系统热键

全局范围内的系统热键

【WIN32开发】获取键盘消息:注册全局热键

获取WM_KEYDOWN消息需要相应的获取焦点问题,只有正确的焦点位置才能操作,这个方法存在一定的体验问题,现在使用热键在任何情况下都可以获取你想要的键盘消息。缺点是别的程序将无法再获取到这个键盘消息,所以一般推荐使用组合键热键,单键热键不推荐 BOOL RegisterHotKey( HWND hWnd, //响应该热键的窗口句柄,如果为空,则注册到调用线程上 I...

金属服务,美好生活,天网改变世界,华帝量子科技。 2233

个人信息保护合规审计人员(中级)能力测试试卷

本文是关于个人信息保护合规审计的考试指南,包含选择题、判断题、简答题和案例分析题。选择题考察《个人信息保护法》的关键条款,如敏感信息处理、跨境传输、委托处理等合规要求。判断题测试对个人信息处理规则的理解,如撤回同意、公开信息处理等。简答题要求阐述审计流程、个人权利、委托处理义务等内容。案例分析题以互联网企业为例,分析违规行为并提出整改建议,涉及数据收集、第三方共享、自动化决策等问题。全文旨在帮助中级审计人员掌握个人信息保护的法律规定和审计实务,提升合规审计能力。

qq_41525079的博客 547

BCM-BCP-DRP-运维管理之故障管理——故障的分类与处理流程

ITSM Business Continuity Manage(BCM) BusinessContinuityPlan(BCP) 偏业务 DisasterRecoveryPlan(DRP) 偏IT 天塌了,考虑在天塌了的状态下做什么,怎么开展业务就是BCP; 天塌了,考虑怎么把天撑回去,就是DRP。 DRP+BCP+供应链管理+危机管理等就是BCM (业务连续性管...

mmgithub123的博客 2720

Win32汇编:常用系统API函数

熟练掌握Win32 API函数的参数传递,是软件逆向的基础,本章节内容将使用MASM汇编器,逐个编译这些源程序,你可以通过使用一些调试工具,这里推荐OllyDBG来附加编译后的可执行文件,进行逐个分析,观察二进制程序逆向后的一些变化,总结吸收经验,为以后的二进制逆向,漏洞挖掘打基础.

微软技术分享 1万+

别再调参了!用Simulink手把手教你搞定FOC电机速度环PI控制器(附模型下载)

本文详细介绍了如何使用Simulink搭建FOC电机速度环PI控制器,通过模最优准则和系统化调试方法,避免传统手动调参的繁琐过程。文章包含从传递函数推导到参数自动整定的完整流程,并提供了实战调试技巧与异常处理指南,帮助工程师快速实现电机控制系统的稳定运行。

weixin_42519985的博客 412

实现一个热键注册编辑的类

实现一个热键注册编辑的类CST(http://blog.youkuaiyun.com/mrtechno) 2005-8-19  1 文档目的... 12 热键编程基础... 12.1 API函数... 12.2 编程方法... 23 实现概述... 44 实现细节... 44.1 XML配置文档结构... 44.2 热键编辑控件 ThotKeyEdit 54.3 热键自定义窗体类TformHotKeyconf

MrTECHNO的编程日记 2129

物联网低功耗广域网NB-IoT开发(一):初识NB-IoT

(二)NB-IoT的关键特性: (三)NB-IoT的应用场景: 二、NB-IOT介绍

weixin_49763156的博客 853

WS2812呼吸灯效果实战:用STM32的PWM+DMA实现流畅渐变(附完整代码)

本文详细介绍了如何使用STM32的PWM+DMA技术实现WS2812呼吸灯效果,提供完整的代码示例和调试技巧。通过PWM波形编码和DMA传输机制,解决了传统IO模拟控制方式的高CPU占用问题,实现了流畅的LED渐变效果,适用于各种嵌入式开发场景。

weixin_30566063的博客 452

Sandboxie-Plus 中的 UGlobalHotkey 全局热键库:跨平台实现原理与 Qt 集成实战

UGlobalHotkey 是 Sandboxie-Plus 仓库内随附的一个 Qt 框架扩展库,用于在 Windows、Linux 与 macOS 上实现真正的**全局**快捷键(即使应用失去焦点、窗口最小化也能响应的系统级快捷键)。本文以 [SandboxiePlus/UGlobalHotkey/README.md](https://link.gitcode.com/i/82473ee297c

gitblog_00251的博客 723

QGis二次开发 —— 1、win10/win11搭建Vs2017-QGis3.40.12环境(附Vs2017环境效果,附全部问题解决方法)(附:Qt助手加入QGis接口说明文档)

QGis二次开发 —— 1、Windows10搭建Vs2017-QGis环境(附Vs2017环境效果)(附:Qt助手加入QGisA接口说明文档)

1362

Jarvis Sidecar 完整指南:Go 桌面应用如何获得控制浏览器、终端与文件的能力

Jarvis Sidecar 是运行在你电脑上的一个 Go 语言桌面程序,它通过 WebSocket 连接 Jarvis 的 AI 大脑,把本机终端、文件、剪贴板、截图、浏览器等能力开放给 AI 调用,是 AI 真正"动手操作"你电脑的那双手。这篇指南面向新手,带你快速理解 Sidecar 是什么、能做什么,以及如何完成安装、连接与日常使用。 ## Sidecar 是什么:AI 大脑与你的电脑之

gitblog_01086的博客 800

基于改进YOLOv5的小目标检测 | 添加CBAM注意机制 + 更换Neck网络之BiFPN + 增加高分辨率检测头

本文针对图像中小目标难以检测的问题,提出了一种基于YOLOv5的改进模型。在主干网络中,加入CBAM注意力模块增强网络特征提取能力;在颈部网络部分,使用BiFPN结构替换PANet结构,强化底层特征利用;在检测头部分,增加高分辨率检测头,改善对于微小目标的检测能力。本文算法在无人机数据集VisDrone2019数据集上进行了多次对比实验,结果表明本文算法可以有效地检测小目标。🌈

小哥谈 2934

Pytorch入门实战(2)-使用BP神经网络实现MNIST手写数字识别

上一篇:Pytorch入门实战(1) - 实现线性回归 涉及知识点 Pytorch nn.Module的基本使用 Pytorch nn.Linear的基本用法 PytorchVision Transforms的基本使用 Pytorch中DataLoader的基本用法 Pytorch详解NLLLoss和CrossEntropyLoss 如何确定神经网络的层数和隐藏层神经元数量 本文内容 本文将会使用BP神经网络(就是最普通的神经网络)实现一个MNIST手写数据集的实现。话不多说,直接开始。 首先先导入需要的包

iioSnail的博客 6616

AutoClicker:基于 C / WPF 的 Windows 鼠标自动点击器——功能、实现原理与构建使用指南

AutoClicker 内置三组全局热键(默认见 [Constants.cs](https://link.gitcode.com/i/d810bc3698ac053193e17aa22715d8e2)): | 功能 | 默认热键 | 虚拟键码 | 注册 ID | | --- | --- | --- | --- | | Start(开始) | F6 | `0x75` | 9000 | | Stop

gitblog_00443的博客 402

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

从预览页到本地PDF:tchMaterial-parser 电子课本下载完整走查

备课要把国家中小学智慧教育平台上的电子课本 PDF 存到本地,平台却只给在线预览、不给下载入口。tchMaterial-parser(MIT 许可,Windows、Linux、macOS 通用)做的就是这件事:解析预览页网址,把课本 PDF 自动存下来。 [![国家中小学智慧教育平台电子课本下载工具 tchMaterial-parser 界面](https://raw.gitcode.com/G

gitblog_01194的博客 359

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

PowerToys Screen Ruler 深度解析:从热键触发到 DirectX 像素级测量的完整实现

Screen Ruler(Screen Ruler)是 Microsoft PowerToys 中一个"小而精"的测量模块:按下热键后,它会以 DirectX 叠加层覆盖整个屏幕,让你测量像素距离、检测同色连续区域(边距/间距),并把结果直接写入剪贴板。本文以仓库中的开发文档 [Screen Ruler 模块文档](https://link.gitcode.com/i/2ac778bee8553e

gitblog_00587的博客 524

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

RGF_CJ 仓颉版 Win32 IME 重转换:tagRECONVERTSTRING 结构体深度解析与应用实践

`tagRECONVERTSTRING` 是 RGF_CJ(仓颉 Windows 通用渲染框架)子包 `rgf.win_imm` 中用于输入法编辑器(IME)"重转换(Reconversion)"能力的核心数据载体。它允许应用把文档中已上屏的文本重新交回 IME 进行二次编辑与转换(例如修正拼音断词、重新选词)。本文将以该结构体为骨架,结合仓库源码逐字段剖析其内存布局、指针类型别名、关联常量与配套

gitblog_00478的博客 442

OBS Studio 脚本系统实战指南:Python 与 Lua 脚本 API、生命周期函数与底层实现解析

OBS Studio 从 21.0 版本开始内置了完整的脚本子系统,支持 Python 3 和 Luajit 2(约等同于 Lua 5.2),允许用户在不编译任何原生插件模块的情况下扩展功能、添加特性或自动化操作。本文以仓库文档 [scripting.rst](https://link.gitcode.com/i/9667cc224c498e058bf50a663d842566) 为骨架,结合 [

gitblog_00274的博客 960

从MFC到Win32

一直纠结于究竟该用什么标题:总结其实说不上的,毕竟自己经验也不怎么丰富,充其量也就是一小结;换用感悟之类的也不大合适,这会让人以为我故作老成、经验丰富,诱骗大家,知根知底的朋友们当然很容易就揭穿我了。想来想去,虽然以后还有很长的路要走,但就暂且用“总结”来回顾一下自己做界面开发的一些经验和心得吧。 第一语言是C++,所以当初选择学习MFC似乎是理所当然的了。这是我最开始上网找资料以决定学

hushiwei1993的专栏 516
上一篇: 大量开发书,搬家要卖了!
下一篇: 在多线程里查询数据库并填充dataGrid(原创)
李天平
博客等级 码龄23年 1029粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值