系统启动时如何检测屏幕是否解锁?

问题描述 投票:0回答:1

我的程序需要在用户启动后显示一个弹出窗口。目前,我使用SwitchDesktop的成功/失败来确定状态,但在Windows 10上测试时,我发现如果尚未出现密码输入屏幕,SwitchDesktop仍然会成功。我应该如何改进?

    typedef HDESK(WINAPI *PFNOPENDESKTOP)(LPSTR, DWORD, BOOL, ACCESS_MASK);
    typedef BOOL(WINAPI *PFNCLOSEDESKTOP)(HDESK);
    typedef BOOL(WINAPI *PFNSWITCHDESKTOP)(HDESK); 
    bool IsScreenLocked()
    {
        BOOL bLocked = FALSE;
        static HMODULE hUser32 = LoadLibrary(_T("user32.dll"));

        if (hUser32) 
        { 
            static PFNOPENDESKTOP fnOpenDesktop = (PFNOPENDESKTOP)GetProcAddress(hUser32, "OpenDesktopA"); 
            static PFNCLOSEDESKTOP fnCloseDesktop = (PFNCLOSEDESKTOP)GetProcAddress(hUser32, "CloseDesktop"); 
            static PFNSWITCHDESKTOP fnSwitchDesktop = (PFNSWITCHDESKTOP)GetProcAddress(hUser32, "SwitchDesktop"); 

            if (fnOpenDesktop && fnCloseDesktop && fnSwitchDesktop) 
            { 
                HDESK hDesk = fnOpenDesktop("Default", 0, FALSE, DESKTOP_SWITCHDESKTOP); 

                if (hDesk) 
                {  
                    bLocked = !fnSwitchDesktop(hDesk); 
                    fnCloseDesktop(hDesk); 
                }  
            } 
        }
        return bLocked;
    }
windows windows-10 system
1个回答
0
投票

您可以使用WTSRegisterSessionNotification监控屏幕锁定/解锁状态。当屏幕锁定或解锁时,这将向您的应用程序发送 WM_WTSSESSION_CHANGE 窗口消息,因此如果您有一个长时间运行的应用程序,您可以跟踪此状态。

尽管根据应用程序的目的,使用绑定到用户登录事件的计划任务来启动应用程序可能更合适。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.