How to Detect workstation/System Screen Lock/unlock in windows OS using java?

前端 未结 5 1363
予麋鹿
予麋鹿 2020-12-03 00:18

I\'m trying to note down workstation/System screen Lock and Unlock of each employee working in windows OS. I needed to store these record in a DataBase, using JAVA. I have s

相关标签:
5条回答
  • 2020-12-03 00:45

    Use JNI (Java Native Interface) to invoke functions from the Windows system dll.

    Here is the sample code for use of functions which check workstation locking state: http://brutaldev.com/post/2008/05/23/Checking-if-the-workstation-is-locked.aspx

    And here is the article about invoking dll-functions from Java via JNI: http://edn.embarcadero.com/article/20679

    0 讨论(0)
  • 2020-12-03 01:00

    Have a look at Unlock Administrator

    The purpose of the program is allow the admin at assign who can unlock the computer but it also has logging capability. It also allows you to run a script whenever the computer is locked or unlocked. This may be helpful to you.

    0 讨论(0)
  • 2020-12-03 01:02

    One more way, without any windows system libs, ect.

    Main idea - screenshots for locked PC will be totally black, so you can take one and simply check that some critical points are black

    -16777216 - magic number, that means FFFFFFFFFF000000xH and last 00 00 00 means RGB color code (actually black color)

            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;
    

    Actually, there could be only one case with incorrect lock identification - when you have totally black wallpaper, with hidden taskbar and hidden icons.

    0 讨论(0)
  • 2020-12-03 01:04

    You can do it in pure Java using JNA. Add jna.jar and jna-platform.jar to your project. And in this file com.sun.jna.platform.win32.Win32WindowDemo there is a full example of lock and unlock listener and much more. Here is the necessary code from thah 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!");
        }
    }
    

    We have solved this problem in Google Group Workstation Lock / Unlock listener. You can find there my own implementation but this code right here is much better! Enjoy :)

    0 讨论(0)
  • 2020-12-03 01:06

    Using JDIC Library,

    To Check the system is Locked or Not

    SystemInfo.isSessionLocked()

    0 讨论(0)
提交回复
热议问题