gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:28:25 25 4
gpt4 key购买 nike

我试图记下每个在 Windows 操作系统中工作的员工的工作站/系统屏幕锁定和解锁。我需要使用 JAVA 将这些记录存储在数据库中。我到处搜索并了解如何使用 JAVA 来完成它。无论我在哪里搜索,我都只能得到 VB 的代码。

最佳答案

您可以使用 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 listener 中解决了这个问题.你可以在那里找到我自己的实现,但这里的代码要好得多!享受:)

关于java - 如何使用 java 在 Windows 操作系统中检测工作站/系统屏幕锁定/解锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10228145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com