锁定计算机和关闭显示器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了锁定计算机和关闭显示器相关的知识,希望对你有一定的参考价值。

简介

在计算机的日常使用中,有时候希望显示器关闭,需要主机继续运行,对于台式主机来说按下显示器电源按钮就可以了,笔记本除了更改电源模式后合上屏幕也没有其他办法了,经过研究其实可以通过给Windows发送关闭显示器的消息来实现这个功能,详情见代码。

源码

/*
 * 版权所有 (C) 2015 dccw (http://blog.51cto.com/13187574)
 *
 * 按照 Apache 许可 2.0 版本(称为“许可”)授予许可;
 * 要使用此文件,必须遵循“许可”中的说明。
 * 你可以从以下位置获取“许可”的副本
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * 除非适用法律要求或书面同意,根据
 * “许可”分配的软件“按原样”分配,
 * 不提供任何形式(无论是明示还是默示)的担保和条件。
 * 参见“许可”了解“许可”中管理权限和
 * 限制的指定语言。
 *
 * 本代码实现了关闭显示器和锁定计算的功能
 * 
 * 编译命令:cl.exe /D "NDEBUG" 关闭显示器.c /link kernel32.lib user32.lib
 * 使用方法:
 * 命令行执行: 关闭显示器.exe [-?hdl]
 * 快捷方式执行: 新建桌面快捷方式->输入对象位置->打开该快捷方式的属性页面
 * ->在目标的后面加上相应的参数->点击快捷键输入框,按下你想使用的快捷键
 * ->点击确定->焦点位于桌面时按下你设置的快捷键即可运行
 *
 * 恢复方法
 * 按下任意键/晃动鼠标/点击鼠标
 */

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

static int flag_show_usage = 0;
static int flag_lock_workstation = 0;
static int flag_shutdown_monitor = 0;

static void show_usage(char const *argv) {
    fprintf(stderr,"用法: %s [-?hdl]\n\n"
        "选项:\n"
        "   -?,-h       : 帮助\n"
        "   -d          : 关闭显示器\n"
        "   -l          : 锁定计算机\n",
        argv
        );
}

static int get_option(int argc, char *const *argv) {
    char     *p;
    int      i;

    for (i = 1; i < argc; i++) {
        p = argv[i];

        if (*p++ != ‘-‘) {
            fprintf(stderr,"无效的选项: \"%s\"", argv[i]);
            return -1;
        }

        while (*p) {
            switch (*p++) {
                case ‘?‘:
                case ‘h‘:
                    flag_show_usage = 1;
                    break;
                case ‘d‘:
                    flag_shutdown_monitor = 1;
                    break;
                case ‘l‘:
                    flag_lock_workstation = 1;
                    break;
                default:
                    fprintf(stderr,"无效的选项: \"%c\"", *(p - 1));
                    return -1;
            }
        }
    }
    return 0;
}

static void lock_workstation(void) {
    if( !LockWorkStation() ) {
        _tprintf(_T("锁定计算机失败 %d\n"), GetLastError());
    }
}

static void shutdown_monitor(void) {
    SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM)2);
}

int main(int argc, char **argv) {
    if (get_option(argc, argv) != 0) {
        return 1;
    }

    if (flag_show_usage) {
        show_usage(argv[0]);
    }

    if (flag_lock_workstation) {
        lock_workstation();
    }

    if (flag_shutdown_monitor) {
        shutdown_monitor();
    }

    return 0;
}

编译方法

cl.exe /D "NDEBUG" 关闭显示器.c /link kernel32.lib user32.lib

使用方法

  • 命令行执行: 关闭显示器.exe [-?hdl]
  • 快捷方式执行: 新建桌面快捷方式->输入对象位置->打开该快捷方式的属性页面->在目标的后面加上相应的参数->点击快捷键输入框,按下你想使用的快捷键->点击确定->焦点位于桌面时按下你设置的快捷键即可运行

恢复方法

  • 按下任意键
  • 晃动/点击鼠标

以上是关于锁定计算机和关闭显示器的主要内容,如果未能解决你的问题,请参考以下文章

一个具有两种显示类型的片段[关闭]

键盘和鼠标闲置超时时关闭显示器并锁定电脑桌面的AutoHotkey脚本 2019年11月24日写

如何在不锁定活动方向的情况下锁定片段方向?

电脑上面现实OSD已锁是啥意思,显示器为啥会自动关闭

iOS:以编程方式关闭锁定屏幕上显示的通知?

我该如何做模态对话框片段(代码在我关闭之前不会执行)