如何实现完美息屏呢?虽然可以用ahk实现息屏,但桌子一晃动,鼠标稍微偏移一下,又亮了,导致息屏无效!
win10 更新了设备管理器,现在可以禁用鼠标设备了。以前这里是灰色的。
c++ 禁用鼠标
那么,怎么编程调用它呢?
两个办法,一个ahk模拟用户操作,这个是不得以而为之、没有办法的办法。
另一个是c++编程。首先谷歌关键词“c++ disable windows device”,发现问答社区的交流比较老旧,而且没有确切的信息。但是第二个就是一个完善的gist分享,代码直接就能用:
Disable or Enable Device with Hardware ID
原代码如下:
/* 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:
……
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
使小键盘*按键变成 完美息屏按钮!
$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
用于 关闭鼠标驱动并监听任意键
#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
%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