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


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

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

    c++ 禁用鼠标

    image (22).png

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

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

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

    Disable or Enable Device with Hardware ID

    原代码如下:

    /* for Devpkey */
    #define INITGUID
    
    /* dependencies */
    #pragma comment (lib, "SetupAPI")
    #include 
    #include 
    #include 
    
    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); */
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    如何运行:安装、打开 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");
    
    • 1
    • 2
    • 3
    • 4
    • 5

    请添加图片描述

    可见,最后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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    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
    
    • 1
    • 2
    • 3

    其中 DeviceSuppressor.exe 下载地址:

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

  • 相关阅读:
    SSM整合_年轻人的第一个增删改查_查找
    MySQL的安装和删除
    数电学习(十、脉冲波形的产生和整形)(三)
    ChatGPT AIGC 制作大屏可视化分析案例
    探索数字时代的核心:服务器如何塑造未来并助你成就大业
    python绘制ROC曲线
    Redis通过防火墙配置开放局域网连接,禁用外网连接
    2023年【氧化工艺】考试内容及氧化工艺操作证考试
    idea 相关配置
    ES6基本语法(一)
  • 原文地址:https://blog.csdn.net/sinat_27171121/article/details/133239159