6
votes

Obtenir le HWND pour ma propre application en C

Étant donné que je n'ai pas pu trouver de réponse à Ceci question que j'ai étudié un peu plus loin dans le MSDN et j'ai trouvé Ischild (). Cela pourrait me donner la réponse à cette autre question.

Maintenant, pour utiliser Ischild (), je dois transmettre le HWND de la demande mère que je veux vérifier, dans ce cas ma propre application. Comment puis-je obtenir le HWND de ma propre application?

Je ne connais pas le titre car il change constamment, je ne peux pas utiliser Findwindow ().

merci

EDIT:

Étant donné que ce n'est pas clair, je vais ajouter plus d'informations: Je ne crée pas une fenêtre. Je n'ai pas accès à la création d'une fenêtre. Mon code est un code de code qui est compilé avec n'importe quelle application l'autre programmeur codant et je n'ai aucun accès à la manière dont la fenêtre est créée, le titre ou toute autre information. Alors, comment puis-je obtenir le HWND à la "fenêtre" de l'application que je suis en cours d'exécution?


0 commentaires

8 Réponses :


1
votes

Ne pouvez-vous pas simplement tenir la poignée renvoyée de Creewindow? Sinon, pourquoi pas?


7 commentaires

Parce que je ne crée pas une fenêtre. Mon mon est un module qui est compilé avec le code de quelqu'un d'autre. Par conséquent, je n'ai pas accès à la création de la fenêtre. Maintenant, sachant que, comment puis-je obtenir le HWND pour la fenêtre de l'application où je cours?


Donc, vous n'avez même pas accès à la pompe de message de la fenêtre que je suppose? Ensuite, la seule chose que je peux penser, c'est d'enumwindows, puis d'appeler Getwindowlong à l'aide du paramètre GWL_HInstance et comparez le Hinstance renvoyé à celui retourné de GetModulehandle.


Il est à noter que vous récupérerez tous les HWND associés à votre hinstance ...


J'ai essayé cette approche mais pour quelque chose de si trivial me donne un mal de tête ...


Eh bien, il serait certainement plus facile de mettre une demande à la personne qui écrit le système de fenêtrage pour ajouter une fonction "gethwnd ()" ...


Application de console I.e. A "Hello World" ne crée pas sa propre fenêtre, la fenêtre est donc DOS ou PowerShell qui exécute le Hello.exe, alors comment le Hello.c est-ce que le HWND DOS ou PowerShell est une question.


GetConsoleWindow () Obtient la HWND de l'application de console elle-même, si quelqu'un veut savoir.



0
votes

Ceci est vieux pour moi, mais IIRC vous devriez recevoir le HWND comme paramètre dans la fenêtre Proc. Vous pouvez l'enregistrer dans une variable globale quelque part au début.


1 commentaires

En fait plutôt que de le stocker comme global, vous pouvez le transmettre, ou un pointeur vers une autre structure comme dernier paramètre de Creewindowex. Ce pointeur sera alors disponible pour la procédure Windows lors du message WM_Create.



9
votes

Votre application n'a pas de HWND. La fenêtre fait. Une application peut ne pas avoir de fenêtres ou qu'il peut en avoir beaucoup, il n'y a donc pas de fonction générale pour "obtenir la HWND" de l'application ".

La solution évidente est juste de rester sur la poignée lorsque vous l'obtenez. Lorsque vous créez la fenêtre, une HWND est renvoyée. Stocker cela.


0 commentaires

0
votes

Qu'en est-il de votre nom de classe Windows? Est-ce toujours différent de la création de la fenêtre? Sinon, vous pourriez toujours vous trouver FindWindow ().


0 commentaires

6
votes

Utilisez gettopwindow () et getnextwindow () pour marcher via Windows Z-Commander.

Cependant, ne pensez pas que cela soit nécessaire, mais vous pouvez utiliser GetCurrentProcessid () et GetWindowThreadProcessid (), peut être quelque chose comme la suivante vous aidera: P>

HWND FindMyTopMostWindow()
{
    DWORD dwProcID = GetCurrentProcessId();
    HWND hWnd = GetTopWindow(GetDesktopWindow());
    while(hWnd)
    {
        DWORD dwWndProcID = 0;
        GetWindowThreadProcessId(hWnd, &dwWndProcID);
        if(dwWndProcID == dwProcID)
            return hWnd;            
        hWnd = GetNextWindow(hWnd, GW_HWNDNEXT);
    }
    return NULL;
 }


5 commentaires

Gettopwindow () retourne toujours 0. La même chose avec GetactiveWindow ()


Merci pour la relecture, mais gettopwindow () si appelé avec NULL pourrait retourner la fenêtre principale d'un autre programme (comme je l'ai découvert sur la question précédente) et moi, comme je l'ai dit dans cette question et dans celui-ci, je cherche des informations sur mon propre application et fenêtre.


Donc, vous recherchez la touche la plus haute - puis iTère à travers les fenêtres de la commande Z à l'aide de GetNextWindow et compare chaque fenêtre avec le vôtre. Tout d'abord, c'est ce dont vous avez besoin. Je pensais que ça peut être fait alors ...


Vous comparez getcurrentProcessID () avec ID retourné gewindowthreadProcessid () s'il correspondait - c'est votre fenêtre de processus.


Je ne vois pas comment. Y a-t-il une chance que vous puissiez me montrer? Merci.



1
votes

Comme d'autres ont déjà signalé

  • En général, une application peut avoir zéro ou plusieurs fenêtres de niveau supérieur.
  • Si vous créez la fenêtre vous-même, vous pouvez simplement vous rappeler le HWND quelque part.

    Mais peut-être que votre code est dans une DLL, vous n'avez donc pas créé vous-même la fenêtre de haut niveau. Alors quoi faire?

    Je suggérerais ce qui suit:

    • Utilisez Enumwindows pour énumérer toutes les fenêtres de niveau supérieur.
    • Utilisez getwindowlongptr pour obtenir le hinstance pour chaque fenêtre de niveau supérieur. Comparez cela contre la hinstance de l'application, que vous pouvez obtenir d'utiliser getModulehandle (null) . S'ils sont identiques, vous avez trouvé votre fenêtre principale.

      EDIT: Voici un code. S'avère que vous devez également utiliser iswindowvisible car il semble y avoir une "assistant" invisible " xxx

      alors à l'endroit que vous voulez Pour trouver la fenêtre: xxx

      et après cela, hwndmain doit contenir la poignée de la fenêtre ou null si Aucun n'existe.

      Utiliser Enumwindows est un peu lourd mais est recommandé sur appeler getwindow dans une boucle car, comme indique MSDN NOTES: "Une application qui appelle GetWindow pour effectuer ces risques de tâche étant pris dans une boucle infinie ou référencer une poignée à une fenêtre détruite. "


1 commentaires

Merci. Cela ressemble à beaucoup de code pour obtenir quelque chose de si simple. Avez-vous un échantillon?



1
votes

Probablement votre code est appelé par le code d'application principal, sinon quelle utilisation est-ce? Dans quel cas je ne vois pas pourquoi l'API de votre code ne peut pas inclure une manière de vous informer de la poignée de la fenêtre principale de l'application.


2 commentaires

Parce que n'est pas dans le papier de conception. C'est tout.


Mes pensées exactement. C'est tout ce qui est nécessaire.



1
votes

Vous pouvez injecter une DLL dans un fil qui a appelé user32.dll http://msdn.microsoft.com/en-us/library/ms821625. ASPX


0 commentaires