5

Windows OS で作業している各従業員のワークステーション/システム画面のロックとロック解除を書き留めようとしています。JAVA を使用して、これらのレコードをデータベースに格納する必要がありました。私はあちこち検索して、JAVAを使用してそれを行う方法を考え出しました。どこを検索しても、VB のみのコードが得られます。

4

6 に答える 6

11

JNAを使用して純粋な Java で実行できます。プロジェクトにjna.jarjna-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 リスナーでこの問題を解決しました。あなたは私自身の実装を見つけることができますが、ここにあるこのコードははるかに優れています! 楽しみ :)

于 2014-05-25T08:34:19.273 に答える
1

JNI (Java Native Interface) を使用して、Windows システム dll から関数を呼び出します。

ワークステーションのロック状態をチェックする関数を使用するためのサンプル コードは次のとおりです

また、JNI を介して Java から dll 関数を呼び出す方法に関する記事は次のとおりです: http://edn.embarcadero.com/article/20679

于 2012-04-19T13:00:49.227 に答える
0

JDIC ライブラリを使用して、

システムがロックされているかどうかを確認するには

SystemInfo.isSessionLocked()

于 2013-02-27T15:45:15.913 に答える
0

Unlock Administratorをご覧ください。

プログラムの目的は、管理者がコンピュータのロックを解除できるようにすることですが、ログ機能も備えています。また、コンピューターがロックまたはロック解除されているときはいつでもスクリプトを実行できます。これはあなたに役立つかもしれません。

于 2012-04-20T15:42:48.160 に答える
0

JDK9 (JDK11) では、 java.awt.Desktop を使用できます。

Desktop tempDesktop = Desktop.getDesktop();
tempDesktop.addAppEventListener(new UserSessionListener() {

    @Override
    public void userSessionDeactivated(UserSessionEvent aE) {
        LOG.info("Desktop:userSessionDeactivated Reason=" + aE.getReason() + " Source=" + aE.getSource());
            // Windows Key L: 
            // Tue Aug 31 11:22:49 CEST 2021:info:MainController:userSessionDeactivated Reason=LOCK

            // Close Lid:
            // Tue Aug 31 11:24:38 CEST 021:info:MainController:userSessionDeactivated Reason=LOCK
            // Tue Aug 31 11:24:39 CEST 2021:info:MainController:systemAboutToSleep Source=java.awt.Desktop@741f67cd

        ptcUserStatus = PtcUserStatus.AWAY;
    }

    @Override
    public void userSessionActivated(UserSessionEvent aE) {
        LOG.info("Desktop:userSessionActivated Reason=" + aE.getReason() + " Source=" + aE.getSource());
            // Logon after Windows Key L
            // Tue Aug 31 11:22:53 CEST 2021:info:MainController:userSessionActivated Reason=LOCK

            // Open Lid:
            // Tue Aug 31 11:24:56 CEST 2021:info:MainController:systemAwoke Source=java.awt.Desktop@741f67cd
            // Tue Aug 31 11:25:06 CEST 2021:info:MainController:userSessionActivated Reason=LOCK
        ptcUserStatus = PtcUserStatus.BACK;
    }
});
于 2021-08-31T18:50:08.317 に答える