Handle einer Checkbox

Suedwester

Grünschnabel
Hi zusammen!

Ich hab' da ein klitzkleines Problem, und zwar:

System:
Win200, VB 6.0, eine Fremdsoftware, in der mehrere Checkboxen pro Fenster existieren

Problem:
Ich brauche das Handle der Checkboxen des Fremdprogrammes, um mittels BM_GETCHECK etc deren Zustand zu erkennen bzw. zu setzen.

Tools:
Ich hab' mir ein kleines Tool gebaut, welches fuer Textboxen eines Fremdprogrammes Handle, OffSet innerhalb des Fenster, Threads etc liefert, allerdings mittels eines Vergleichsstrings innerhalb der Textboxen.

Fragen:
Kann ich dieses Tool auch für CheckBoxen nutzen = Nach welchem String müsste ich suchen?
Wie kann ich ansonsten (API?) das Handle / OffSet einer zu spezifizierenden Checkbox ermitteln?

Bin für jede Idee dankbar!

Danke schonmal

Suedwester
 
Die Hauptbestandteile sind:

Code:
Public Sub subTasteSenden(ByVal strTastenKuerzel As String)
    keybd_event Asc(strTastenKuerzel), 0&, 0&, 0&
End Sub

Public Sub subSchreiben(ByVal FensterHandle As Long, OffSet As Long, ByVal NeuerText As String)
    SendMessageSTRING GetNextDlgTabItem(GetDlgItem(FensterHandle, OffSet), 0, False), WM_SETTEXT, 256, NeuerText
End Sub

Public Function funTextAuslesen(ByVal Handle As Long) As String
    On Error Resume Next
    Dim lngRet      As Long
    Dim strText     As String
    lngRet = SendMessageByNum(Handle, WM_GETTEXTLENGTH, 0&, 0&) + 1
    strText = String$(lngRet, Chr$(0))
    SendMessageByString Handle, WM_GETTEXT, lngRet, strText
    funTextAuslesen = Left$(strText, InStr(strText, Chr$(0)) - 1)
End Function

Public Function funIstFensterOffen(ByVal strFensterTitel As String) As Long
    funIstFensterOffen = FindWindow(vbNullString, strFensterTitel)
End Function

Public Function funFensterTitelErmitteln(ByVal lngHandle As Long) As String
    Dim lngResult As Long
    Dim strTemp As String
    lngResult = GetWindowTextLength(lngHandle) + 1
    strTemp = Space(lngResult)
    lngResult = GetWindowText(lngHandle, strTemp, lngResult)
    funFensterTitelErmitteln = Left(strTemp, Len(strTemp) - 1)
End Function

Public Function funThreadsListen(ByVal StartHandle As Long, ByVal UebergabeTitel As String) As Long
    Dim lThreadID As Long
    Dim lProcessID As Long
    strUebergabeTitel = UebergabeTitel
    lngSekundaerThread = GetWindowThreadProcessId(StartHandle, lProcessID)
    ' Callback um alle mit den Thread verbundnen Fenster zu bekommen
    EnumThreadWindows lThreadID, AddressOf funThreadsAufzaehlen, 0
End Function

Public Function funThreadsAufzaehlen(ByVal hWnd As Long, ByVal lParam As Long) As Long
    Dim lRet As Long
    Dim sText As String
    sText = Space(255)
    lRet = GetWindowText(hWnd, sText, 255)
    sText = Left$(sText, lRet)
    If sText = strUebergabeTitel Then
        lngAktuellesFenster = hWnd
        lngAktuellerThread = lngSekundaerThread
    End If
    funThreadsAufzaehlen = 1
End Function

OK soweit?
Das keybd_event Asc(strTastenKuerzel), 0&, 0&, 0& ist übrigens besser als Sendkeys (find ich), da synchron ...
Wenn es Hotkeys gibt, schickst Du einfach den HotKey als VB Konstante rueber und hast damit die Taste gedrückt (war doch im Verweis gefragt, oder?)
Die Offsets erhälst Du via funThreadsListen.

Hilft das erstmal?

Bye

Suedwester
 
1. Schritt
Schreib nen Teststring rein, Enumeriere die Textboxen, lies fuer jede davon den Text - ist er gleich, hast Du das (temporäre Handle) Handle.

2. Schritt
Subtahiere von diesem das Handle des Fensters, in dem sich die Textbox befindet, damit hast Du das (statische) Offset der Textbox bezueglich ihres Fensters.

3. Schritt
Dieses Offset legst Du hart ab (Im Quellcode oder ner Ini-Datei)
Dann kannst Du jederzeit mittels isWindowOpen(Titel) das Handle des Fensters ermitteln, den Offset dazuaddieren und hast das aktuelle Handle der Textbox

Thats all ...

Nachteil - zugegebenermassen - Muss für jede Fremdsoftware / Jede Textbox eienzeln durchgezogen werden.
Lösung: Geh weg von VB zu C und mach Dich über die Window-Messages her. Davon hab' ich aber auch nur periphär ne Kennung ...



Bye

Suedwester

PS.: Ich habs inzwischen Übrigens ... ich such bei Checkboxen nach deren Titel. Liefert das gleiche OffSet ... eigentlich auch logisch. Hätte vorher mal ein bisschen Denken sollen ;)
 
Schreib nen Teststring rein, Enumeriere die Textboxen, lies fuer jede davon den Text - ist er gleich, hast Du das (temporäre Handle) Handle.

Ahh ja, aber sry, wie mach ich das? Und das handle ist ja bei jedem neustart, anderem computer anders und ich glaube nicht das die da immer irgentwas eingeben in die textbox und danach suchen, das wäre selbst mir zu blöd.
Ich weis den namen der textbox (Im anderen prog) nützt mir das was?
 
Haaaalllooooo ... Das Offset bleibt KONSTANT, das Handle des Fensters kriegst Du via isWindowOpen, das Handle der Textbox = Handle des Fensters + offset.
Hast Du das OffSet einmal, hast Du's immer ... (sonst wärs ja kein OffSet)
Code:
Dim TextBoxHandle As Long
Dim FensterHandle As Long
' ...
Private Const Offset  As Long = &H....&
' ...
FensterHandle = isWindowOpen(Fenstertitel)
TextBoxHandle = Fensterhandle + Offset
'...

OK? :)
 
Also das stimmt ja mal nicht was du mir da erzählt hast, ich habe 3 mal das programm geschlossen und wieder geöffnet und kuckt mal was da rausgekommen ist:

Fenster: 852924
Text: 1573870

Offset: -720946

-----------------

Fenster: 1246158
Text: 1573822

Offset: -327664

-----------------

Fenster: 1246170
Text: 983984

Offset: 262186

Also ich finde nicht das der "offset" von Text nicht varriiert... Jemand noch ne idee? Oder mach ich was falsch *blink* ?
 
Also bei mir funktioniert es . Allerdings gibt es (manchmal) den lustigen Effekt, daß das OffSet 3 für alle möglichen Dialogs vergeben wird ... *grübel* Du solltest vielleicht mal wirklich bis zum bitteren Ende (sprich über einen Bereich von Handle - x bis Handle + x ) suchen und gleiche OffSets rausiltern
 
Zurück