Bonjour,Créer une fenêtre de Windows natif dans la JNA et certains GetWindowLong avec GWL_WNDPROC
J'utilise la JNA pendant un certain temps pour interagir avec l'API Windows et maintenant je suis coincé lors de la création d'une fenêtre. Pour autant que j'ai fait ce qui suit: 1. Avoir créé une fenêtre enfant d'une fenêtre existante et lui avoir obtenu un gestionnaire valide. 2. A compris que chaque fenêtre de Windows dispose d'une boucle de distribution de messages non-stop. 3. ENTENDU que la meilleure façon d'inclure ma fenêtre dans la boucle de message est l'envoi d'utiliser quelque chose comme le code suivant (pas le mien, mais c'est-ce que je ferais aussi bien):
final LONG_PTR prevWndProc = new LONG_PTR(User32.INSTANCE.GetWindowLong(hwnd, User32.GWL_WNDPROC)); //this is to obtain a pointer to the WNDPROC of the parent window, which we are going to need later
wndProcCallbackListener = new WndProcCallbackListener()
{
public LRESULT callback(HWND hWnd, int uMsg, WPARAM uParam, LPARAM lParam)
{
if (uMsg == WTSAPI.WM_POWERBROADCAST)
{
System.out.println("WM_POWERBROADCAST Event: hWnd="+hwnd+", uMsg="+uMsg+", uParam="+uParam+", lParam="+lParam);
}
else if (uMsg == WTSAPI.WTS_SESSION_CHANGE)
{
System.out.println("WTS_SESSION_CHANGE Event: hWnd="+hwnd+", uMsg="+uMsg+", uParam="+uParam+", lParam="+lParam);
}
//Call the window's actual WndProc so the events get processed.
return User32.INSTANCE.CallWindowProc(prevWndProc, hWnd, uMsg, uParam, lParam);
}
};
//Set the WndProc function to use our callback listener instead of the window's one.
int result = User32.INSTANCE.SetWindowLong(hwnd, User32.GWL_WNDPROC, wndProcCallbackListener);
Cependant, mon problème est quand j'appelle le GetWindowLong() pour la fenêtre parente (ma première ligne de code) Je reçois un 0 pour le pointeur qui a indiqué que la fonction ne s'est pas accomplie avec succès. Un appel ultérieur à GetLastError() et une vérification rapide dans les codes d'erreur me donnent une erreur 'Accès refusé'. Ceci, bien sûr, est logique, puisque j'essaie de mon propre fil pour accéder à l'adresse du WNDPROC d'un autre, mais je me demandais s'il y a moyen (il devrait y avoir, bien sûr) de contourner cela.
Des pointeurs? (jeu de mots)
Mise à jour: si vous utilisez des primitives, votre application ne sera pas portable entre 32 bits et 64 bits JVMs. Pas un gros problème. Je fabrique mes applications JNA uniquement pour les JVM 32 bits, car celles-ci peuvent être installées sur n'importe quelle version de Windows (32 bits et 64 bits) et une JVM 32 bits accède toujours à la version 32 bits des bibliothèques Windows, même lorsque fonctionnant sur Windows 64 bits. – fernacolo