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文库

相关推荐
天幕繁星4 小时前
docker desktop es windows解决vm.max_map_count [65530] is too low 问题
windows·elasticsearch·docker·docker desktop
百锦再6 小时前
详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送
windows·c#·计算机外设
IT-民工211107 小时前
Ansible剧本检测Windows防火墙状态
linux·运维·windows·自动化·ansible
菜鸟江多多10 小时前
【windows 下使用 tree】
windows
星晨羽10 小时前
esayExcel根据模板导出包含图片
java·开发语言·windows
开发者每周简报12 小时前
当微软windows的记事本被AI加持
人工智能·windows·microsoft
命里有定数12 小时前
windows工具 -- 使用rustdesk和云服务器自建远程桌面服务, 手机, PC, Mac, Linux远程桌面 (简洁明了)
linux·运维·服务器·windows·ubuntu·远程工作
染指111016 小时前
45.第二阶段x86游戏实战2-hook监控实时抓取游戏lua
汇编·c++·windows·反游戏外挂·游戏逆向
我是苏苏1 天前
Web开发:ABP框架6——appsetting.json的读取以及实例的注入
前端·windows·json
TPCloud1 天前
windows 11编译安装ffmpeg(包含ffplay)
windows·ffmpeg·源码安装·mysys