Comment obtenir la liste de toutes les poignées de fenêtre en Java (à l'Aide de la "JNA")?
Je suis novice pour la JNA. J'essaye de faire des poignées pour tous les windows, y compris minimisé. J'ai besoin de HWND
de toutes les fenêtres. Je suis allé thro la question Windows: comment obtenir une liste de toutes les fenêtres visibles? qui m'a aidé à obtenir la liste à windows, mais il a hWnd
type int. Je ne peux pas l'utiliser avec com.sun.jna.platform.win32.User32
fonctions qui demande hWnd
de type com.sun.jna.platform.win32.WinDef.HWND
. Donc, Est-il possible d'obtenir toutes les poignées de fenêtre de type com.sun.jna.platform.win32.WinDef.HWND
plutôt que int pointeur? Enfin, pourquoi la différence int
et HWND
? Comment est-il accepter? Je suis un peu confus. Merci.
J'ai le code suivant(sous la direction de Hovercreft réponse):
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.RECT;
import com.sun.jna.platform.win32.WinUser.WNDENUMPROC;
public class TryWithHWND {
public static void main(String[] args) {
final User32 user32 = User32.INSTANCE;
user32.EnumWindows(new WNDENUMPROC() {
int count = 0;
public boolean callback(HWND hWnd, Pointer arg1) {
char[] windowText = new char[512];
user32.GetWindowText(hWnd, windowText, 512);
String wText = Native.toString(windowText);
RECT rectangle = new RECT();
user32.GetWindowRect(hWnd, rectangle);
//get rid of this if block if you want all windows regardless
//of whether
//or not they have text
//second condition is for visible and non minimised windows
if (wText.isEmpty() || !(User32.INSTANCE.IsWindowVisible(hWnd)
&& rectangle.left > -32000)) {
return true;
}
System.out.println("Found window with text " + hWnd
+ ", total " + ++count + " Text: " + wText);
return true;
}
}, null);
}
}
J'ai essayé d'utiliser uniquement(pas d'interface personnalisée) la valeur par défaut User32
classe. Il fonctionne très bien. J'ai un doute, pourquoi nous sommes définis par l'utilisateur à l'aide de l'interface au lieu de déjà existant? Une chose de plus, Il existe toujours une différence entre la signature de la méthode définie par l'utilisateur et celles qui existent déjà. Par exemple, la variable windowText
est char[]
, alors que l'Aéroglisseur de la variable est de type byte[]
. Quelqu'un peut-il m'expliquer? Merci.
OriginalL'auteur Ahamed | 2012-01-03
Vous devez vous connecter pour publier un commentaire.
La dernière version de la JNA a eu quelques changements qui doivent résoudre (comme l'un des auteurs de la JNA, Luc Quinane, les états ici). Si vous utilisez la version la plus récente et de vérifier la JNA API, vous verrez que le WinUser.WNDENUMPROC interface de la méthode utilise WinDef.HWND comme paramètre, pas à long ou int.
Par exemple:
HWND
est désactivée. Pourquoi par défaut User32 achar[]
comme param mais celui que vous avez défini est d'avoirbyte[]
?Si l'accès à la version unicode de la méthode (SomeFunctionW), vous devez utiliser des char[] pour LPTCHAR paramètres; si vous utilisez la version ascii (SomeFunctionA), vous devez utiliser byte[]. Le MS-têtes automatiquement à la carte "SomeFunction" soit "SomeFunctionW" ou "SomeFunctionA", selon que l'UNICODE est défini; JNA accomplit la même chose selon les options passées à la Maternelle.loadLibrary. Vous pouvez également utiliser explicitement Un "a" ou "W" suffixe comme dans l'exemple ci-dessus.
OriginalL'auteur