AHK 配 C++:禁用鼠标设备实现完美息屏(不是休眠)

如何实现完美息屏呢?虽然可以用ahk实现息屏,但桌子一晃动,鼠标稍微偏移一下,又亮了,导致息屏无效!

win10 更新了设备管理器,现在可以禁用鼠标设备了。以前这里是灰色的。

c++ 禁用鼠标

那么,怎么编程调用它呢?

两个办法,一个ahk模拟用户操作,这个是不得以而为之、没有办法的办法。

另一个是c++编程。首先谷歌关键词"c++ disable windows device",发现问答社区的交流比较老旧,而且没有确切的信息。但是第二个就是一个完善的gist分享,代码直接就能用:

Disable or Enable Device with Hardware ID

原代码如下:

c++ 复制代码
/* for Devpkey */
#define INITGUID

/* dependencies */
#pragma comment (lib, "SetupAPI")
#include <windows.h>
#include <SetupAPI.h>
#include <Devpkey.h>

VOID SetDeviceState(LPCWSTR lpszHardwareId, DWORD dwState)
{
	HDEVINFO devInfo;

	if (devInfo = SetupDiGetClassDevsW(NULL, NULL, NULL, DIGCF_ALLCLASSES))
	{
		DWORD dwBuffersize;
		SP_DEVINFO_DATA devData;
		DEVPROPTYPE devProptype;
		LPWSTR devBuffer;

		devData.cbSize = sizeof(SP_DEVINFO_DATA);
		for (int i = 0; ; i++)
		{
			SetupDiEnumDeviceInfo(devInfo, i, &devData);
			if (GetLastError() == ERROR_NO_MORE_ITEMS) break;

			/* calculate buffer size */
			SetupDiGetDevicePropertyW(devInfo, &devData, &DEVPKEY_Device_HardwareIds, &devProptype, NULL, 0, &dwBuffersize, 0);

			/* real call */
			if (devBuffer = HeapAlloc(GetProcessHeap(), 0, dwBuffersize))
			{
				SetupDiGetDevicePropertyW(devInfo, &devData, &DEVPKEY_Device_HardwareIds, &devProptype, (PBYTE)devBuffer, dwBuffersize, NULL, 0);
				if (lstrcmpW(devBuffer, lpszHardwareId) == 0)
				{
					/* matched */
					SP_CLASSINSTALL_HEADER ciHeader;
					ciHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
					ciHeader.InstallFunction = DIF_PROPERTYCHANGE;

					SP_PROPCHANGE_PARAMS pcParams;
					pcParams.ClassInstallHeader = ciHeader;
					pcParams.StateChange = dwState;
					pcParams.Scope = DICS_FLAG_GLOBAL;
					pcParams.HwProfile = 0;

					SetupDiSetClassInstallParamsW(devInfo, &devData, (PSP_CLASSINSTALL_HEADER)&pcParams, sizeof(SP_PROPCHANGE_PARAMS));
					SetupDiChangeState(devInfo, &devData);
				}
				HeapFree (GetProcessHeap(), 0, devBuffer);
			}
		}
		SetupDiDestroyDeviceInfoList(devInfo);
	}
}

void main()
{
	SetDeviceState(L"SCSI\\CdRomTSSTcorpDVD+-RW_SH-216CBD100", DICS_DISABLE);
	/* SetDeviceState(L"SCSI\\CdRomTSSTcorpDVD+-RW_SH-216CBD100", DICS_ENABLE); */
}

如何运行:安装、打开 visual studio(以管理员方式运行),新建console项目,粘贴代码,即可运行。

接着,须要找到鼠标的devide id。这个可以在上图,属性对话框中,事件标签页内,查看相关信息。

HID\VID*** 后面的一长串就是 硬件设备的device id。

然而,直接一模一样填写是不生效的。

再看代码,发现程序获取了所有的device info,然后对比填写的值,判断是否与device info的id一致。

那么我们只需打印所有的 device id,找出最近似的就是了。

用 OutputDebugString 打印出所有 device id:

