如何使用java检测Windows OS中的工作站/系统屏幕锁定/解锁?

时间:2012-04-19 12:32:28

标签: java windows

我正在尝试记下工作站/系统屏幕锁定和解锁在Windows操作系统中工作的每个员工。我需要使用JAVA将这些记录存储在DataBase中。我已经搜遍了所有并且知道如何使用JAVA。在哪里我搜索过我只得到VB的代码。

5 个答案:

答案 0 :(得分:9)

您可以使用JNA在纯Java中执行此操作。将 jna.jar jna-platform.jar 添加到您的项目中。在这个文件com.sun.jna.platform.win32.Win32WindowDemo中,有一个锁定和解锁监听器的完整示例等等。以下是来自Win32WindowDemo的必要代码:

public class WorkstationLockListening implements WindowProc
{

    /**
     * Instantiates a new win32 window test.
     */
    public WorkstationLockListening()
    {
        // define new window class
        final WString windowClass = new WString("MyWindowClass");
        final HMODULE hInst = Kernel32.INSTANCE.GetModuleHandle("");

        WNDCLASSEX wClass = new WNDCLASSEX();
        wClass.hInstance = hInst;
        wClass.lpfnWndProc = WorkstationLockListening.this;
        wClass.lpszClassName = windowClass;

        // register window class
        User32.INSTANCE.RegisterClassEx(wClass);
        getLastError();

        // create new window
        final HWND hWnd = User32.INSTANCE.CreateWindowEx(User32.WS_EX_TOPMOST, windowClass, "'TimeTracker hidden helper window to catch Windows events", 0, 0, 0, 0, 0, null, // WM_DEVICECHANGE contradicts parent=WinUser.HWND_MESSAGE
                null, hInst, null);

        getLastError();
        System.out.println("window sucessfully created! window hwnd: " + hWnd.getPointer().toString());

        Wtsapi32.INSTANCE.WTSRegisterSessionNotification(hWnd, Wtsapi32.NOTIFY_FOR_THIS_SESSION);

        MSG msg = new MSG();
        while (User32.INSTANCE.GetMessage(msg, hWnd, 0, 0) != 0)
        {
            User32.INSTANCE.TranslateMessage(msg);
            User32.INSTANCE.DispatchMessage(msg);
        }

            /// This code is to clean at the end. You can attach it to your custom application shutdown listener
            Wtsapi32.INSTANCE.WTSUnRegisterSessionNotification(hWnd);
            User32.INSTANCE.UnregisterClass(windowClass, hInst);
            User32.INSTANCE.DestroyWindow(hWnd);
            System.out.println("program exit!");
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.sun.jna.platform.win32.User32.WindowProc#callback(com.sun.jna.platform .win32.WinDef.HWND, int, com.sun.jna.platform.win32.WinDef.WPARAM, com.sun.jna.platform.win32.WinDef.LPARAM)
     */
    public LRESULT callback(HWND hwnd, int uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch (uMsg)
        {
            case WinUser.WM_DESTROY:
            {
                User32.INSTANCE.PostQuitMessage(0);
                return new LRESULT(0);
            }
            case WinUser.WM_SESSION_CHANGE:
            {
                this.onSessionChange(wParam, lParam);
                return new LRESULT(0);
            }
            default:
                return User32.INSTANCE.DefWindowProc(hwnd, uMsg, wParam, lParam);
        }
    }

    /**
     * Gets the last error.
     * 
     * @return the last error
     */
    public int getLastError()
    {
        int rc = Kernel32.INSTANCE.GetLastError();

        if (rc != 0)
            System.out.println("error: " + rc);

        return rc;
    }

    /**
     * On session change.
     * 
     * @param wParam
     *            the w param
     * @param lParam
     *            the l param
     */
    protected void onSessionChange(WPARAM wParam, LPARAM lParam)
    {
        switch (wParam.intValue())
        {
            case Wtsapi32.WTS_SESSION_LOCK:
            {
                this.onMachineLocked(lParam.intValue());
                break;
            }
            case Wtsapi32.WTS_SESSION_UNLOCK:
            {
                this.onMachineUnlocked(lParam.intValue());
                break;
            }
        }
    }

    /**
     * On machine locked.
     * 
     * @param sessionId
     *            the session id
     */
    protected void onMachineLocked(int sessionId)
    {
        System.out.println("Machine locked right now!");
    }

    /**
     * On machine unlocked.
     * 
     * @param sessionId
     *            the session id
     */
    protected void onMachineUnlocked(int sessionId)
    {
        System.out.println("Machine unlocked right now!");
    }
}

我们已在Google Group Workstation Lock / Unlock listener中解决了这个问题。你可以找到我自己的实现,但这里的代码要好得多!享受:)

答案 1 :(得分:1)

使用JNI(Java Native Interface)从Windows系统dll调用函数。

以下是使用检查工作站锁定状态的函数的示例代码:http://brutaldev.com/post/2008/05/23/Checking-if-the-workstation-is-locked.aspx

以下是关于通过JNI从Java调用dll函数的文章: http://edn.embarcadero.com/article/20679

答案 2 :(得分:1)

还有一种方法,没有任何Windows系统库,等等。

主要想法 - 锁定PC的屏幕截图将完全黑色,因此您可以选择一个,只需检查一些关键点是黑色

-16777216 - 幻数,即FFFFFFFFFF000000xH,最后00 00 00表示RGB颜色代码(实际为黑色)

        BufferedImage image = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
        boolean isBlack;    
        isBlack = (image.getRGB(1,1)==-16777216)
                &(image.getRGB(1,image.getHeight()-1)==-16777216)
                &(image.getRGB(image.getWidth()-1,1)==-16777216)
                &(image.getRGB(image.getWidth()-1,image.getHeight()-1)==-16777216)
                &(image.getRGB(image.getWidth()/2,image.getHeight()/2)==-16777216);
        return isBlack;

实际上,只有一个案例的锁识别不正确 - 当你有完全黑色的壁纸时,隐藏的任务栏和隐藏的图标。

答案 3 :(得分:0)

查看Unlock Administrator

该程序的目的是允许管理员分配谁可以解锁计算机,但它也具有日志记录功能。它还允许您在计算机锁定或解锁时运行脚本。这可能对您有所帮助。

答案 4 :(得分:0)

使用JDIC Library,

检查系统是否已锁定

  

SystemInfo.isSessionLocked()