J'essaie d'écrire une application simple en Java qui communiquera avec un périphérique USB. Le périphérique USB est fait par moi à l'aide d'un microcontrôleur de microchip. La communication est plutôt simple, car le périphérique USB provient de la classe HID, des tableaux de 64 octets sont échangés entre l'ordinateur et l'appareil. Mon programme trouve l'appareil basé sur l'ID de produit et l'ID du fournisseur, peut écrire et lire 64 octets, mais je voudrais maintenant détecter lorsque l'appareil est connecté ou déconnecté de l'ordinateur. P>
Comme je l'ai vu dans un programme C # fourni par Microchip comme exemple d'application, la méthode WNDPROC est remplacée et le message WM_Devicechange est manipulé. Ma question est de savoir comment cela peut-il être fait en Java à l'aide de la JNA, comment puis-je remplacer la méthode WindowProc et gérer les messages, si cela est possible du tout :), mais j'espère que c'est: D P>
Merci d'avance pour les réponses. P>
gabor. p>
4 Réponses :
Vous pouvez créer COM DLL ou OCX de votre programme C # et l'utiliser dans le code Java. Si vous créez une application. p>
Utilisez jacob ou JCOM P>
Ce sera un pont entre l'objet Java et COM. Une autre option est que vous pouvez utiliser JNI pour communiquer avec DLL et OCX. P>
Merci pour la réponse, mais ce n'est pas une autre option, car je ne veux pas vraiment utiliser le code C #, je viens de le mentionner, car je n'en ai pas eu l'idée de la WM_Devicechanger. Par exemple, à travers la classe Kernel32 de la JNA, j'ai eu accès aux méthodes ReadFile et WrardFile pour la lecture et l'écriture sur mon périphérique USB. Merci.
J'ai finalement réussi à résoudre le problème :) et j'ai trouvé la solution suivante:
Prenez d'abord l'interface utilisateur32 de la manière suivante p> puis prolonger le winuser Interface avec le code de message Windows dont vous avez besoin, dans mon cas, il s'agit du wm_devicechange, car je souhaite vérifier i Le périphérique USB était attaché ou détaché de l'ordinateur. P> // Get Handle to current window
HWND hWnd = new HWND();
hWnd.setPointer(Native.getWindowPointer(this));
MyUser32.MYINSTANCE.SetWindowLong(hWnd, MyUser32.GWLP_WNDPROC, listener);
Pas besoin de créer une interface de rappel personnalisé en tant que myListener. JNA fournit l'interface Winuser.Windowrowrocroc.
La solution que j'ai postée précédemment a quelques problèmes, malheureusement: ( p>
Comme il remplace le WNDProc de la fenêtre, les commandes que j'ai ajoutées à mon cadre ne fonctionnaient pas (sans surprise, car aucune peinture, repeindre, etc. Des messages n'ont été manipulés). Ensuite, j'ai réalisé que, au lieu de retourner Après avoir cherché un peu plus sur Internet, j'ai trouvé un excellent article ICI (Modifier: Le lien est mort, Article original peut être trouvé ici ) em>, où une fenêtre cachée statique est créée pour gérer les fenêtres messages. J'ai réussi à le coder pour ma demande et cela fonctionne bien. (Je devais étendre davantage les cours de la JNA car plusieurs fonctions n'étaient pas incluses. Je peux poster mon code si quelqu'un est intéressé.) P>
J'espère que cela aide. P> LRESULT (1) code>, je devrais appeler la fenêtre de fenêtre par défaut (telle qu'elle est utilisée dans les programmes Win32 C ++), mais cela n'a toujours pas résolu le problème, le cadre a toujours été peint. Mais les boutons ne fonctionnaient pas, bien que j'ai pu mettre à jour les étiquettes ... Je devais donc abandonner cette solution aussi. P>
Ne postez pas d'informations supplémentaires comme réponse, modifiez votre question à la place.
Je suis également intéressé par votre code. Pourriez-vous s'il vous plaît le fournir? Tnx!
Je suis également intéressé par votre code. Pourriez-vous s'il vous plaît le fournir? Tnx!
Si vous n'avez pas de manche de fenêtre existante, vous devez d'abord créer votre propre fenêtre. Et lorsque vous créez une nouvelle fenêtre, vous devez également gérer sa pompe à message. Voici un exemple sur la façon dont vous pouvez faire cela. exemple de la JNA Le code pourrait également être très utile.
Pouvez-vous s'il vous plaît poster le code que vous avez utilisé? Merci.
J'ai une question, vous n'avez pas besoin d'utiliser quelque chose comme RegisterDevicénotification ou que vous recherchez simplement des périphériques de ports pour lesquels Windows diffuse automatiquement WM_Devicechange?