我想在任務完成后向用戶顯示一些訊息。但是應用程式作為服務運行,因此無法使用 UI 組件。
微軟檔案說我們可以使用 win32 API:WTSSendMessage來顯示一個對話框。我瀏覽了 JNA 檔案,但找不到有關此特定內容的任何參考。我想為 Java 應用程式執行此操作。有沒有辦法通過JNA?
WTSSendMessageA 檔案鏈接:https ://docs.microsoft.com/en-us/windows/win32/api/wtsapi32/nf-wtsapi32-wtssendmessagea
以下是 Microsoft 建議的其他一些方法: https ://docs.microsoft.com/en-us/windows/win32/services/interactive-services?redirectedfrom=MSDN
uj5u.com熱心網友回復:
根據您提供的鏈接,服務可以
WTSSendMessage使用該函式在用戶會話中顯示一個對話框。
JNA 由工件中的基本功能和jna工件中用戶貢獻的映射組成jna-platform。雖然Wtsapi32該類存在于 JNA 中,但僅映射了該 dll 的一些函式,但沒有映射WTSSendMessage.
我注意到您將檔案鏈接到 -A 后綴版本:這是“ANSI”映射,不適用于任何現代版本的 Windows。如果使用 WinAPI 默認型別映射器映射無后綴版本,它會自動選擇正確的 -A 或 -W 后綴版本(區別在于 -W 使用 UTF16 寬字串,而 -A 使用 8 位 ASCII)。但是為了您的方便,您可以只映射 -W 版本,WTSSendMessageW.
查看引數串列,您需要:
- 一個
HANDLE從WTSOpenServer - 要發送到的會話(您可以使用當前會話)
- 您可以創建的標題欄字串
- 您可以創建的訊息
- 一種風格(你可以只使用“OK”版本)
- 超時
- 接收回應值的指標
對于服務器句柄,WTSOpenServer狀態檔案
您無需為在運行應用程式的 RD 會話主機服務器上執行的操作打開句柄。請改用常量
WTS_CURRENT_SERVER_HANDLE。
這已經在 J??NA 中映射(它是一個HANDLE包裝空值)。
所以你只需要映射WTSSendMessage函式。型別映射很簡單。HANDLE并LPWSTR在 JNA 中映射,您應該使用args和intfor 。您將使用一個介面,并擴展現有的 JNA 映射以獲取對其功能的訪問:DWORDbooleanBOOL
public interface MyWtsapi32 extends com.sun.jna.platform.win32.Wtsapi32 {
// Your own instance to access your functions
MyWtsapi32 INSTANCE = Native.load("Wtsapi32", Wtsapi32.class, W32APIOptions.DEFAULT_OPTIONS);
// From https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messagebox
int MB_OK = 0;
// The function to send the message
boolean WTSSendMessageW(HANDLE hServer, int SessionId,
LPWSTR pTitle, int TitleLength,
LPWSTR pMessage, int MessageLength,
int Style, int Timeout, IntByReference pResponse, boolean bWait);
}
然后使用函式。我們可以使用當前服務器句柄,當前會話,創建要傳遞的字串,使用“OK”樣式,并通過傳遞 false 作為等待引數來忽略超時/回應。
LPWSTR pTitle = new LPWSTR("Message box title");
int titleLength = ("Message box title".length() 1) * Native.WCHAR_SIZE;
LPWSTR pMessage = new LPWSTR("Hello World!");
int messageLength = ("Hello World!".length() 1) * Native.WCHAR_SIZE;
IntByReference pResponse = new IntByReference();
MyWtsapi32.INSTANCE.WTSSendMessageW(
WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION,
pTitle, titleLength,
pMessage, messageLength,
MB_OK, 0, pResponse, false);
// should return IDASYNC in pResponse.getValue()
這都是未經測驗的。你需要適當的進口。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/460358.html
上一篇:權限提升和訪問令牌權限修改
