Button in Child_Window disablen (Gelöst)

Anfängerfragen zum Programmieren mit PureBasic.
enigma
Beiträge: 52
Registriert: 13.09.2011 13:52

Button in Child_Window disablen (Gelöst)

Beitrag von enigma »

Nachdem ich nun meine externen Fenster disablen kann (dank an RSBasic) habe ich das nächste Problem. Ich möchte in einem Child-Window bestimmte Button disablen. Ich habe Fensterhandle, Buttonhandle und Class. Obwohl ich mehrfach gelesen habe das Button, Textfelder u.s.w. wie Fenster behandelt werden will es mir nicht gelingen mit: EnableWindow_(hWnd,0) die Butten unbenutzbar zu machen. :evil:

Sollte jemand einen Vorschlag haben wird er dankend angenommen.

Gruß
Enigma
Zuletzt geändert von enigma am 17.11.2013 17:27, insgesamt 1-mal geändert.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Button in Child_Window disablen

Beitrag von RSBasic »

Um ein Control innerhalb eines Fensters zu deaktivieren, musst du auch nach solchen ChildWindows suchen.

Wenn du mit Hilfe der Anwendung "WinSpy" auf den Button zeigst, dann siehst du in der Liste eine Baumstruktur. Genau so, wie es angezeigt wird, musst du Schritt für Schritt die Handle-Nummer der Childs ermitteln. Wenn du die Handle-Nummer des Buttons hast, dann kannst du es deaktivieren.

Beispiel:
Wir möchten gerne einen bestimmten Button in der Anwendung "ShoWin" deaktivieren. Schauen wir mal bei WinSpy, was er sagt:
Bild

Wir ermitteln also zuerst das Fenster und anschließend den Button.
Einfaches Beispiel mit FindWindow_() und FindWindowEx_():

Code: Alles auswählen

EnableExplicit

Define Handle

Handle = FindWindow_(#Null, "ShoWin 2.00");1. Schritt
Handle = FindWindowEx_(Handle, #Null, "Button", "Copy");2. Schritt
If Handle
  EnableWindow_(Handle, #False)
  Debug "Wurde deaktiviert"
Else
  Debug "Nicht gefunden"
EndIf
Wenn es mehrere Child-Bereiche gibt, dann müssen wir diese ebenfalls einzeln mit FindWindowEx_() finden, um die Handle-Nummer zu bekommen. Anderes Beispiel mit zwei Childs:

Code: Alles auswählen

EnableExplicit

Define Handle

Handle = FindWindow_("Shell_TrayWnd", 0);1. Schritt
Handle = FindWindowEx_(Handle, 0, "ReBarWindow32", 0);2. Schritt
Handle = FindWindowEx_(Handle, 0, "MSTaskSwWClass", 0);3. Schritt
If Handle
  ;EnableWindow_(Handle, #False)
  Debug "Wurde deaktiviert"
Else
  Debug "Nicht gefunden"
EndIf
Nach dem Ausführen des Codes wurde der Button "Copy" deaktiviert:
Bild

Ich hoffe, du hast es einigermaßen verstanden und kannst selber die einzelnen Childs herausfinden und im Code schrittweise die jeweilige Handle-Nummer ermitteln.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
enigma
Beiträge: 52
Registriert: 13.09.2011 13:52

Re: Button in Child_Window disablen

Beitrag von enigma »

Hallo RSBasic,

wenn es mir nach dieser super Anleitung nicht gelingt ist bei mir sicher Hopfen und Malz verloren. :D

So etwa bin ich aber auch schon vorgegangen. Nach deinem letzten Tip hatte ich mir WinSpy gezogen die Ausgabe sieht allerdings anders aus.
Mit EnumWindows und EnumChildWindows habe ich mir die Handle-Nummern der Fenster und Button rausgesucht und dann versucht mit
EnableWindow_(Handle, 0) den bestimmten Button zu disablen. Bei den Windows klappt das einwandfrei nur die Button weigern sich. :cry:

Ich werde jetzt mal nach deiner Anleitung vorgehen und sehen was passiert.

Gruß
Enigma
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Button in Child_Window disablen

Beitrag von NicTheQuick »

Es könnte ja auch sein, dass der Button zwar kurzzeitig deaktiviert wird, aber die Anwendung selbst ihn automatisch wieder aktiviert. Funktioniert es denn, wenn du den Button mal versteckst?
enigma
Beiträge: 52
Registriert: 13.09.2011 13:52

Re: Button in Child_Window disablen (Gelöst)

Beitrag von enigma »

@NicTheQuick
Danke für deinen Tip.

Es geht, es geht :mrgreen:
Nachdem ich die Child_Windows und Buttons mit Findwindowex wie RSBasic beschrieben hat, und nicht mit EnumChildWindows, ermittelt habe geht es.

Danke an die Helfer und bis zum nächsten Problem.

Gruß
Enigma
Antworten