显示器定时开启和关闭小工具

28 篇文章 0 订阅
21 篇文章 0 订阅

        前几天,按照学院要求,学校几个LED屏幕要连续几天播放指定内容PPT,当时没有用LED自带的管理软件(因为那个软件操作起来太麻烦了),没有设置定时开启关闭显示器按钮。半夜屏幕还是开启的,结果晚上1点多领导直接拍照发信息过来,表示要加强管理。

         后面想处理这个事情的第一想法就是网上找相关的程序工具,可以设置时间段,定时开启和关闭。安排部门维护的同事找了一下,竟然没有合适的工具,于是自己动手,丰衣足食。下面贴出核心代码,上传直接可以运行使用的exe程序。如果也有相同需求的也可以直接下载使用。

一、显示器的开启和关闭代码:

::PostMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM)-1);//开启显示器

::PostMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM)2);//关闭显示器

二、模拟鼠标移动操作

测试发现关闭显示器再开启后,如果没有操作鼠标,虽然显示器开启了,但是显示无信号输入又关闭了,后面加入了模拟鼠标移动的操作(原位移动),才能解决问题:

        POINT lpPoint;
        GetCursorPos(&lpPoint);
        int mx = lpPoint.x * 65535 / GetSystemMetrics(SM_CXSCREEN);     
        int my = lpPoint.y * 65535 / GetSystemMetrics(SM_CYSCREEN);     
        mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, mx, my, 0, 0);    //其实鼠标还是在原来的位置,只是这个操作模拟了鼠标移动操作,告诉系统给信号到显示,从而达到点亮目的。

三、ini文件的读写

ini文件用来保存用户设定的时间,主要涉及的两个函数:

::WritePrivateProfileStringW(_T("Setttings"), _T("TimeFrom"), strTimeFrom, iniPathFIle);//写配置文件

::GetPrivateProfileStringW(_T("Setttings"), _T("TimeFrom"), _T("1971-1-1 22:00:00"), strTime.GetBuffer(MAX_PATH), MAX_PATH, iniPathFIle);//读配置文件

四、托盘实现

对话框头文件加入:

NOTIFYICONDATA m_nid;

对话框初始化函数加入:

//---------------------------托盘显示---------------------------------//
    m_nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
    m_nid.hWnd = this->m_hWnd;
    m_nid.uID = IDR_MAINFRAME;
    m_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
    m_nid.uCallbackMessage = WM_SHOWTASK;             // 自定义的消息名称
    m_nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
    wcscpy_s(m_nid.szTip, _T("显示器定时开关程序"));                // 信息提示条为"服务器程序"
    Shell_NotifyIcon(NIM_ADD, &m_nid);                // 在托盘区添加图标

对话框cpp加入函数(头文件声明):

LRESULT CMonitorSetDlg::OnShowTask(WPARAM wParam, LPARAM lParam)
{
    if (wParam != IDR_MAINFRAME)
        return 1;

    switch (lParam)
    {
    case WM_RBUTTONUP:                                        // 右键起来时弹出菜单
    {
        LPPOINT lpoint = new tagPOINT;
        ::GetCursorPos(lpoint);                    // 得到鼠标位置
        CMenu menu;
        menu.CreatePopupMenu();                    // 声明一个弹出式菜单
        menu.AppendMenu(MF_STRING, ID_APP_EXIT, _T("退出"));
        menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x, lpoint->y, this);
        HMENU hmenu = menu.Detach();
        menu.DestroyMenu();
        delete lpoint;
    }
    break;
    case WM_LBUTTONDBLCLK:                                 // 双击左键的处理
    {
        this->ShowWindow(SW_SHOWNORMAL);         // 显示主窗口
    }
    break;
    }
    return 0;
}

对话框消息处理加入:

ON_MESSAGE(WM_SHOWTASK, OnShowTask)

OnDestroy函数中加入:

Shell_NotifyIcon(NIM_DELETE, &m_nid);

五、程序只允许单实例

App头文件加入变量:

HANDLE m_hMutex;

App的构造函数初始化变量:

m_hMutex = NULL;

App的cpp文件的InitInstance函数加入:

m_hMutex = CreateMutex(NULL, FALSE, _T("显示器定时开关程序"));
    // 检查错误代码

    // 如果程序已经存在并且正在运行
    if (GetLastError() == ERROR_ALREADY_EXISTS)

    {
        // 如果已有互斥量存在则释放句柄并复位互斥量
        CloseHandle(m_hMutex);
        m_hMutex = NULL;

        AfxMessageBox("程序已经运行了");
        // 程序退出
        return FALSE;
    }

程序没有加入开机启动项,使用时将exe程序创建一个快捷方式,将它拷贝到启动项里面。运行程序,设置好时间,如:22:00-08:00。以后哪怕忘记关机屏幕也会晚上22点自动关闭,第二天早上8点自动开启。外界体验良好,也可以省电和人力。

附上代码:

https://download.csdn.net/download/abcpanpeng/11238637

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值