Sessions, Window Stations and Desktops(GetDesktopWindow函数得到的桌面句柄, 是Csrss.exe创建的一个窗口)

由于不是搞安全的,对这块的东西一直不是很清楚,今天特意整理下。

总的来说,他们的关系如下:


我们知道Windows是支持多用户的,Session可以理解为每个用户登录,比如当前登录和远程登陆。
Window Stations可以理解为登陆后的不同用户组,我们在任务管理器中可以看到不同的用户名(比如 Richard, system, local service等),其中只有一个活动Station WinSta0, 只有这个Station是接受用户鼠标键盘输入的。而WinSta0 Station 又包括3个Desktop(包括Winlogon, Disconnect, Default), 其中Winlogon指的是登陆Desktop,当我们按Ctrl+Alt+Del时就会进入该Desktop;Disconnect指的是屏保Desktop; Default指的就是我们平时有任务栏的Desktop, 当然真正的Default Desktop是没有应用程序的在上面的,我们看到的桌面其实是启动Shell Explorer后的界面。

总结几点和我们平时写程序有关的: 
(1)我们平时通过GetDesktopWindow()得到的桌面句柄, 是Csrss.exe创建的一个窗口,它被放在WinStation内的Desktop内. 
而我们通过Win+D看到的桌面, 其实是Expolore.exe创建的一个Pop up窗口, 它和我们普通的pop up 窗口一样, Owner是GetDesktopWindow()
(2)我们可以通过CreateDesktop, OpenDesktop, SwitchDesktop等API创建和切换Desktop。
(3)我们平时写服务程序时发现窗口弹不出来, 因为服务不是运行在Station WinSta0下面. 通过FindWindow也找不到我们要找的窗口,因为它下面没有我们的当前WinStation
的Desktop。
(4)一个window station 对象包括一个剪贴板、一个全局原子集和多个Desktop对象, 所以你可以在同一个一个window station内的多个Desktop之间通过剪贴板传送数据.
(5)所有的进程都和Session, WinStation, Desktop相关联,所以我们可以把它表示成这样一个路径: Session 1\WinSta0\Default, 这样我们也就理解为什么有些API需要我们传类似这样的信息.


参考资料: 

http://www.cppblog.com/weiym/archive/2012/05/12/174701.html

要使用Java创建一个WebSocket服务器,你可以使用Java的WebSocket API。以下是一个简单的示例代码: ```java import java.io.IOException; import java.net.InetSocketAddress; import java.util.Collections; import java.util.HashSet; import java.util.Set; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; import javax.websocket.*; import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/") public class WebSocketServer { private static final Set<Session> sessions = Collections.synchronizedSet(new HashSet<>()); @OnOpen public void onOpen(Session session) { sessions.add(session); System.out.println("New session opened: " + session.getId()); } @OnMessage public void onMessage(String message, Session session) throws IOException { System.out.println("Received message from " + session.getId() + ": " + message); broadcast(message); } @OnClose public void onClose(Session session) { sessions.remove(session); System.out.println("Session closed: " + session.getId()); } @OnError public void onError(Session session, Throwable error) { System.out.println("Error occurred in session " + session.getId() + ": " + error.getMessage()); } private void broadcast(String message) throws IOException { for (Session session : sessions) { session.getBasicRemote().sendText(message); } } public static void main(String[] args) throws Exception { HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0); server.createContext("/", new WebSocketHandler()); server.start(); System.out.println("WebSocket server started"); } static class WebSocketHandler implements HttpHandler { @Override public void handle(HttpExchange exchange) throws IOException { exchange.sendResponseHeaders(200, -1); exchange.close(); } } } ``` 上述代码使用了Java的WebSocket API,并创建一个简单的WebSocket服务器。它使用`@ServerEndpoint`注解来指定WebSocket的端点路径,这里是根路径`"/"`。在`onOpen`方法中,将新的会话(session)添加到集合中,`onMessage`方法用于接收客户端发送的消息并广播给所有连接的会话,`onClose`方法在会话关闭时从集合中移除,`onError`方法处理会话发生的错误。 在`main`方法中,创建一个基于HTTP的服务器(`HttpServer`)实例,并指定监听的端口号为8080。然后,创建一个WebSocket处理器(`WebSocketHandler`)来处理WebSocket握手请求。最后,启动服务器并打印启动消息。 请注意,这个示例使用了Java标准库中的`com.sun.net.httpserver`和`javax.websocket`包,确保你的项目中已经包含这些依赖。 你可以根据自己的需求进行修改和扩展,比如添加身份验证、处理不同的消息类型等。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值