c++ 复制代码
				......
				SetupDiGetDevicePropertyW(devInfo, &devData, &DEVPKEY_Device_HardwareIds, &devProptype, (PBYTE)devBuffer, dwBuffersize, NULL, 0);
				OutputDebugString(devBuffer);
				OutputDebugString(L"\n");

可见,最后c++代码中用到的,鼠标的device id,是以USB\开头,加VID_123(数字与属性对话框中的一致),再加PID_456、REV_789,最后以MI_00收尾。运行这段代码后吗,鼠标立即失去响应。

最后再完善一下,利用命令行参数传参。

编译出一个exe,可禁用或启用设备:【免费】win10c++关闭/启动设备驱动资源-CSDN文库


AHK 实现完美息屏

移动鼠标不亮,点击键盘任意键才亮,才是完美息屏!

全能Autohotkey.ahk

使小键盘*按键变成 完美息屏按钮!

ahk 复制代码
$NumpadMult::

		SendMessage,0x112,0xF170,2,,ahk_id 0xFFFF  ; ok 如果这一行不行就要运行下面几行
		WinGet, id, List,,, Program Manager
		this_id := id1
		SendMessage, 0x112, 0xF170, 2,, ahk_id %this_id%
		Run, D:\Code\FigureOut\chrome\extesions\AutoHotKey\AnyKeyTurnOnMouseSt.bat ; 关闭鼠标驱动!
return

AnyKeyTurnOnMouse.ahk

用于 关闭鼠标驱动并监听任意键

ahk 复制代码
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
#SingleInstance Force

		
setup()
; MsgBox, 4, , Continue?
; 关闭鼠标
setup() {
	Run, C:\Users\TEST\source\repos\DeviceSuppressor\Debug\DeviceSuppressor.exe  disable="USB\VID_12C9&PID_1028&REV_0210&MI_00"
	Input, Key, L1
	reset()
	ExitApp
}
F10::
setup()
return

reset(){
	Run, C:\Users\TEST\source\repos\DeviceSuppressor\Debug\DeviceSuppressor.exe enable="USB\VID_12C9&PID_1028&REV_0210&MI_00"
}

F11::
*::
	reset()
	ExitApp
return

AnyKeyTurnOnMouseSt.bat

用于以管理员方式启动 AnyKeyTurnOnMouse.ahk

css 复制代码
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit

start D:\Code\FigureOut\chrome\extesions\AutoHotKey\AnyKeyTurnOnMouse.ahk

其中 DeviceSuppressor.exe 下载地址:

【免费】win10c++关闭/启动设备驱动资源-CSDN文库

相关推荐
爱宇阳27 分钟前
WSL2 隔离 Windows PATH 实战指南
windows·环境变量
ALex_zry34 分钟前
C++模板元编程实战技巧
网络·c++·windows
I疯子1 小时前
2026-04-08 打卡第 5 天
开发语言·windows·python
一个人旅程~1 小时前
旧笔记本电脑安装win10精简版LTSB&win10LTSC&linuxmint作为三系统的操作指导书(以DELL n4020为例)
linux·windows·经验分享·电脑
开开心心就好2 小时前
支持自定义名单的实用随机抽签工具
windows·计算机视觉·计算机外设·excel·散列表·启发式算法·csdn开发云
dyj0953 小时前
OpenClaw小龙虾本地部署【Windows系统 + 接入飞书】
windows·飞书
CresCent_Charles3 小时前
(已解决)踩坑记录:Windows 11安装pointops编译时报错
windows
skywalk81633 小时前
Windows下安装编译安装Whisper-CPP:一个语音实现框架集和高性能推理模型
人工智能·windows·whisper
charlie1145141913 小时前
通用GUI编程技术——图形渲染实战(二十五)——Alpha混合与透明效果:分层窗口实战
c++·windows·学习·图形渲染·win32
charlie1145141913 小时前
通用GUI编程技术——图形渲染实战(二十四)——GDI Region与裁切:不规则窗口与可视化控制
c++·windows·学习·c·图形渲染·win32