Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi fremde Combobox mit CBN_SELCHANGE ändern (https://www.delphipraxis.net/148182-fremde-combobox-mit-cbn_selchange-aendern.html)

stoxx 24. Feb 2010 12:12


fremde Combobox mit CBN_SELCHANGE ändern
 
ich hatte versucht, eine fremde Combobox mit Sendmessage und CBN_SELCHANGE zu ändern.
Das funktioniert nur halb, der Eintrag wird geändert, aber das Programm reagiert nicht so, als wenn ein User die Auswahl treffen würde.
Das Programm bekommt also nichts mit, von der Änderung.
Was fehlt da noch?
vielen Dank !

mleyen 23. Nov 2010 12:33

AW: fremde Combobox mit CBN_SELCHANGE ändern
 
Hey,
ich hab das selbe Problem. :cry:
Deshalb: *PUSH*
Delphi-Quellcode:
  ItemIndex := SendMessage(wndCB, CB_FINDSTRING, -1, Integer(@AItemStr[1])); // Funzt
  SendMessage(wndCB, CB_SETCURSEL, ItemIndex, 0); // Funzt

  // myList->GetParent()->SendMessage(WM_COMMAND, MAKEWPARAM(myList->GetDlgCtrlID(), CBN_SELCHANGE), LPARAM( myLyst->GetSafeHwnd() ));
  SendMessage(GetParent(wndCB),
              WM_COMMAND,
              MakeWParam(GetDlgCtrlID(wndCB), CBN_SELCHANGE),
              wndCB); // Wo liegt der Fehler?
Hier funktionierts anscheinend: 1 2

mleyen 23. Nov 2010 13:09

AW: fremde Combobox mit CBN_SELCHANGE ändern
 
Ich habs!
Delphi-Quellcode:
    SendMessage(GetParent(wndCB),
                WM_COMMAND,
                MakeWParam(1000, CBN_SELCHANGE),
                wndCB);
Jetzt müsste man nur noch rausbekommen wozu die 1000 da steht. Aber für meinen einmaligen Fall jetzt auch egal.
Danke für die Aufmerksamkeit. :stupid:

Assarbad 23. Nov 2010 13:11

AW: fremde Combobox mit CBN_SELCHANGE ändern
 
Dann sag doch mal an was das entfernte Programm ist? Und vor allem ob es sich um eine echte Win32-Combobox handelt (kannste mit WinSpy gucken).

CBN_SELCHANGE ist übrigens eine Benachrichtigung, keine Fensternachricht im eigentlichen Sinn. Wie ich sehe haste das schonmal mitbekommen - denn die meisten Benachrichtigungen kommen via MSDN-Library durchsuchenWM_COMMAND.

Die tausend kannste dir selber herausfinden wenn du die Doku liest ;)

mleyen 23. Nov 2010 13:25

AW: fremde Combobox mit CBN_SELCHANGE ändern
 
Zitat:

Zitat von Assarbad (Beitrag 1063504)
Dann sag doch mal an was das entfernte Programm ist?

Eine in Delphi geschriebene Anwendung.

Zitat:

Zitat von Assarbad (Beitrag 1063504)
Und vor allem ob es sich um eine echte Win32-Combobox handelt (kannste mit WinSpy gucken).

Durch den Namen habe ich auf eine von T[Custom]ComboBox abgeleitete Komponente geschlossen.
Deshalb -> selber abgeleitet, Messages abgefangen + analysiert und raus kam die wparamlo magic number.

Bernhard Geyer 23. Nov 2010 14:26

AW: fremde Combobox mit CBN_SELCHANGE ändern
 
Zitat:

Zitat von mleyen (Beitrag 1063508)
Durch den Namen habe ich auf eine von T[Custom]ComboBox abgeleitete Komponente geschlossen.

Es gibt genügend Custom-Comboboxen die nicht auf TCustomComboBox basieren (z.B. ElPack-Controls).

mleyen 23. Nov 2010 15:16

AW: fremde Combobox mit CBN_SELCHANGE ändern
 
ja, ok.
Ich habs jetzt nochmal spaßeshalber getestet und siehe da: es geht nicht mehr mit der 1000.
Es schien zufall gewesen zu sein, dass es eine programmsitzung lang funktioniert hat.

ich hab nochmal kurz drüber geschaut, da fliegen beim Itemchange noch einige CN_COMMAND-Msgs mit WParamHi=1en+9en und lparam=wndCB. wplo kA ...

Assarbad 23. Nov 2010 17:23

AW: fremde Combobox mit CBN_SELCHANGE ändern
 
Zitat:

Zitat von mleyen (Beitrag 1063540)
ja, ok.
Ich habs jetzt nochmal spaßeshalber getestet und siehe da: es geht nicht mehr mit der 1000.

Dann würde mich mal interessieren, ob du zuvor (als es "zufällig") ging nicht zufällig das Fenster welches die CB besitzt fokussiert hattest?!

Fenster arbeiten basierend auf Nachrichten und ein Fenster welches den Fokus hat, bekommt Nachrichten zu sehen die es nicht zu sehen bekommt wenn es nicht den Fokus hat.

mleyen 24. Nov 2010 07:51

AW: fremde Combobox mit CBN_SELCHANGE ändern
 
Zitat:

Zitat von Assarbad (Beitrag 1063559)
Zitat:

Zitat von mleyen (Beitrag 1063540)
ja, ok.
Ich habs jetzt nochmal spaßeshalber getestet und siehe da: es geht nicht mehr mit der 1000.

Dann würde mich mal interessieren, ob du zuvor (als es "zufällig") ging nicht zufällig das Fenster welches die CB besitzt fokussiert hattest?!

Ich hatte immer mein Formular aktiv um die Routine zu betätigen.
Vorhin hab ich es mal in einem Timer senden lassen und währenddessen die CB fokussiert. Nichts.

Aber ich hab jetzt einen Workaround der immer klappt:
Delphi-Quellcode:
      CBContent := getWinText(wndCB);
      if CBContent = cStr1 then
        tmp := SendMessage(wndCB, CB_FINDSTRING, -1, Integer(@cStr2[1]))
      else
        if CBContent = cStr2 then
          tmp := SendMessage(wndCB, CB_FINDSTRING, -1, Integer(@cStr1[1]))
        else
          Exit;
      SendMessage(wndCB, CB_SETCURSEL, tmp, 0);
      PostMessage(wndCB, WM_KEYDOWN, VK_RETURN, MakeLong(0, MapVirtualKey(VK_RETURN, 0)) );
      PostMessage(wndCB, WM_KEYUP, VK_RETURN, Cardinal(MakeLong(0, MapVirtualKey(VK_RETURN, 0))) or $C0000000);
So reichts mir jetzt eigentlich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz