Вопрос по windows, java – Как обнаружить рабочую станцию / Блокировка экрана системы / разблокировать в ОС Windows, используя Java?

5

Я пытаюсь записать блокировку и разблокировку экрана рабочей станции / системы для каждого сотрудника, работающего в операционной системе Windows. Мне нужно было хранить эти записи в базе данных, используя JAVA. Я искал повсюду и понял, как это сделать с помощью JAVA. где бы я ни искал, я получаю код только для VB.

@ Andr & # xE9; да, но мы сделали это с помощью .Net; поскольку это длительный процесс в Java, а также нам нужно использовать JNI, C #, C ++. так что мы можем создать файл .dll, который можно использовать в нашем Java-коде, что является тяжелой работой. Поэтому я отбросил эту идею для решения Java. Sathish Kumar k k
@ Андре, если вы хотите решения Java, следуйте ответу, который я принял. Sathish Kumar k k
Вы нашли решение? У меня сегодня такая же потребность ... André

Ваш Ответ

5   ответов
8

ЮНА, добавлять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, Вы можете найти там мою собственную реализацию, но этот код гораздо лучше! Наслаждаться :)

Конечно, я попробую это. Sathish Kumar k k
@ Ladislav Gallay Я пробую вышеописанную реализацию, но у меня ошибка в MainWindow. Это говорит о том, что нельзя разрешить тип. Что я могу импортировать для этого (любые внешние банки)?
Это было самым простым & amp; самое чистое решение, которое я мог найти в Интернете для обнаружения блокировки системы & amp; разблокировать с помощью Java .. заслуживают больше голосов :)
@Crawler Это был бы класс в jna.jar. Убедитесь, что вы добавили оба файла jna.jar в путь к классам, и тогда ваша IDE сможет найти его для вас.
@Crawler Ааа, извините, у меня был неиспользованный атрибут вpublic WorkstationLockListening(MainWindow window), Я уже отредактировал свой ответ и удалил его. Это был мой собственный класс проекта, который не имеет ничего общего с этой демонстрацией.
0

Для проверки система заблокирована или нет

SystemInfo.isSessionLocked()

@ Сатис, если ты не нашел банки ... пингуй мне @ [email protected] .. пришлют тебя.
JDIC - это проект java.net. Вы можете найти бесплатный источник в репо. скачать и построить самостоятельно, используя ANT. Я перепробовал все дистрибутивы и скачал из интернета месяц назад ..
Я не нашел ни одной загрузки для включения библиотеки JDIC. Как его использовать и где его найти? Sathish Kumar k k
0

Разблокировать администратора

Цель программы - позволить администратору назначить, кто может разблокировать компьютер, но у него также есть возможность регистрации. Это также позволяет вам запускать скрипт всякий раз, когда компьютер заблокирован или разблокирован. Это может быть полезно для вас.

Сожалею. Я ищу идею чистой Java. Sathish Kumar k k
1

темной библиотеки Windows.

Вот пример кода для использования функций, которые проверяют состояние блокировки рабочей станции:http://brutaldev.com/post/2008/05/23/Checking-if-the-workstation-is-locked.aspx

А вот статья о вызове dll-функций из Java через JNI: http://edn.embarcadero.com/article/20679

К сожалению, для этой задачи не существует чисто Java-решения. Единственный возможный способ - использовать вызов Java + JNI + к системным файлам DLL.
Я пролистал ссылки, которые вы дали, но мне нужно сделать это на чистой Java. Я понимаю, что для этого сценария нет смысла кодировать Java, потому что вставлять преобразование Java-файла в заголовочный файл лучше в код на C или C ++ или в любой другой код на основе Windows, такой как VB или любой другой.? Sathish Kumar k k
Возможно, это работало один раз, но под Windows 10 не работает.
1

Основная идея - скриншоты для заблокированного ПК будут полностью черными, поэтому вы можете взять один и просто проверить, что некоторые критические точки являются черными

-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;

На самом деле, может быть только один случай с неправильной идентификацией блокировки - когда у вас полностью черные обои, со скрытой панелью задач и скрытыми значками.

Я обнаружил, что заблокированные экраны не черные. Кроме того, что, если они смотрят фильм во весь экран, и у него полностью черная рамка?

Похожие вопросы