首页 > 系统相关 >WPF 检测Windows用户会话状态:登录界面、非登录界面

WPF 检测Windows用户会话状态:登录界面、非登录界面

时间:2024-07-29 17:20:14浏览次数:13  
标签:界面 登录 Windows hWnd CharSet int windows StringBuilder var

1 主动获取Windows用户会话状态:登录界面、非登录界面,没有直接的Api接口,通过获取当前的前台窗台判断,

条件: 获取不到、UWP界面且窗体名字:windows 窗体类名windows.ui.core.corewindow。

 经过压测可靠

using System;
using System.Runtime.InteropServices;
using System.Text;

 /// <summary>
 /// 用户会话状态
 /// </summary>
 public class UserSessionState
 {
     [DllImport("user32.dll")]
     private static extern IntPtr GetForegroundWindow();
     [DllImport("user32.dll", CharSet = CharSet.Auto)]
     private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
     [DllImport("user32.dll", CharSet = CharSet.Auto)]
     private static extern int GetWindowTextLength(IntPtr hWnd);
     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
     private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);

     /// <summary>
     /// 锁屏状态
     /// </summary>
     public static bool IsSessionLock()
     {
         var hWnd = GetForegroundWindow();
         if (hWnd == IntPtr.Zero)
         {
             return true;
         }

         int length = GetWindowTextLength(hWnd);
         StringBuilder sb = new StringBuilder(length + 1);
         GetWindowText(hWnd, sb, sb.Capacity);

         var s = sb.ToString();
         Log.Info($"[用户状态] 窗体名称 : {s}");
         if (string.IsNullOrWhiteSpace(s)) return false;

         StringBuilder className = new StringBuilder(256); // 256为缓冲区大小,可以根据需要调整
         int nRet = GetClassName(hWnd, className, className.Capacity);
         if (nRet != 0)
         {
             Log.Info($"[用户状态] 窗体类名 : {className}");
             var cN = className.ToString();
             if (string.IsNullOrWhiteSpace(cN))
             {
                 return false;
             }
             var uwp = cN.ToLower().Trim().StartsWith("windows.ui.core.corewindow");
             var windows = s.ToLower().Trim().StartsWith("windows");
             var screenSaver = uwp && windows;
             return screenSaver;
         }
         return false;
     }
 }

2  被动监听,这个有自带的事件

  SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
 private void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
 {
     try
     {
         switch (e.Reason)
         {
             case SessionSwitchReason.SessionLock:
                 DeviceStatusInfo.SessionLogon = true;
                 break;
             case SessionSwitchReason.SessionUnlock:
             default:
                 DeviceStatusInfo.SessionLogon = false;
                 break;
         }
         Log.Info($"进入登录界面状态:{DeviceStatusInfo.SessionLogon}");
         DeviceStatusInfo.SessionSwitchReasonEvent?.Invoke(sender, e);
     }
     catch (Exception ex)
     {
        Log.Error(ex);
     }
 }

  

标签:界面,登录,Windows,hWnd,CharSet,int,windows,StringBuilder,var
From: https://www.cnblogs.com/terryK/p/18330545

相关文章

  • change CR+LF(Windows) to LF(UNIX)
    可以使用VIM命令行,快速实现 例如:filetest.txttest.txt:ASCIItext,withCRLFlineterminators执行命令vim-c":w++ff=unix"-c"q"test.txtfiletest.txttest.txt:ASCIItext 来源:https://stackoverflow.com/questions/13522599/how-to-run-vim-c......
  • .net访问远程共享的Windows文件
    可以使用cmd连接创建Windows凭据publicstaticboolConnectPwd(stringIpAddress,stringuserName,stringpassword){ boolFlag=faslse; Processproc=newProcess(); try { proc.StartInfo.FileName="cmd.exe"; proc.StartInfo.UseShellExecute=false;......
  • Pentester Academy -Windows API Exploitation Recipes: Processes, Tokens and Memor
    早年为PentesterAcademy(https://www.pentesteracademy.com/),如今为INE(https://ine.com/)002安装VS社区版https://visualstudio.microsoft.com/zh-hans/003processlistingapi正在运行的是什么:服务,AV,HIDS/IPS等其他attack开始的点:进程注入,内存dump/修改,TokenSt......
  • 如何在django项目中设置login_required,我没有使用django inbuild身份验证登录?
    用户无法通过输入任何页面的url进入任何页面我是否需要更改设置中的任何内容.py我没有使用django内置身份验证进行登录。view.py用于登录每个仪表板,defasset_login(request):ifrequest.method=='POST':username=request.POST.get('user_id')passw......
  • windows编译ZLMediaKit流媒体服务webrtc
    环境说明ZLMediaKit编译需要的软件visualstudio 2022cmake 3.29.0-rc2OpenSSL 1.1.1w(不想踩坑的话安装这个版本)libsrtp 2.6.0ZLMediaKit编译后运行需要libsrtp 编译后且配置环境变量ZLMediaKit 编译后文件cmakevisualstuido20222,自带cmakecmake可以到这两个地方......
  • 从流读取时,PyAudio Stream 导致 Windows 堆损坏(-1073740940 (0xC0000374))
    我在尝试读取PyAudio的Stream时遇到了问题。它因退出代码而崩溃-1073740940这是一个Windows堆损坏错误0xC0000374它发生在我从PyAudio流读取的行中,如下所示:stream.read(chunk_size)我也看到它崩溃了-1073741819ACCESS_VIOLATION_......
  • Windows下捕获6GHz报文/无线抓包(WiFi6E网卡mt7921au)
    目录16GHz概述1.16GHz与WiFi6E1.26GHz国际使用情况1.36GHz中国使用情况1.46GHz信道一览表26GHz抓包操作2.1抓包网卡推荐2.2抓包软件使用2.2.1VMware虚拟机安装2.2.2WinSniffer程序使用2.2.3WireShark远程抓包2.3扫描软件推荐2.3.1Windows2.3.2WiFi......
  • 【全过程】windows GPU训练大模型的前期准备教程
    CUDA下载及安装下载显卡驱动点这里进入之后点画圈的地方,然后打开下载的文件,会帮你自动下载和安装适配你显卡的驱动程序(这里不是特别重要,就简单带过)点击桌面左下角小箭头,出现花圈的标志,也就是英伟达的logo,说明驱动安装成功安装CUDA接下来到了重头戏,cuda的安装查看本机......
  • 界面自动化测试录制工具,让python selenium自动化测试脚本开发更加方便
    自动化测试中,QTP和seleniumIDE都支持浏览器录制与回放功能,简单的来说就像一个记录操作步骤的机器人,可以按照记录的步骤重新执行一遍,这就是脚本录制。个人觉得传统录制工具有些弊端,加上要定制支持我自己的自动化框架(python单机版自动化测试框架源代码),所以自己用javascript写了一个......
  • Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发
    前言  OpenCASCADE是由OpenCascadeSAS公司开发和支持的开源软件开发平台,旨在为特定领域快速开发程序而设计。它是一个面向对象的C++类库,提供了丰富的几何造型、数据交换和可视化等功能,成为许多CAD软件的核心组件。  本篇描述搭建Qt开发occ环境过程。 Demo  ......