Verificação de bloqueio de estação de trabalho / mudança desbloqueio com c #
-
03-07-2019 - |
Pergunta
Duplicar:? Como posso programaticamente determinar se a minha estação de trabalho está bloqueada
Como posso detectar (durante a execução) quando um usuário do Windows bloqueou sua tela (Windows + L) e abriu-o novamente. Eu sei que poderia globalmente controlar a entrada de teclado, mas é possível verificar tal coisa com variáveis ??de ambiente?
Solução
Você pode obter esta notificação através de uma mensagem WM_WTSSESSION_CHANGE. Você deve notificar o Windows que você deseja receber essas mensagens via WTSRegisterSessionNotification e cancelar o registro com WTSUnRegisterSessionNotification.
Essas mensagens devem ser útil para uma implementação C #.
http://pinvoke.net/default.aspx/wtsapi32.WTSRegisterSessionNotification
http://blogs.msdn.com/shawnfa /archive/2005/05/17/418891.aspx
http://bytes.com/groups/net -c / 276963-trapping quando-estação de trabalho bloqueada
Outras dicas
A SessionSwitch evento pode ser sua melhor aposta por esta. Verifique a SessionSwitchReason passou pelo SessionSwitchEventArgs para descobrir que tipo de interruptor que é e reagir adequadamente.
Você pode usar ComponentDispatcher
como uma forma alternativa para obter esses eventos.
Aqui está um exemplo de classe para embrulhar isso.
public class Win32Session
{
private const int NOTIFY_FOR_THIS_SESSION = 0;
private const int WM_WTSSESSION_CHANGE = 0x2b1;
private const int WTS_SESSION_LOCK = 0x7;
private const int WTS_SESSION_UNLOCK = 0x8;
public event EventHandler MachineLocked;
public event EventHandler MachineUnlocked;
public Win32Session()
{
ComponentDispatcher.ThreadFilterMessage += ComponentDispatcher_ThreadFilterMessage;
}
void ComponentDispatcher_ThreadFilterMessage(ref MSG msg, ref bool handled)
{
if (msg.message == WM_WTSSESSION_CHANGE)
{
int value = msg.wParam.ToInt32();
if (value == WTS_SESSION_LOCK)
{
OnMachineLocked(EventArgs.Empty);
}
else if (value == WTS_SESSION_UNLOCK)
{
OnMachineUnlocked(EventArgs.Empty);
}
}
}
protected virtual void OnMachineLocked(EventArgs e)
{
EventHandler temp = MachineLocked;
if (temp != null)
{
temp(this, e);
}
}
protected virtual void OnMachineUnlocked(EventArgs e)
{
EventHandler temp = MachineUnlocked;
if (temp != null)
{
temp(this, e);
}
}
}
Você absolutamente não precisa WM_WTSSESSION_CHANGE Basta usar WTTS internos apis.