我正在使用 javafx 制作一個覆寫應用程式。我想在按下按鈕時將鍵輸入發送到第三方應用程式。我正在使用 JNA 來集中應用程式和 Robot 來模擬按鍵。
我可以正確地獲得一個 Windows 句柄FindWindows:
public interface WindowsFinder extends StdCallLibrary
{
public static final int WINDOW_TOPMOST = -1;
public static final int WINDOW_NONTOPMOST = -2;
Map<String, Object> UNICODE_OPTIONS = new HashMap<String, Object>()
{
private static final long serialVersionUID = 1L;
{
put(OPTION_TYPE_MAPPER,
W32APITypeMapper.UNICODE);
put(OPTION_FUNCTION_MAPPER,
W32APIFunctionMapper.UNICODE);
}
};
Map<String, Object> ASCII_OPTIONS = new HashMap<String, Object>()
{
private static final long serialVersionUID = 1L;
{
put(OPTION_TYPE_MAPPER,
W32APITypeMapper.ASCII);
put(OPTION_FUNCTION_MAPPER,
W32APIFunctionMapper.ASCII);
}
};
Map<String, Object> DEFAULT_OPTIONS = Boolean.getBoolean("w32.ascii") ? ASCII_OPTIONS
: UNICODE_OPTIONS;
WindowsFinder INSTANCE = (WindowsFinder) Native.load(
"user32", WindowsFinder.class,
DEFAULT_OPTIONS);
Pointer FindWindow(String lpClassName, String lpWindowName);
void SetFocus(Pointer hWnd);
boolean SetWindowPos(Pointer hWnd, int hWndAfter, int x, int y, int cx,
int cy, int flags);
}
Pointer windowsHandle = WindowsFinder.INSTANCE.FindWindow(null, "my windows");
Result : native@0x10450
但是,當我想使用該句柄時
if(windowsHandle != null) WindowsFinder.INSTANCE.SetWindowPos(windowsHandle, WindowsFinder.WINDOW_TOPMOST, 0, 0, 0, 0, 43);
它不起作用,并Native.getLastError()回傳 1400,這意味著Invalid Window Handle. 我不明白為什么我的句柄不正確,因為它來自 JNA。
我setWindowsPos在檢索句柄后立即執行,而不接觸目標視窗。我擔心將句柄保存為 Java Pointer 物件然后在 JNA 中轉換回時會出現轉換錯誤。
我也試過使用SetFocus,這次我得到錯誤 5 (ERROR_ACCESS_DENIED)。
代碼來自這個論壇(用法語撰寫):https ://www.developpez.net/forums/d1297379/java/general-java/focus-fenetre-exterieure/
有什么我想念的嗎?
PS:FindWindow當我的“我的視窗”不存在或拼寫不是這樣時,它似乎可以回傳 null 。
uj5u.com熱心網友回復:
你有一個無效的句柄,只是不是你想的那個。
問題出在您的函式映射中SetWindowPos:
boolean SetWindowPos(Pointer hWnd, int hWndAfter, int x, int y, int cx, int cy, int flags);
}
第二個引數是 a HWND:
BOOL SetWindowPos(
[in] HWND hWnd,
[in, optional] HWND hWndInsertAfter,
[in] int X,
[in] int Y,
[in] int cx,
[in] int cy,
[in] UINT uFlags
);
您可以通過將第二個引數更改Pointer為匹配第一個引數并將您的更改WINDOW_TOPMOST為new Pointer(-1). 但是,您可能希望HWND對兩個引數都使用 JNA 的型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/428285.html
