前言屏幕键盘,放大镜等这些辅助类程序在使用时并不会抢夺其他窗口的焦点,比如说屏幕键盘的窗口即使点击了也不会获取焦点,但依然能点击按键输入文字。在 Windows 中,可通过为窗口设置 WS_EX_NOACTIVATE 位来实现。代码首先通过 GetWindowLongW 获取窗口的样式,再通过 SetWindowLongW 为窗口添加上 WS_EX_NOACTIVATE 位。窗口句柄(hwnd)在 wxPython 中通过窗体的 GetHandle() 方法获取,PyQt 中则通过窗体的 winId() 方法获取。import ctypes WS_EX_NOACTIVATE = 0x08000000 GWL_EXSTYLE = -20 # wxPython # hwnd = self.GetHandle() # PyQT hwnd = self.winId() current_style = ctypes.windll.user32.GetWindowLongW(hwnd, GWL_EXSTYLE) ctypes.windll.user32.SetWindowLongW(hwn
前言假如有一个视频文件 video.mp4,需要在 Python 里面调用外部程序打开,你可能会直接使用 os.startfile() 方法,传入文件的路径,就能调用外部的播放器打开这个文件了,但是如果需要对播放器指定参数呢?这种方法就不适用了。Windows在 Windows 下,有一个 AssocQueryStringW 函数(参考文档),支持通过注册表查找关联的默认程序,这样就能直接获取到默认程序的路径,再加上自定义的参数就可以实现了,非常省事。代码import ctypes from ctypes import wintypes def query_association(file_ext): buffer = ctypes.create_unicode_buffer(512) pcchOut = wintypes.DWORD(512) result = ctypes.windll.shlwapi.AssocQueryStringW(0x00000000, 1, file_ext, None, buffer, ctypes.byref(pcc
在 Python 中打开文件夹并选中该文件(不直接打开),有两种实现方式:方式一使用 os 模块,最简单。无论是否存在已经选中该文件的资源管理器窗口,每次执行都会新建一个。例如,打开文件夹并选中 D:\ 下的 111.pdf 文件:import os os.system(r"explorer /select,D:\111.pdf")但是有一个问题,容易被杀毒软件拦截,用户体验不佳;如果文件名包含特殊符号,就无法识别,默认就打开我的文档目录了。"安全大脑" "极智守护"方式二使用 SHOpenFolderAndSelectItems 函数(参考文档),与方式一不同的是,若存在已打开此位置的资源管理器窗口,则会切换到该窗口,并选中文件,反之则新建一个资源管理器窗口并选中。这种方式有一个好处,就是不会被杀毒软件拦截。这里使用 ctypes 实现,不需要再安装 pywin32 了。import os import ctypes class ITEMIDLIST(ctypes.Structure): _fields_ = [("mkid", ct
前言上一篇文章分析了美的空调 R05D 红外协议原理,接下来将通过 STM32 单片机编程实现空调控制。代码初始化 PWM将红外发射管接在 PA1 引脚上,使用 TIM2 时钟控制 PWM 波形,输出 38kHz 载波。通过分频和自动重装载值设定,得出 PWM 波形频率为 72MHz / 19(预分频)/ 101(计数次数)≈ 38kHz。void PWM_Init(void) { // 38kHz 初始化 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPI
背景通常情况下红外遥控采用NEC协议传输数据,而美的空调采用 R05D 协议,因此一般的红外发射模块无法对空调进行控制。本文将对美的空调 R05D 协议展开分析,并通过 STM32 单片机进行红外遥控。R05D 红外协议原理1.编码格式编码格式为 L A A' B B' C C' S L A A' B B' C C'2.L S A B C 字母说明L 为引导码,S 为分隔码,A 为识别码 (一般为 10110010 = 0xB2,预留方案 10110111 = 0xB7),A' 为 A 的反码,B' 为 B 的反码,C' 为 C 的反码3.帧第一帧和第二帧相同,二者之间有一个分隔码 S4.长度A B C 长度均为 8 位,故一帧长度为 48 位(不包含 L S)5.发送顺序高位先发,即 MSB 在先,LSB 在后6.B、C 含义如下表所示:BB7 B6 B5B4 B3 B2 B1 B0风速1 1 1 1 1CC7 C6
Scott Sloan