更喜欢使用WPF的C#,.Net 3.5中的答案(Windows Forms也没关系)
我有一个基本上是工具栏窗口或托盘图标的应用程序.它需要检测用户是否锁定他/她的工作站并走开以便在集中式系统中更新该人的状态.
我可以使用SystemEvents轻松地检测会话切换或注销,但我不能在我的生活中弄清楚如何在Lock上检测或接收事件.
谢谢你的帮助.
如何检测用户何时在Windows 7中锁定/解锁屏幕?
我发现这个问题有一个C#的答案,但我想在Delphi 2009中使用它.我猜有一些Windows消息(像这些)可以完成这项工作.这是我试过的代码,但它不起作用:
const
NOTIFY_FOR_ALL_SESSIONS = 1;
{$EXTERNALSYM NOTIFY_FOR_ALL_SESSIONS}
NOTIFY_FOR_THIS_SESSION = 0;
{$EXTERNALSYM NOTIFY_FOR_THIS_SESSION}
type
TfrmAlisson = class(TForm)
lbl2: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
public
FLockedCount: Integer;
procedure WndProc(var Message: TMessage); override;
function WTSRegisterSessionNotification(hWnd: HWND; dwFlags: DWORD): bool; stdcall;
function WTSUnRegisterSessionNotification(hWND: HWND): bool; stdcall;
end;
implementation
uses
// my impl uses here
procedure TfrmAlisson.FormCreate(Sender: TObject);
begin
if (WTSRegisterSessionNotification(Handle, NOTIFY_FOR_THIS_SESSION)) then
ShowMessage('Nice')
else
begin
lastError := GetLastError;
ShowMessage(SysErrorMessage(lastError));
end;
end;
procedure TfrmAlisson.FormDestroy(Sender: TObject);
begin …Run Code Online (Sandbox Code Playgroud) DUPLICATE: 如何以编程方式确定我的工作站是否已锁定?
如何检测(在运行时)Windows用户锁定其屏幕(Windows + L)并再次解锁时.我知道我可以全局跟踪键盘输入,但是可以用环境变量来检查这样的事情吗?
我正在编写一个应用程序,有时会以烤面包机消息的形式向用户发送通知.
如果用户不在,他看不到通知.所以我想做的是能够检查用户是否已锁定屏幕或是否正在激活屏幕保护程序.
当用户重新登录并恢复其会话时,在用户看不到它时触发的任何通知都将被延迟并显示.
我自己在Windows 7上,但我更喜欢一种适用于Windows XP及以上版本的解决方案.
我在 Windows 10 Pro x64 ver 1703 build 15063.726 上,尝试编写程序重启服务。它以管理员权限在我的用户下运行,通过计划任务每 10 分钟运行一次。
如果服务器不可用或中断:
唯一的复杂问题是检测计算机是否被锁定。我尝试了几种方法:
仅当用户在计算机被锁定后开始输入密码时才返回 NULL。除此之外,返回一个有效的句柄。据推测,在用户尝试登录并切换输入之前,不会取消选择输入桌面。
(当然传入 GetCurrentThreadID() )
句柄仍然匹配,可能是由于相同的原因 1 失败。
似乎也与用户输入密码有关……或者因为我的服务器重启应用程序是 32 位的,在读取 64 位进程 LockApp.exe 时遇到问题。
虽然提到可疑,但我也试过这个。假阴性,说它没有被锁定
用这里的代码示例描述,这个也是半身像并给出了错误的否定。
有没有剩下的办法?我真的宁愿没有仅用于注册锁定/解锁不断运行的服务。
或者这些方法中的一种应该已经起作用了,而我的 Windows 被窃听了?
干杯
我想跟踪Windows应用程序中的Windows解锁事件.怎么做?用于此的事件是什么?我需要导入任何命名空间吗?
当用户解锁窗口时,应用程序需要执行一些任务.
可能重复:
如何以编程方式确定我的工作站是否已锁定?
确定桌面是否为当前登录用户锁定的最佳方法是什么?我查看了MSDN,找不到任何API调用来检测它.我错过了什么,或者我可以使用没有简单的电话?
我有一个C#应用程序在后台运行.现在我想在系统锁定时停止此应用程序.我怎样才能做到这一点.对此有任何帮助,我们非常感谢.
感谢Hougen的解决方案.你可以建议我,我们应该包括任何Dll来处理"Microsoft.Win32.SystemEvents.SessionSwitch"这个事件吗?以及此代码应驻留在哪一层.我猜它在商业层.有什么想法退守这个?