SDI OnCopyData



  • So jetzt Frage ich nochmals nach auch auf die Gefahr hin dass ich verspotet werde:

    Was muss ich den bei ::GetClassInfo(); angeben. Habe das übergeben was da steht.
    Der Name wird aber im Spy++ nicht angezeigt. Muss doch an ::GetClassInfo liegen beim Rest kann man ja nicht viel falsch machen.



  • Also jetzt habe ich mal eine neue Applikation angelegt. SDI diesesmal mit Doc/View. Ohne sonst igrendwas am Code zu machen, habe ich wie beschrieben in Initinstance der App Klasse die folgenden Zeilen hinzugefügt:

    WNDCLASS wc;
    GetClassInfo(AfxGetInstanceHandle(), "#32770", &wc)
    wc.lpszClassName = "MyPrivateClassName";
    AfxRegisterClass(&wc)
    

    Leider kein Erfolg. Wenn ich mit Spy++ kontroliere heißt meine Klasse nach wie vor: "Afx:00400000:b:00010013:00000006:00C109C7".

    Also viel anders kann man da ja nicht machen.


  • Mod

    Du gehst IMHO nicht vor wie dokumentiert. Wo ist Deine PreCreateWindow Funktion?



  • Wieso kommst du darauf?

    Also auf der genannten Seite sind 3 Möglichkeiten beschrieben wie man vorzugehen hat.

    1. In der Ressourcenansicht
    2. Dirket in der RC Datei
    3. Programmatisch in der InitInstance() der App Klasse.

    so 1 und 2 kommen ja nicht in Frage.

    So also habe ich genau das getan was für Punkt 3 in Frage kommt. Habe die Zeilen implementiert.

    PreCreateWindow Funktion? Also von der ist auf der Seite kein Wort erwähnt.


  • Mod

    Mein Fehler. Tut mir leid!
    Ich hatte irgendwie im Kopf, der TN070 (zweiter Link) enthält diese Infos.
    Scheinbar ist diese Info doch ncith so weit verbreitet im Netz wie ich dachte.

    Ok schrittweise:
    1. PreCrateWindow überschrieben.
    2. Default aufrufen.
    3. GetClassInfo ausführen
    4. Eigenenen Klassennamen setzen
    5. Klasse registrieren
    6. Diesen Klassennamen in die Precreatestruct einsetzen
    Fertig



  • Hallo Martin.

    Super vielen Dank. Jetzt funktioniert es. Aber in der TN070 ist aber auch nicht wirklich beschrieben was man da genau machen muss. Also du musst zugeben dass es schwierig ist hier ne genaue Anleitung zu finden.

    So nun aber nochmal zu meinem eigentlichen Problem. Die Nachricht wird auch jetzt nur empfangen wenn der Dialog nicht ausgeblendet ist. Nun weiß ich aber warum. Weiß nur noch nicht wie lösen.

    Also habe die Klasse CSystemTray verwendet von Codeproject. Das Problem daran ist dann wenn die Applikation in den Tray verschoben wird, diese einem anderen Fenster untergeordnet wird. Ohne Titel und Klassenname Afx:00400000:0.

    Dies ist aber nur der Fall wenn es eine SDI Applikation ist. Verwende ich eine Dialogbasierte Anwendung wird sie nicht untergeordnet.


  • Mod

    Was sagt Spy++?
    Wie sieht der Messagemap Eintrag aus?



  • Was sagt Spy++?

    Äm genau das was ich geschrieben habe.

    Also wenn mein Fenster eingeblendet ist es auf oberer Ebene direkt unter Desktop. Wenn es ausgeblendet ist wird es untergeordnet unter dem besagten Fenster. Spy++ zeigt an dass die WM_COPYDATA empfangen wird. Aber nur wenn die Applikation nicht im Tray ist.

    Was wolltest du noch wissen bzw. was muss ich noch anschauen im Spy++?

    Wie sieht der Messagemap Eintrag aus?

    Von WM_COPYDATA?

    BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
       ...
       ON_WM_COPYDATA()
       ...
    END_MESSAGE_MAP()
    

    Irgendwie habe ich das Gefühl du willst was anderes wissen. 😕



  • Also nochmal.

    Wenn ich mit Spy++ nach dem Fenster mit dem gewählten Klassennamen suche, findet er das Fenster egal ob untergeordnet oder nicht.

    Wenn ich programmatisch mit FindWindow("MyClassName",NULL) suche, ist das Hwnd dass ich erhalte NULL, wenn das Fenster untergeordnet ist.

    Arbeitet FindWindow nicht gleich wie der Spy++?


  • Mod

    FindWindow findet nur "Top-Level" Fenster!

    Ich verstehe Deinen Konstrukt nicht. Ist es kein Top-Level-Fenster?

    Bei mir arbeitet WM_COPYDATA mit jedem Fenstertyp, ob versteckt oder nicht.



  • FindWindow findet nur "Top-Level" Fenster!

    Ja habe ich in der Zwischenzeit auch gelesen 🙂

    Ich verstehe Deinen Konstrukt nicht. Ist es kein Top-Level-Fenster?

    Nein sage ich doch die ganze Zeit wenn das Fenster ausgeblendet ist, wird es einem anderen Fenster untergeordnet. Das ist halt so in der CSystemTray von Codeproject realisiert.

    Bei mir arbeitet WM_COPYDATA mit jedem Fenstertyp, ob versteckt oder nicht.

    Ja WM_COPYDATA funktioniert. Ich finde halt nur das HWND nicht.

    Wenn Spy++ doch das Fenster findet nur anhand des Klassennamen sei es Top-Level oder nicht. Dann muss doch das auch programmatisch gehen, oder nicht?



  • Warum suchst du dann nicht mit FindWindowEx? Müsste doch dein gesuchtes Window finden.



  • Warum suchst du dann nicht mit FindWindowEx?

    Und was gebe ich als hwndParent an, wenn ich das nicht kenne?

    Es muss doch auch möglich sein nur mit dem Klassennamen zu suchen. Wie bereits gesagt kann der Spy++ das doch auch.



  • Also habe das nun anders gelöst. Habe die Klasse CSystem so bearbeitet dass das Fenster nun nur noch ausgeblendet wird. Also nicht mehr zu einem child eines anderen Fensters wird.

    Interessieren würde es mich nach wie vor ob man nicht ein Fenster suchen kann nur anhand des Klassennamens sei es Top-Level oder nicht.


  • Mod

    Ich benutze auch den FindWindow Trick und er findet brav meine Top-Level Fentser. Deslab benutze ich auch immer angepasste Fensterklassen für diese Top-Level Fenster.



  • Das beantwortet nun aber nicht meine Frage. Wie findet man "nicht Top-Level" Windows nur mit dem Klassennamen?


  • Mod

    Manifester schrieb:

    Das beantwortet nun aber nicht meine Frage. Wie findet man "nicht Top-Level" Windows nur mit dem Klassennamen?

    Nur mit den entsprechenden Enum... Funktionen. Ist also lahm und umständlich.

    Evtl. ist es weitaus besser ein anderes IPC zu verwenden.



  • Nur mit den entsprechenden Enum... Funktionen. Ist also lahm und umständlich.

    Das macht also Spy++ auch so?

    Evtl. ist es weitaus besser ein anderes IPC zu verwenden.

    Ok. Äm was gibts da noch? 🕶


  • Mod

    DDE, COM, Sockets, Named pipes, Memorymapped Files, Shared Memory...



  • Gut Danke!

    Nur damit meine letzte Frage dann auch beantwortet ist: Wie macht Spy++ das? Auch mit EnumWindows?


Anmelden zum Antworten