Announcement

Collapse
No announcement yet.

Auf ComboBox zugreifen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Auf ComboBox zugreifen

    Hallo Leute!

    Mal vorweg: Ich habe mit der WinAPI noch keine Erfahrung, habe sie mir nur ein bißchen angesehen. Ich bräuchte folgendes:

    Von meinem Programm aus in die ComboBox eines anderen Programmes einen String hineinschreiben, und dann in der ComboBox das Drücken der Taste Enter "simulieren".

    Schöne Grüße
    Christoph

  • #2
    Hallo,

    als allererstes ermittelst du das handle des Fenster der Anwendung mit der ComboBox. Dazu hilft dir die API - Funktion FindWindow.

    HWND fenster = FindWindow(0, "Fenstertitel der Anwendung");

    anschließend kannst du mittels den API Funktionen WindowFromPoint und ChildWindowFromPoint das Handle eines Fensters (wenn von der API gesprochen wird, ist eine Komponente ein Fenster) unter einer bestimmten Position ermitteln.

    Nun kannst du mit Hilfe der API Funktion SendMessage die Botschaft CB_INSERTSTRING oder CB_ADDSTRING an das Handle schicken, welches ein neues Item der ComboBox hinzufügt.

    Infos zu den einzelnen Funktion erhälst du in der BCB Hilfe. Wenn du schwierigkeiten hast, dann schreib noch mal.

    Ich habe den Code jedoch nicht getest. Ich habe es so formuliert, wie ich fortgehen würde. Deshalb keine 100%ige Garantie, das es so funktionieren wird.

    Ciao Philip

    Comment


    • #3
      Hallo

      Ja, hab bitte noch ein paar Fragen dazu ;-)

      also mit
      FindWindow(0,"FENSTERNAME");
      ermittle ich ja das Handle des Fensters.

      Was ist jetzt, wenn Programmfenster immer folgenden Namen hat:
      Grundname (der immer gleich ist) + Zusatz (z.B. ein geöffnetes Dokument). Wie sieht für sowas der Syntax aus?

      Jetzt brauche ich die Koordinate eines beliebigen Punktes der ComboBox, oder? Wie kann ich diese Koordinate herausfinden?
      Eine Frage nur: Ist die Koordinate auch abhängig von der Position des Programmfensters auf dem Desktop, oder ist diese Koordinate immer nur vom Programmfenster abhängig?

      Nun definiere ich diesen Point mit

      typedef struct tagPOINT<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;{<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;LONG x; //x-Koordinate eines Punktes der Combobox<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;LONG y; //y-Koordinate eines Punktes der Combobox<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;}POINT;

      Ist das richtig?

      Wenn ich die WinAPI-Hilfe richtig verstanden habe, ist der Unterschied zwischen WindowFromPoint und ChildWindowFromPoint nur, dass man mit ChildWindowFromPoint auch auf deaktivierte und unsichtbare Fenster (also Komponenten) zugreifen kann.

      Da die besagte ComboBox immer aktiviert und sichbar ist, reicht aber WindowFromPoint.
      Also:
      HWND WindowFromPoint(POINT POINT);

      stimmt das so? in diesem Beispiel ist ja der Structname auch POINT ?

      Wie ich den Befehl CB_ADD_STRING anzuwenden habe, weiß ich leider nicht. Kannst du mir das sagen?

      Sorry, dass ich sooo viele Fragen habe, aber wie gesagt, ich kenn mich mit der WinAPI-Programmierung noch nicht aus und brauche das ganz dringend.

      Danke jetzt schon für deine Hilfe.

      Schöne Grüße
      Christop

      Comment


      • #4
        Hi,

        hier ist ein kleines Beispiel. Natürlich kann ich dieses gerade nicht testen und deswegen könnte einige Fehler drinnen stekcen.

        <pre>

        // In einem Edit deiner Anwedung gibst du einfach den kompletten Titel des gewünschten Fensters an
        HWND hwnd = FindWindow(0, Edit1->Text.c_str());

        // Punkt festelgen
        POINT point;
        point.x = 100;
        point.y = 200;

        HWND hwnd2 = WindowFromPoint(&point);
        // Wenn es sich um eine Struktur handelt, mußt du immer das kaufmänische und verwenden.

        SendMessage(hwnd2, CB_ADDSTRING, 0, "Neuer Eintrag");

        So ähnlich würde der Code aussehen. leider kann ich dir keine Bestätigung geben, das er funktioniert.

        Nun sollst du aber wissen, wie an eine Struktur definiert. In der API Hilfe hast du folgendes gefunden:

        typedef struct tagPOINT
        {
        LONG x; //x-Koordinate eines Punktes der Combobox
        LONG y; //y-Koordinate eines Punktes der Combobox
        }POINT;

        Die oberste Zeile ist erstamls unwichtig. Ganz unten hinter der Klammer steht POINT. Hiermit erzeugst du die Struktur, genau so, wie du eine Variable erzeugst.

        POINT variable;

        Mit Hilfe des . kannst du nun auf die Daten der Struktur zugreifen.

        variable.x
        variable.y

        </pre>

        Ich hoffe dir insgesamt weitergeholfen zu haben.

        Ciao Philip

        Comment


        • #5
          Super, danke. Jetzt sehe ich um einiges klarer *g

          Gibt es denn gute, wenn möglich deutschsprachige Bücher zur Win32API?

          Danke nochmals.

          Schöne Grüße
          Christop

          Comment


          • #6
            Hi,

            es gibt die Büchereihe:

            Das Win32 API Band1 bis Band 4 von Wolfgang Soltendick (C&L)

            Hier werden viele Befehle erleutert und viele auch mit Hilfe eines Beispiels in C++ und Delphi. Am besten versthst du das nutzen der API's wenn du pure API Windows Anwendungen schreibst.

            Da gibt es das Buch:

            Windows Programmierung 5. Auflage von Charles Petzold. Dise Anwedungen kannst du aber glaubig mit dem BCB 4 nicht kompilieren. Aber mit Borland C++.

            Wenn du jedoch dich ein bischen mit der API auskennst, dann hast dun irgendwann den dreh raus. ich war anfangs auch verzwifelt und bekomme die API Funktion so langsam in den Griff. Natürlich gibt es immer noch welche, die ich nicht überwältigen kann. Es ist ahlt übungsache. Sonst kannst du ja im Internet noch nach Beipsielen suchen.

            Ciao Philip

            Comment


            • #7
              Also WindowFromPoint um an das Handle eines Kindfensters zu kommen ist ja recht abenteuerlich.
              Wie wäre es mit FindWindowEx bzw. besser GetDlgItem, wenn die ID des Fensters/Kontrolls bekannt ist?

              <pre>
              var
              hParent, hChild: Cardinal;
              buffer: array[0..1024] of Char;
              begin
              hParent := FindWindow(nil, 'Blablub');
              hChild := GetDlgItem(hParent, 15);
              lstrcpy(buffer, 'Hello world');
              SendMessage(hChild, CB_ÁDDSTRING, 0, Integer(@buffer));
              end;
              </pre>
              Tutorials zur WinAPI bzw. nonVCL gibt es auf meiner Seite: www.luckie-online.d

              Comment

              Working...
              X