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

如何使用java检测windows操作系统中的工作站/系统屏幕锁定/解锁?,java,windows,Java,Windows,我试图记下在windows操作系统中工作的每个员工的工作站/系统屏幕锁定和解锁。我需要使用JAVA将这些记录存储在数据库中。我已经搜索了所有地方,并了解了如何使用JAVA实现它。无论在哪里搜索,我都只得到VB的代码。使用JNI(Java本机接口)从Windows系统dll调用函数 以下是用于检查工作站锁定状态的函数的示例代码: 下面是关于通过JNI从Java调用dll函数的文章: 看一看 该程序的目的是允许管理员在分配谁可以解锁计算机,但它也有记录功能。它还允许您在计算机锁定或解锁时运行脚本。这

我试图记下在windows操作系统中工作的每个员工的工作站/系统屏幕锁定和解锁。我需要使用JAVA将这些记录存储在数据库中。我已经搜索了所有地方,并了解了如何使用JAVA实现它。无论在哪里搜索,我都只得到VB的代码。

使用JNI(Java本机接口)从Windows系统dll调用函数

以下是用于检查工作站锁定状态的函数的示例代码:

下面是关于通过JNI从Java调用dll函数的文章: 看一看

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

使用JDIC库

检查系统是否已锁定

SystemInfo.isSessionLocked()


您可以使用纯Java实现。将jna.jarjna平台.jar添加到项目中。在这个文件中,有一个完整的锁和解锁侦听器示例,以及更多的示例。以下是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!");
    }
}

我们已经在年内解决了这个问题。您可以在那里找到我自己的实现,但这里的代码要好得多!享受:)

另一种方式,无需任何windows系统库等

主要思想-锁定电脑的屏幕截图将是完全黑色的,所以你可以拿一个,只需检查一些关键点是黑色的

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


实际上,只有一种情况下锁标识不正确——当你有全黑的墙纸,带有隐藏的任务栏和隐藏的图标

我已经浏览了您提供的那些链接,但我需要用纯java实现。我理解了,对于这种情况,没有必要使用java来编码,因为将java文件转换成头文件,最好用C或C++本身或任何基于VB的代码,如VB或任何java来编码。不幸的是,对于这个任务没有纯Java解决方案。唯一可能的方法是使用Java+JNI+调用系统dll文件。这可能工作过一次,但在Windows 10下不工作。对不起。我在寻找纯java的想法。你找到解决方案了吗?我今天也有同样的需要…@André是的,但我们是用.Net来做的;由于java中的漫长过程,我们还需要使用JNI、C++、C++。因此,我们可以创建一个.dll文件,该文件可用于我们的java代码中,这是一项艰巨的工作。所以我放弃了使用java解决方案的想法。@Andre如果您想要java解决方案,请按照我接受的答案进行操作。我没有找到任何包含JDIC库的下载。如何使用它以及在哪里可以找到它?JDIC是java.net项目。。你可以在回购协议中找到免费的来源。使用ANT下载并创建。一个月前,我尝试了所有的发行版并从互联网上下载了..@Sathish如果你没有找到罐子。。。请在中华人民共和国与我联系。prabhu@gmail.com.. 发送给您。@Ladislav Gallay我正在尝试您的上述实现,但在主窗口中有错误。它表示无法解析为类型。我要为它导入什么(任何外部jar)?@Crawler,这将是jna.jar中的一个类。请确保将两个jna.jar文件都添加到类路径中,然后IDE应该能够为您找到它。@Crawler啊,很抱歉,我在
公共工作站lockListening(MainWindow窗口)
中有未使用的属性。我已经编辑并删除了我的答案。这是我的自定义项目类,与此演示无关。这是我在网上找到的使用java检测系统锁定和解锁的最简单、最干净的解决方案。。值得更多的投票:)我发现锁定的屏幕不是黑色的。另外,如果他们正在全屏观看一部电影,而电影的边框是完全黑色的,那该怎么办?您可以使用:
Color.black.getRGB()
-相同的值!:)-顺便说一句:对我来说,它就像一个符咒。
        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;