在使用MSN过程中发现,如果张三和李四都在线而且互相加入了好友,当张三离开座位并“锁定计算机”,那么很快李四那里就显示张三的状态为“离开”。分析其原因,当张三锁定计算机的时候,MSN捕捉了某个消息,然后向在线的所有好友发送“该用户已经锁定计算机,当前状态为离开”,那么其他人看到这个人的状态就是“离开”。这两天找了很多windows系统消息相关的资料,可惜都没有找到这个“锁定计算机”的消息。(也可能使用了其他机制来完成这个工作)找到了这个锁定计算机API函数,LockWorkStation;  那么,如何判断用户是否锁定计算机?望有线索的网友不吝赐教!

解决方案 »

  1.   

    你的客户端程序去检测相应的windows消息,
    当检测到该消息时通过UDP向服务器发送“离开”消息。
    服务器端检测到了该消息后再做相应的处理 (入给他的在线好友发送“离线”通知).
      

  2.   

    当张三离开座位并“锁定计算机”,那么很快李四那里就显示张三的状态为“离开”。
    --------------------------------------
    这个可能是张三在锁定计算机的时候发送消息给李四
    然后李四接到锁定消息
    确定张三离开function LockWorkStation; external user32 name 'LockWorkStation';
    (user32.dll, func:LockWorkStation())
    这个函数我觉得在执行的时候是会触发一个消息反馈的
    MSN可以定期去捕获这个消息
    来判断系统状态
      

  3.   

    问题在于现在我找不到LockWorkStation()发出的消息,也就是说,如果的确是这样的消息触发机制的话,现在我不知道这个消息的值,所以,无法捕捉这个消息。也可能M$用了其他方法来实现这个效果?
      

  4.   

    function IsWorkstationLocked: Boolean;
    var
      hDesktop: HDESK;
    begin
      Result := False;
      hDesktop := OpenDesktop('default',
        0, False,
        DESKTOP_SWITCHDESKTOP);
      if hDesktop <> 0 then
      begin
        Result := not SwitchDesktop(hDesktop);
        CloseDesktop(hDesktop);
      end;
    end;http://lysoft.7u7.net
      

  5.   

    虽然ly_liuyang 给出了测试的办法,但是,毕竟是变通的方法,针对特殊的情况不能适用。我的机器是Win2K,当我按了Alt+Ctrl+Del,会显示“Windows安全”的窗口,此时的默认桌面不是系统的那个常见的桌面,这个时候,ly_liuyang 提供的函数就判断为机器已经“锁定”,判断错误。当运行屏幕保护的时候,判断为没有锁定计算机。刚刚跟我的同事一起测试了一下MSN,如果我的机器仅仅按Alt+Ctrl+Del,他那里显示我的状态依然是联机,仅当单击了“锁定计算机”才会马上更改为“离开”。谢谢ly_liuyang ,这个问题的解决已经向前迈进了,虽然没有完美解决。