我的程序需要在用户启动后显示一个弹出窗口。目前,我使用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;
}
您可以使用WTSRegisterSessionNotification监控屏幕锁定/解锁状态。当屏幕锁定或解锁时,这将向您的应用程序发送 WM_WTSSESSION_CHANGE 窗口消息,因此如果您有一个长时间运行的应用程序,您可以跟踪此状态。
尽管根据应用程序的目的,使用绑定到用户登录事件的计划任务来启动应用程序可能更合适。