title image


Smiley Re: Manipulation einer Textbox in einem Fremden programm!


Also du brauchs auf alle Fälle zuerst das Windowhandle des Fensters vom anderen Programm.

Dafür gibts die API's FindWindow und GetForegroundWindow



Als nächstes mußt du dir das Windowhandle der Textbox suchen, und zwar mit EnumChildWindows

Diese Funktion ruft für jedes untergeordnete Window des Hauptfensters eine Callbackfunktion auf, in der man dann

prüfen kann, ob man das richtige Window hat.

Wenn man das hat, kann man die Suche abbrechen (Rückgabewert der Funktion = 0), wenn nicht, die Suche fortsetzen

(Rückgabewert der Funktion = 1)



Der API-Begriff Window ist nicht das gleiche wie eine VB-Form! Jedes Control ist ein Window, also auch eine Textbox.



Zum Prüfen, ob man das richtige Window hat, kann man die Funktion GetClassName benutzen. Wenn mehrere Textboxen

vorhanden sind, kann man zusätzlich noch über GetWindowRect die Position (in Pixeln) prüfen.

Das schwierigste an der ganzen Sache ist bis jetzt, herauszufinden, wie der Classname einer Textbox heißt.

Ich habe jetzt diese gefunden:

- Edit

- ThunderTextBox

- ThunderRT6TextBox

aber es kann auch noch andere geben.

Bei einem C/C++ Programm ist der Classname idR Edit, bei einem VB-Prog ThunderTextBox oder ThunderRT6TextBox (Rich-Textbox)



Soweit sogut.

Jetzt gehts erst richtig los. Wenn ich dich richtig verstanden habe, willst du das KeyPress-Event einer Textbox von einem

fremden Programm abfangen. Dazu mußt du die WindowProc (die "Fensterprozedur") überschreiben, dh. du mußt der Textbox deine

Funktion als Ereignisbehandlungsroutine geben.



Zitat aus dem Buch "Hardecore Visual Basic 5.0" von Bruce McKinney:

"Es ist wesentlich einfacher, eine eigene Fensterprozedur zu schreiben und mit

einem Formular oder einem Steuerelement zu verbinden, als mit Messern zu

jonglieren, aber nicht viel sicherer."

Zitat Ende.



Na denn schön Spaß noch.

Du mußt also eine Funkion schreiben, die du dann mit SetWindowLong der Textbox als Ereignisprozedur unterjubelst.

Und das ist die Schwierigkeit, wenn da was nicht paßt (zB bei den Parametern), dann ist ein Bluescreen die Belohnung.



Der Rest sollte dann nicht mehr schwer sein. Einfach das entsprechende Ereigniss (WM_CHAR) herauspicken, den KeyCode

anschauen und wenn es einer ist der dich interessiert, entsprechend darauf reagieren. Alles andere an die originale

WindowProc weiterleiten. Laut meiner Doku haben alle Windows des gleichen Typs auf dem gleichen ParentWindow die

gleiche WindowProc, also muß man da dann vorher noch prüfen, ob das hWnd paßt.





Und später dann (spätestens beim Programmende) deine WindowProc wieder rausnehmen, sonst funktioniert das andere

Programm nicht mehr richtig.





Ich habe nachfolgend ein kurzes Beispiel getippt, wie das ungefähr aussieht, da ist aber nichts Getestet und ich glaube

auch nicht, daß das auf Anhieb richtig funktioniert.

Lies dir auf alle Fälle in der MSDN die Doku zu den API's durch, ich vermute, daß mein Ansatz funktioniert, aber Sicher

bin ich mir da nicht.

Speichere auf alle Fälle vor dem ausprobieren alle offenen Dateien, solche Sachen geben der RESET-Taste die Daseinsberechtigung.



Gedacht ist folgendes vorgehen:

Anderes Programm so starten (zB mit Shell), daß es im Vordergrund (also aktiv ist), SetTextBoxWindowProc aufrufen

Mit den beiden boolschen Variablen kann man dann umschalten, ob die entsprechenden Tasten durchgereicht werden

sollen oder nicht.

Spätestens beim Programmende RestoreOrigWindowProc aufrufen.



Der komplette Code muß! in ein Modul



Viel Spaß dann

Gaga



Anm: alle Keycodes findest du hier: http://spotlight.de/zforen/mvb/m/mvb-1039357889-22574.html







Option Explicit



Private Const GWL_WNDPROC = (-4)

Private Const WM_CHAR = &H102

Private Const VK_BACK = &H8

Private Const VK_DELETE = &H2E

Private Const VK_SPACE = &H20





Private Declare Function GetForegroundWindow Lib "user32" Alias "GetForegroundWindow" () As Long

Private Declare Function EnumChildWindows Lib "user32" Alias "EnumChildWindows" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long





Private lngOrigWinProc As Long

Private hwndTextBox As Long





Public booDelActive As Boolean

Public booSpaceActive As Boolean







Public Sub SetTextBoxWindowProc()

Dim hWndParent As Long



   hWndParent = GetForegroundWindow

   EnumChildWindows(hWndParent,AddressOf(EnumCallBack),0&)



End Sub





Public Function EnumCallBack(ByVal hwnd As Long, ByVal lngParam As Long)

Dim strBuffer As String

Dim lngLen As Long



   strBuffer = Space(255)

   lngLen = Len(strBuffer)

   lngLen = GetClassName(strBuffer,lngLen)

   If lngLen > 0 Then

      strBuffer = Left$(strBuffer,lngLen)

   End If



   If strBuffer = "Edit" Then

      EnumCallBack = 0

      hwndTextBox = hWnd

      lngOrigWinProc = SetWindowLong(hWnd,GWL_WNDPROC,AddressOf(TextboxWindowProc))

   Else

      EnumCallBack = 1

   End If

End Function









Public Function TextboxWindowProc(ByVal hWnd As Long, ByVal lngMsg As Long, ByVal wParam As Long, ByRef lParam As Long)As Long

   If hwndTextBox = hWnd  Then

      If lngMsg = WM_CHAR Then

         Select Case wParam

            Case VK_BACK, VK_DELETE

               '// Backspace Taste <--

               '// Del Taste

               If booDelActive Then

                  TextboxWindowProc = CallWindowProc(lngOrigWinProc,hWnd,lngMsg,wParam,lParam)

               Else

                  TextboxWindowProc = 0

               End If



            Case VK_SPACE

               '// Leerzeichen Taste

               If booSpaceActive Then

                  TextboxWindowProc = CallWindowProc(lngOrigWinProc,hWnd,lngMsg,wParam,lParam)

               Else

                  TextboxWindowProc = 0

               End If



            Case Else

               TextboxWindowProc = CallWindowProc(lngOrigWinProc,hWnd,lngMsg,wParam,lParam)



         End Select

      Else

         TextboxWindowProc = CallWindowProc(lngOrigWinProc,hWnd,lngMsg,wParam,lParam)

      End If

   Else

      TextboxWindowProc = CallWindowProc(lngOrigWinProc,hWnd,lngMsg,wParam,lParam)

   End If

End Function





Public Sub RestoreOrigWindowProc()

   SetWindowLong(hwndTextBox ,GWL_WNDPROC,lngOrigWinProc )

End Sub





 Code eingefügt mit Syntaxhighlighter 1.16






Gruß
Gaga

___________________________________________________________________

Profilösungen für VB6
wenn nicht anders angegeben, sind alle Codebeispiele nicht getestet, nur getippt


geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: