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 分钟前
VSCode环境下连接 MySQL 8.0 数据库 (C++)
数据库·windows·vscode
DogDaoDao6 小时前
Windows 环境下 vscode 配置 C/C++ 环境
c语言·c++·windows·vscode·gcc·mingw-w64
wacpguo6 小时前
windows环境下载ubuntu22.04发行版源码,提示invalid path aux.c
windows
清水白石0086 小时前
如何在windows中使用mac,要详细的教程
windows·macos
内蒙深海大鲨鱼7 小时前
win/mac常用命令
windows·macos
bmseven7 小时前
windows远程桌面连接ubuntu
linux·windows·ubuntu
newxtc7 小时前
【爱给网-注册安全分析报告-无验证方式导致安全隐患】
前端·chrome·windows·安全·媒体
yzkkdhh8 小时前
【Windows 同时安装 MySQL5 和 MySQL8 - 详细图文教程】
windows·mysql·idea
白帽黑客cst14 小时前
网络安全(黑客技术) 最新三个月学习计划
网络·数据结构·windows·学习·安全·web安全·网络安全
YRr YRr15 小时前
在Windows上安装WSL2和Ubuntu 20.04以搭建C++开发环境的详细指南
c++·windows·ubuntu·wsl2