![](/img/trans.png)
[英]Changing the focused window in windows xp from java-based web application using JNA and Windows sendMessage API
[英]JNA - Changing the Windows Cursor
我試圖將Windows Cursor設置為一個名為cursorOptions的數組中的一個隨機游標,該數組保存每種游標類型的值。
int[] cursorOptions = new int[]{32650, 32515, 32649, 32651, 32513, 32648, 32646, 32643, 32645, 32642, 32644, 32516, 32514, 32512};
我正在使用SetCursor(WinDef.LONG hcur)JNA方法(位於第1157行,位於: https : //github.com/br45entei/SWT-Win32-Extension/blob/master/src/org/sf/feeling/swt /win32/extension/jna/win32/User32.java ),但不知道我應該為hcur設置什么值。 我試圖從數組中發送新的游標值,但計算結果為false。
WinDef.LONG u = new WinDef.LONG(cursorOptions[rand.nextInt(cursorOptions.length-1)]);
user32.SetCursor(u);
user32.ShowCursor(true);
接下來,我嘗試分配不同游標值(IBar游標為65541)的hashCode值,該值評估為true,但沒有更改游標值。
WinDef.LONG g = new WinDef.LONG(65541);
user32.SetCursor(g);
user32.ShowCursor(true);
預期什么值的hcur會改變光標? 為什么在SetCursor(WinDef.LONG hcur)中發送時,游標的hashCode值評估為true卻沒有更改游標?
完整代碼:
import com.sun.jna.Native;
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.win32.W32APIOptions;
import java.awt.*;
import java.util.*;
import java.util.List;
import java.util.concurrent.TimeUnit;
class MouseManipulation {
private User32 user32;
MouseManipulation() {
user32 = User32.INSTANCE;
}
/**
* @return cursorInfo.hCursor Returns the HCURSOR of the cursor on screen
*/
WinDef.HCURSOR getCurrentCursor(){
CursorInfo cursorInfo = new CursorInfo();
this.user32.GetCursorInfo(cursorInfo);
return cursorInfo.hCursor;
}
/*
* Set the cursor to be a random cursor within the defined scope of cursorOptions
*/
void ChangeMouseCursor() {
try {
int[] cursorOptions = new int[]{32650, 32515, 32649, 32651, 32513, 32648, 32646, 32643, 32645, 32642, 32644, 32516, 32514, 32512};
Random rand = new Random();
WinDef.HCURSOR hc = getCurrentCursor();
System.out.println("The HCURSOR: "+hc.toString());
System.out.println("The HCURSOR hashCode: "+hc.hashCode());
//I want this to randomly pick from the Array of cursor values and set that as the newest cursor icon
//but I have no clue what value for WinDef.LONG should be
WinDef.LONG u = new WinDef.LONG(cursorOptions[rand.nextInt(cursorOptions.length-1)]);
user32.SetCursor(u);
user32.ShowCursor(true);
System.out.println("When using the array: "+user32.SetCursor(u));
//This evaluates to true yet doesn't change the cursor icon on screen;
//for instance 65541 is the hashCode for IBar and when cursor is NormalPointer it doesn't change.
WinDef.LONG g = new WinDef.LONG(65541);
user32.SetCursor(g);
user32.ShowCursor(true);
System.out.println("When using the hashCode: "+user32.SetCursor(g));
}
//Sometimes the cursor won't be found so we catch the NullPointerException
catch (NullPointerException e){
e.printStackTrace();
}
}
/*
* Take advantage of the JNA 4.5.2 and the JNA 4.5.2 platform to interact with the Win32 API
*/
public interface User32 extends com.sun.jna.Library {
MouseManipulation.User32 INSTANCE = (MouseManipulation.User32) Native.loadLibrary("user32", MouseManipulation.User32.class, W32APIOptions.DEFAULT_OPTIONS);
boolean SetCursor(WinDef.LONG hcur);
int GetCursorInfo(CursorInfo cursorInfo);
int ShowCursor(boolean bShow);
}
/*
* This class was made to get the cursor's information such as its pointer and then later gets its hashCode value
Credits: deFreitas at: https://stackoverflow.com/questions/47634213/get-mouse-type-in-java-using-jna
*/
public static class CursorInfo extends Structure {
public int cbSize;//Access must be public
public int flags;
public WinDef.HCURSOR hCursor;//Access must be public
public WinDef.POINT ptScreenPos;
CursorInfo() {
this.cbSize = Native.getNativeSize(CursorInfo.class, null);
}
@Override
protected List<String> getFieldOrder() {
return Arrays.asList("cbSize", "flags", "hCursor", "ptScreenPos");
}
}
}
二手圖書館:
compile group: 'net.java.dev.jna', name: 'jna', version: '4.5.2'
compile group: 'net.java.dev.jna', name: 'jna-platform', version: '4.5.2'
致電:
final MouseManipulation mouse = new MouseManipulation();
mouse.ChangeMouseCursor();
注意:我希望Windows光標即使不在Java應用程序上也可以更改,因此JFrame解決方案和其他類似的東西是不必要的。
我提前謝謝你!
SetCursor
效果僅持續到下一次SetCursor
調用為止。 在Windows程序中, SetCursor
被調用,以響應Windows Manager發送的消息,以便在將鼠標移到Windows或更高版本的Windows(即使鼠標靜止)時通過更改光標形狀來提供用戶反饋。
要永久更改光標,可以使用SetClassLongPtr( hwnd, GCLP_HCURSOR, cursor_handle );
或子類窗口過程,並處理WM_SETCURSOR
消息(不幸的是,這在C語言中):
case WM_SETCURSOR:
// If you omit test below, you will change cursor also for scrollbars, frames, etc.
if ( LOWORD( lparam ) == HTCLIENT )
SetCursor( cursor_handle );
else
// This will also handle cursor for scrollbars and frames.
return DefWindowProc( hwnd, msg, wparam, lparam );
return TRUE;
cursor_handle
必須是進程創建的窗口的有效句柄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.