Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1696to1700
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Frage an die API-Experten

Frage an die API-Experten
07.06.2019 18:19:06
Martin
Hallo in die Runde!
Nachdem ich bereits sehr viel Zeit investiert habe und mein Problem dennoch nicht vollständig lösen konnte, hoffe ich auf Unterstützung eines API-Experten unter euch.
Zielstellung: Aus Excel heraus soll in einer fremden Anwendung (ein Delphi-Programm) der Wert einer ComboBox geändert werden, um einen Filtern in der fremden Anwendung zu entfernen (möglichst ohne dabei die ComboBox aufzuklappen und wieder einzufahren).
Problem: Es ist mir gelungen den Wert der ComboBox erfolgreich umzustellen, jedoch wird das ComboBox-Change-Event innerhalb der fremden Anwendung nicht ausgelöst und der Filter bleibt weiterhin aktiv.
(M)eine „unschöne“ Lösung: Nur wenn die ComboBox aufgeklappt und ein LBUTTONDOWN gesendet wird, _ gelingt es (mir) das ComboBox-Event auszulösen und den Filter erfolgreich zu deaktivieren. Das habe ich mit nachfolgendem Code hinbekommen:

Option Explicit
Private Declare Function FindWindowEx Lib "user32" _
Alias "FindWindowExA" ( _
ByVal hWnd1 As Long, _
ByVal hwnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
'SendKey als API
'Declare Sub keybd_event Lib "user32.dll" ( _
'  ByVal bVk As Byte, _
'  ByVal bScan As Byte, _
'  ByVal dwFlags As Long, _
'  ByVal dwExtraInfo As Long)
'Private Const KEYEVENTF_KEYUP = &H2 'Buchstabe A
'ComboBox
Private Const CB_GETCURSEL = &H147 'CB-Index lesen
Private Const CB_SETCURSEL = &H14E 'CB-Index setzen
Private Const CB_GETCOUNT = &H146 'Anzahl der Einträge
Private Const CB_GETLBTEXT = &H148
Private Const CB_GETLBTEXTLEN = &H149
'Private Const CB_GETITEMDATA = &O150
'Private Const CB_SETITEMDATA = &O151
Private Const CB_SHOWDROPDOWN = &H14F
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
'Public Declare Function GetDlgCtrlID Lib "user32" _
'    (ByVal hWnd As Long) As Long
'Public Const WM_COMMAND = &H111
'Public Const CBN_SELCHANGE = 1
'Public Const CB_SELECTSTRING = &H14D
'Die korrekte ComboBox ermitteln
Public Function GetTTComboBox(hparent As Long) As Long
Dim lngListCount As Long, hWnd As Long
Dim iSelected As Integer
Dim lngTextLen As Long, TmpStr As String
Dim wParam As Long
hWnd = FindWindowEx(hparent, 0&, "TComboBox", vbNullString)
While hWnd  0
'        'WindowsID der ComboBox ermitteln
'        Debug.Print "Cbx-Win ID: " & Hwnd
'        'Anzahl der ComboBox-Einträge
'        lngListCount = SendMessage(Hwnd, CB_GETCOUNT, 0&, 0&)
'        Debug.Print "Einträge: " & lngListCount
lngTextLen = SendMessage(hWnd, CB_GETLBTEXTLEN, 0&, ByVal 0&)
'Debug.Print "Textlänge: " & lngTextLen
TmpStr = Space(lngTextLen)
lngTextLen = SendMessage(hWnd, CB_GETLBTEXT, 0&, ByVal TmpStr)
'Richtige ComboBox ermitteln (Wenn erster Eintrag = "Alle")
If TmpStr = "Alle" Then
'Aktuellen ListIndex der ComboBox ermitteln
iSelected = SendMessage(hWnd, CB_GETCURSEL, 0&, 0&)
'Falls ListIndex noch nicht auf "Alle" gestellt, dann ändern
If Not iSelected = 0 Then
Call SendMessage(hWnd, CB_SHOWDROPDOWN, 1&, 0&) 'ComboBox aufklappen
Call SendMessage(hWnd, CB_SETCURSEL, 0&, 0&)    'Listindex setzen
Call SendMessage(hWnd, WM_LBUTTONDOWN, 0, -1&)  'Button drücken
Call SendMessage(hWnd, WM_LBUTTONUP, 0, -1&)    'Button drücken aufheben
Call SendMessage(hWnd, CB_SHOWDROPDOWN, 0&, 0&) 'ComboBox einklappen
End If
End If
hWnd = FindWindowEx(hparent, hWnd, "TComboBox", vbNullString)
Wend
End Function

Das gleiche Problem hat auch ein anderer User hier beschrieben:
https://www.experts-exchange.com/questions/23961132/Raise-Combobox-change-event-through-an-API.html
Jedoch habe ich die Antwort zur Lösung nicht verstanden und somit ist es mir auch nicht gelungen meinen Code erfolgreich anzupassen.
Könntet ihr mir bitte bei der Anpassung des Codes helfen? Ich verstehe insbesondere die Function "GetDlg" nicht und was als "hChild" übergeben werden soll. Laut WinSpy hat nur die ComboBox selbst eine Handle-ID, die einzelnen Werte jedoch nicht.
Vielleicht noch ein Hinweis: Ich möchte den obersten Eintrag der ComboBox aktivieren (Index = 0), der Wert lautet „Alle“. Ich kann die ComboBox auch manuell per Tastendruck „a“ umstellen, falls jemand einen anderen (besseren?) Lösungsweg empfehlen würde.
Viele Grüße
Martin

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Frage an die API-Experten
09.06.2019 21:19:23
volti
Hallo Martin,
hast Du das Problem schon lösen können?
Leider habe ich mich länger nicht mehr damit beschäftigt, erinner mich aber, dass ich schon öfter das Edit-Control einer Combobox auch direkt gesetzt hatte.
Das funktioniert sogar, auch wenn der User dort nichts eingeben kann und/oder der Text gar nicht in der DropDown-Liste steht.
Hier mal als Anregung; da Du ja den gewünschten Text kennst, versuch es doch mal hiermit:
Const WM_SETTEXT = &HC
hWndCombo = FindWindowEx(hparent, 0&, "TComboBox", vbNullString)
Auswahltext="Alle"
SendMessage hWndCombo, WM_SETTEXT, 255, ByVal Auswahltext
btw:
Diesen Text hier aus dem Link verstehe ich auch nicht so richtig:
wParam = (CBN_SELCHANGE * &H10000) + GetDlgCtrlID(hChild)
SendMessage hChild,CB_SELECTSTRING, -1&, ByVal TempString
SendMessage Wnd,WM_COMMAND, wParam, ByVal hChild"
hChild ist das Handle der Combobox. Mit GetDlgCtrlID wird die ID der Combobox ermittelt und zusammen mit dem Actionparameter der wParam zusammengebastelt.
Die beiden SendMessage sind m.E. irgendwie doppelt....
Vielleicht klappt es ja.
viele Grüße
Karl-Heinz
Anzeige
AW: Frage an die API-Experten
10.06.2019 00:20:52
Martin
Hallo Karl-Heinz,
ich danke dir für deine Antwort. Leider hat dein Vorschlag auch nicht zum Erfolg geführt. Jetzt stehe ich mit API zusätzlich vor einem weiteren Problem: Haken einer multiplen TListBox setzen
Und obwohl ich mich exakt an die Dokumentation im Netz halte, klappt es einfach nicht. Ich kann zwar verschiedene Einträge selektieren, aber kein(e) Häkchen setzen. Inzwischen glaube ich, dass mit API einfach nicht alles gemäß Dokumentation funktioniert.
Ich lasse diesen Beitrag mal offen, vielleicht überrascht mich ja doch noch jemand mit einer tollen Lösungsidee ;-)
Hab trotzdem vielen lieben Dank!
Viele Grüße
Martin
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige