Fensterhandle (hwnd)

flashgod

Mitglied
Hi
könnte mir einer erklären wie ich den Fensterhandle einsetze?

nehmen wir an ich hab irgend ein Programm das ich dann mit Spyxx mir ansehe dann bekomm ich den hwnd.

1. wie kann ich dann damit arbeiten?
2. bleibt der immer gleich? und funktioniert das dann auch auf anderen PC's? bzw. auf dem gleichen nachdem man Formatiert hat.
Denn ich dachte der handle wird dynamisch vergeben und ändert sich mit jedem mal wenn man das Programm aufruft.

3. Wär super wenn mir jemand ein kleines Beispiel zeigen könnte am besten Angefangen mit Spyxx (also erstmal Handle auslesen) das ich genau seh wie es geht

schon mal THX
 

Dario Linsky

Erfahrenes Mitglied
1. wie kann ich dann damit arbeiten?

soweit ich weiss, dient das handle hauptsächlich dazu, dass ein programm eindeutig identifiziert werden kann. innerhalb einer windows-umgebung tauschen einzelne programme untereinander nachrichten aus, indem sie sich gegenseitig informationen zuschicken. damit eine bestimmte information auch dahin kommt, wo sie hinsoll, schickt man sie an das handle einer bestimmten anwendung.
darüber hinaus haben alle fenster, alle steuerelemente und einige andere objekte ihr eigenes handle.

2. bleibt der immer gleich? und funktioniert das dann auch auf anderen PC's? bzw. auf dem gleichen nachdem man Formatiert hat.
Denn ich dachte der handle wird dynamisch vergeben und ändert sich mit jedem mal wenn man das Programm aufruft.

nein. jede programminstanz hat ihr eigenes handle. sonst wäre ein programm nicht mehr eindeutig ansprechbar. das handle wird vom betriebssystem vergeben und sollte nicht ohne einen sinnvollen grund geändert werden. wobei ich aber ziemlich sicher bin, dass es mit vb unmöglich ist, ein handle zu ändern.

3. Wär super wenn mir jemand ein kleines Beispiel zeigen könnte am besten Angefangen mit Spyxx (also erstmal Handle auslesen) das ich genau seh wie es geht

du brauchst system-funktionen, um mit handles zu arbeiten:
Code:
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName as String, ByVal lpWindowName As Long) As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd as Long,ByVal wMsg as Long ByVal wParam as Long ByVal lParam As Long) As Long

mit findwindow suchst du erstmal ein handle zu einem programm, einem fenster oder irgendwas anderem. und mit sendmessage schickst du eine nachricht dahin.
typische nachrichten sind z.b. WM_QUIT, WM_PAINT, WM_USER, etc.
steht alles ausführlich in der msdn.
 

flashgod

Mitglied
thx schon mal

aber wie ist das jetzt auf anderen Rechnern
d.h doch das ich ein von mir geschriebenes Programm in dem ich einen bestimmten handle nutze auch nur auf meinem rechner geht.

das muss doch auch anderst gehen oder?
 

Dario Linsky

Erfahrenes Mitglied
du solltest ein handle nicht statisch einprogrammieren, sondern zur laufzeit dynamisch suchen.
und genau das macht ja die findwindow-funktion: du gibst der funktion einfach den namen des objektes von dem du das handle haben willst und dann kriegst du das handle.
damit zu arbeiten ist sinnvoller, als irgendwo im programm eine zeile wie
Code:
meinHandle = 1234
zu schreiben.

das wird nicht mal auf deinem rechner richtig funktionieren, weil normale windows-programme immer unterschiedliche handles zugewiesen bekommen.
wie das genau funktioniert, kann ich dir aber auch nicht sagen.
 
Zuletzt bearbeitet:

Daniel Toplak

Erfahrenes Mitglied
Also nochmal zu den Handles:

Windows übernimmt völlig automatisch die Vergabe der Handles für die Anwendung und für jedes Fenster. Somit ist, wie asphyxia schon gesagt hat, sichergestellt, daß jedes Fenster und jede Anwendung unabhängig und eindeutig angesprochen werden kann.
Das heißt auch, daß ein und das selbe Fenster, wenn es geschloßen und wieder geöffnet wird bereits eine neues Handle bekommt.
Das heißt dein Programm sollte, wenn es mit diesen Handles arbeitet ebenso dynamisch sein und immmer wenn es auf ein Fenster zugreifen will, das Handle auslesen. Wie das ungefähr funktioniert hat asphyxia auch schon gesagt. Was bei einem Fenster idR. gleich bleibt, ist die Klasse des Fensters und der Titel, denn über diese Infos lässt sich auch mit Hilfe der API-Funktion FindWindow() das Handle des Fensters auslesen.

Was bringt das ganze:
Mit einem Fenster-Handle, kann man Eigenschaften verändern. Das jetzt im einzelnen zu erklären, würde den Rahmen dieses Forums sprengen.
Such doch einfach mal nach API-Programmierung mit VB unter dem Thema Fenster-Handle, da läßt sich bestimmt was finden, solltest du eine konkrete Frage haben, dann kannst du die hier ja wieder posten.

Gruss Homer
 

Dario Linsky

Erfahrenes Mitglied
ein kleines beispiel aus der msdn:

Dieses Beispiel öffnet automatisch das Listenfeld eines Kombinationsfeld-Steuerelements (ComboBox), wenn dieses den Fokus erhält. Sie probieren das Beispiel aus, indem Sie ein neues Formular mit einem Kombinationsfeld-Steuerelement und einem Optionsfeld-Steuerelement (OptionButton) erstellen. (Letzteres wird nur zum Setzen des Fokus benötigt.) Erstellen Sie ein neues Modul mit dem Befehl Modul hinzufügen aus dem Menü Projekt. Fügen Sie die Declare-Anweisung in den Deklarationsabschnitt des neuen Moduls ein, und achten Sie darauf, daß die Anweisung in einer Zeile ohne Zeilen- oder Seitenumbruch steht. Fügen Sie dann die Sub-Prozedur in den Deklarationsabschnitt eines Formulars ein, und drücken Sie F5. Verwenden Sie die TAB-Taste, um den Fokus zum und vom Kombinationsfeld zu bewegen.

Code:
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long

Private Sub Combo1_GotFocus ()
   Const CB_SHOWDROPDOWN = &H14F
   Dim Tmp
   Tmp = SendMessage(Combo1.hWnd, CB_SHOWDROPDOWN, 1, ByVal 0&)
End Sub

[edit]
und noch ein tutorial dazu: http://www.shadoware.de/vb/tutorials/winmessages.html
 
Zuletzt bearbeitet:

flashgod

Mitglied
Mega Thx

Klasse jungs

also einiges war mir schon klar bzw hab ich mir schon gedacht und wurde mir durch euch bestätigt

und das mit dem findwindow hab ich einfach nur verplant *headshot* war wohl noch nicht ganz fitt... naja so ist dann auf jeden fall alles klar

ich hoff nur das ich in nächster zeit überhaupt zeit hab des alles auszuprobiern naja schau mer mal dann seh mer scho

nochmal Thx an euch
 

Neue Beiträge