FindWindow und SendMessage?



  • Du müsstest eben wissen, das wievielte Child es ist, oder evtl. hilft dir GetDlgCtrlID weiter 🙂



  • Na ja, mit Spy sehe ich welche SteuerelementID welches EditFeld hat. Ich weis nur nicht, wie ich das programmieren soll, damit ich global auf ein gefundenes Element zugreifen kann. Meine HWND-Variable die aus FindWindow entsteht, ist global angelegt, um damit in verschiedenen Befehlen darauf zugreifen zu können - Local wäre es ja am Ende des Befehls weg.
    Also brauche ich eine Möglichkeit irgendwie meine Variable auf das neue Fenster zu verweisen. Die Frage ist nur wie?
    Das mit GetDlgCtrlID habe ich schon versucht, aber irgendwie kommt immer Programmabsturz. Die Nummer vom ChildWindow - mmmh - kann ich die mit Spy irgendwie selbst ausrechnen?



  • Also eine Zugriffsverletzung solltest du bei GetDlgCtrlID eigentlich nicht bekommen 🙄 - wie hast du es denn versucht?



  • BOOL CALLBACK EnumChildWindowsProc(HWND hwndChild, LPARAM lParam)
    {
       int id = GetDlgCtrlID(hwndChild);
    
       switch(id)
       {
          case ID_EDIT_1:
             DoSomething();
             break;
          .
          .
          .
       }
    
       return FALSE;
    }
    
    EnumChildWindows(hwnd,         // Das Parent der Edits
                     EnumChildWindowsProc,  // Die Callback-Funktion
                     0);           // Kein Parameter
    

    So geht das mit EnumChildWindows(). Aber wenn du die Control IDs eh hast, dann reicht doch auch ein GetDlgItem(), oder?



  • Danke für deine Antwort. Das probiere ich heute Abend aus. Da ich von meinem Programm aus, in einem externen Fenster "rumklicken" möchte, kenne ich die Bezeichnung (z.B.:ID_EDIT_1) nicht. Denke ich richtig, wenn ich das gegen die SteuerungsID von Spy ersetze?

    Ich habe schon mit GetDlgItem() experimentiert, nur bekomme ich nie den Zeiger auf das richtige Element -> meist Absturz (oder weis net wie es richtig geht 😮 ).



  • Du musst GetDlgItem einfach das Hanlde des Parent-Windows und die ID (hierbei musst du eben beachten, dass die Steuerelement-ID in Hex-Form gegeben ist)



  • Ich glaub jetzt hab ich es:

    HWND    oldwin; //Variable ist das Hauptfenster und schon vorher festgelegt
    HWND    findwin;
    int     dlgid;
    CString hextxt="4756";
    CString changetxt="Beispiel";
    
    sscanf(hextxt,"%x",&dlgid);
    findwin=::GetDlgItem(oldwin,dlgid);
    wnd.Attach(findwin);
    wnd.SetFocus();
    if (changetxt!="") {
      wnd.SendMessage(WM_SETTEXT,0,(LPARAM)(LPCSTR) changetxt);
    }
    wnd.Detach();
    

    Hier wird nun das Editfeld mit der SteuerID (0x4756) gesucht und ein Zeiger darauf gesetzt. Danach wird gleich der Fokus ein das Feld geschickt. Sollte bei changetxt etwas stehen, dann wird dieser Text eingefügt. 😉


Anmelden zum Antworten