ExecuteFile mit hWnd Rückgabewert (Fenster-Handle)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Re: ExecuteFile mit hWnd Rückgabewert (Fenster-Handle)

Beitrag von al90 »

ts-soft hat geschrieben:Was willste da Testen? Defaultvariable ist nicht mehr long sondern integer, immer. Du brauchst da nichts testen und ich brauch mir nichts anpassen :)
Naja ich gib ja zu, das da auch ein bischen Faulheit von mir mit dabei ist. :mrgreen:
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Re: ExecuteFile mit hWnd Rückgabewert (Fenster-Handle)

Beitrag von al90 »

So jetzt habe ich mal weiter herumexperimentiert. Dabei ist folgendes herausgekommen:

Code: Alles auswählen

Procedure.i EnumWindowsCallBack(hwnd.i, Handle.i)

  Protected Title$ = Space(1024), ProcessID.i, st.i = #True

  GetWindowText_(hwnd, @Title$, Len(Title$))
  GetWindowThreadProcessId_(hwnd, @ProcessID)

  If Title$<>"" And IsWindowVisible_(hwnd)
    If ProcessID = PeekI(Handle)
      PokeI(Handle, hwnd)
      st = #False
    EndIf
  EndIf

  ProcedureReturn st

EndProcedure

Procedure.i Execute_WindowFile(Filename$, Parameter$, WorkDir$)

  Protected st.i, Handle.i, Check.i

  If FileSize(Filename$) > 0
    st = RunProgram(Filename$, Parameter$, WorkDir$, #PB_Program_Open)
  Else
    ProcedureReturn #Null
  EndIf

  Handle = ProgramID(st) : Check = Handle

  Repeat
    Delay(10)
    EnumWindows_(@EnumWindowsCallBack(), @Handle)
  Until Handle <> Check And IsWindow_(Handle) <> #Null

  CloseProgram(st)
  ProcedureReturn Handle

EndProcedure


file$ = GetEnvironmentVariable("SystemRoot") + "\System32\calc.exe"
hwnd = Execute_WindowFile(file$, "", "")
Delay(500)
CloseWindow_(hwnd)
Delay(500)
OpenIcon_(hwnd)
Delay(1500)
SendMessage_(hwnd, #WM_CLOSE, 0, 0)
Debug "Window-Handle ( hWnd.l ) = " + Str(hwnd)
Die Globals sind dadurch jetzt ganz raus und auf x64 sollte es (Hoffentlich) auch laufen.
Structuren wären dabei auch nicht mehr nötig.
Zuletzt geändert von al90 am 29.03.2010 22:26, insgesamt 2-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: ExecuteFile mit hWnd Rückgabewert (Fenster-Handle)

Beitrag von ts-soft »

al90 hat geschrieben: und auf x64 sollte es (Hoffentlich) auch laufen.
Das tat es vorher auch :mrgreen: , aber darauf sollte man sich nicht verlassen.
Procedure.i haste noch nicht geändert. Ist abgesehen von Procedure.s der einzig
sinnvolle Vartyp für Procedure-Rückgaben! Procedure.b usw. sind irgendwie ballaballa :lol:
Ein einfache Procedure ohne Typ hat dieselbe Wirkung.

Erklärung findeste von jemand anders in diesem Thread, sowie an vielen anderen Stellen hier
im Board.

Gruß
Thomas
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Re: ExecuteFile mit hWnd Rückgabewert (Fenster-Handle)

Beitrag von al90 »

ts-soft hat geschrieben:Das tat es vorher auch :mrgreen: , aber darauf sollte man sich nicht verlassen.
Jeps. Muss ich mich wohl erstmal daran gewöhnen alles mit .i statt .l zu machen. :)
Procedure.i haste noch nicht geändert. Ist abgesehen von Procedure.s der einzig
sinnvolle Vartyp für Procedure-Rückgaben! Procedure.b usw. sind irgendwie ballaballa :lol:
Ein einfache Procedure ohne Typ hat dieselbe Wirkung.
Wurde soeben behoben. Danke für den Hinweis. :allright: Ich bin es so gewohnt immer ein Typ mit zu Definieren,
das mir das garnicht auffiehl. :oops: Ich muss mal meinen Kaffee etwas stärker machen. :lol:
Erklärung findeste von jemand anders in diesem Thread, sowie an vielen anderen Stellen hier im Board.
Klar, stimmt schon. Werde mal versuchen meine stil zu ändern. :wink:
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: ExecuteFile mit hWnd Rückgabewert (Fenster-Handle)

Beitrag von HeX0R »

Es ist auch relativ unpraktisch immer neuere Codes im ganzen Thread zu verteilen.

Jemand, der sich dafür interessiert, wird sich wohl kaum bis zum Ende durchlesen.

Also am besten den Ursprungs-beitrag/code immer aktuell halten.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Re: ExecuteFile mit hWnd Rückgabewert (Fenster-Handle)

Beitrag von Fluid Byte »

+1
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Re: ExecuteFile mit hWnd Rückgabewert (Fenster-Handle)

Beitrag von al90 »

Danke fürs Feedback. :allright:
Code auf Seite 1 angepasst.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: ExecuteFile mit hWnd Rückgabewert (Fenster-Handle)

Beitrag von ts-soft »

Wie wäre es, die Schleife zu entfernen und das Callback nur einmal aufzurufen, so wie es vorgesehen ist? :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Re: ExecuteFile mit hWnd Rückgabewert (Fenster-Handle)

Beitrag von al90 »

ts-soft hat geschrieben:Wie wäre es, die Schleife zu entfernen und das Callback nur einmal aufzurufen, so wie es vorgesehen ist? :wink:
Wollte ich auch zuerst so machen. Aber dabei kann es zu problemen kommen wenn eine Anwendung beim Hochfahren (Autostart)
ausgeführt wird. D.H. die Anwendung kann ggf. noch nicht geöffnet sein, aber der Handle wird von Windows bereits zurückgegeben.
Deshalb auch die Schleife und Delays. :wink:

BTW:
Mir ist gerade aufgefallen das es unter Windows 7 nicht immer ohne "IsWindowVisible_(hwnd)" funktioniert.
Werde es also nochmal anpassen müssen. Grrrr, warum gibts da bloß immer so gravierende unterschiede unter
den OS'es. :?

Nachtrag:

Der Code auf Seite 1 ist nun angepasst. Ausserdem wird das Fenster nach ablauf nun auch geschlossen.
In diesem Beispiel also der Rechner. (Calc.exe)
Antworten