![]() |
Handle/Window wird nich erkannt
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich hab ein Programm welches aus 2 Teilen besteht. Zuerst gibt der Benutzer die .exe Datei an, dann wird der Handle dazu erkannt. Des weiteren klick der Benutzer auf einen Button und das Window zur .exe Datei soll minimiert werden. Doch leider wird immer nur das Programm selber minimiert:
Delphi-Quellcode:
Im DAteianhang habe ich noch ein Bild wie es ausschaut.
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, TLHelp32; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Edit1: TEdit; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; WindowHandle: THandle; h:HWnd; implementation {$R *.DFM} function GetWindowThreadProcessId(hWnd: HWND; var dwProcessId: DWORD): DWORD; stdcall; external 'user32.dll' name 'GetWindowThreadProcessId'; function MyEnumWindowProc(AHandle: THandle; LParam: LongWord): boolean; stdcall; var ProcessID: THandle; begin ProcessID := 0; GetWindowThreadProcessID(AHandle, ProcessID); Result := not (ProcessID = LParam); if not Result then WindowHandle := AHandle; end; function GetWindowHandleByExeName(const AExeName: string): THandle; var SnapShot: THandle; p: TProcessEntry32; ProcessHandle: THandle; begin Result := 0; WindowHandle := 0; ProcessHandle := 0; p.dwSize := SizeOf(p); SnapShot := CreateToolhelp32Snapshot(TH32CS_SnapProcess, 0); try if Process32First(SnapShot, p) then repeat if AnsiLowerCase(AExeName) = AnsiLowerCase(p.szExeFile) then ProcessHandle := p.th32ProcessID; until (ProcessHandle <> 0) or not Process32Next(SnapShot, p); EnumWindows(@MyEnumWindowProc, ProcessHandle); Result := WindowHandle; finally CloseHandle(SnapShot); end; end; procedure TForm1.Button2Click(Sender: TObject); var m_exe:string; begin m_exe := Edit1.Text; GetWindowHandleByExeName(m_exe); end; procedure TForm1.Button1Click(Sender: TObject); begin h:=WindowHandle; postmessage(h,WM_SYSCOMMAND,SC_MINIMIZE,0); // SC_CLOSE = Fenster schließen //(beim Hauptfenster wird die Anwendung beendet) //SC_MINIMIZE = Fenster minimieren //SC_MAXIMIZE = Fenster maximieren //SC_RESTORE = Fenster wiederherstellen end; end. Vielleicht kann mir ja jemand helfen, danke. =) |
Re: Handle/Window wird nich erkannt
Hallo,
Du musst das Ergebnis der Funktion 'GetWindowHandleByExeName' auch irgendetwas zuweisen. In Deinem Fall der globalen Variable 'WindowHandle'.
Delphi-Quellcode:
Du könntest Dir den gesamten ersten Schritt aber auch sparen, indem Du es so machst:
Procedure TForm1.Button2Click(Sender: TObject);
Var m_exe: String; Begin m_exe := Edit1.Text; WindowHandle := GetWindowHandleByExeName(m_exe); End;
Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject);
Begin PostMessage(GetWindowHandleByExeName(Edit1.Text), WM_SYSCOMMAND, SC_MINIMIZE, 0); End; |
Re: Handle/Window wird nich erkannt
Ah ja ist klar, dankeschön.
Aber ich versteh nicht, es funktioniert immer noch nicht, es wird immer das Programm selber geschlossen, aber warum?! //Edit ich muss mich korrigieren, es funktioniert, wenn ich den Button 3ma drücke, aber warum erst dann?! |
Re: Handle/Window wird nich erkannt
Zitat:
Ablauf:
Delphi-Quellcode:
Das ist alles.
m_exe := Edit1.Text; //weist Deiner Variablen 'm_exe' den Namen der Exe zu, der im Edit1 steht
WindowHandle := GetWindowHandleByExeName(m_exe); //Holt das Handle zu m_exe und weist dieses der Variablen 'WindowHandle' zu h := WindowHandle; //Weist den Inhalt der Variablen 'WindowHandle' der Variablen 'h' zu postmessage(h,WM_SYSCOMMAND,SC_MINIMIZE,0); //Sendet eine Fensternachricht an das Fenster mit dem Handle 'h', sich zu minimieren Du könntest aber diese vier Schritte auf eine Zeile Code herunterbrechen und Dir zwei Variablen sparen, wenn Du das Beispiel von oben nimmst. |
Re: Handle/Window wird nich erkannt
ja das ist schon klar.
Ich glaube ichkann einfach nur manche eine .exe Datei nicht problemlos schließen bzw. minimieren. (so z.b. den Firefox) |
Re: Handle/Window wird nich erkannt
ich möchte, den PArameter
SC_MINIMIZE in
Delphi-Quellcode:
gerne per Combobox steuern, sprich ich wähle in der Box aus zwischen Minimize, Close etc. Dies wird im label1.Caption gespeichert, nun geben ich folgendes ein:
PostMessage(GetWindowHandleByExeName(Edit1.Text), WM_SYSCOMMAND,SC_MINIMIZE,0);
Delphi-Quellcode:
Doch leider kommt folgende Fehlermeldung:
PostMessage(GetWindowHandleByExeName(Edit1.Text), WM_SYSCOMMAND, Label1.Caption, 0);
Code:
[Hinweis] Unit1.pas(61): Auf 'GetWindowHandleByExeName' zugewiesener Wert wird niemals benutzt
[Fehler] Unit1.pas(126): Inkompatible Typen: 'Integer' und 'TCaption' Viele liebe grüße :) |
Re: Handle/Window wird nich erkannt
Huhu,
dieses ist eine neue Frage - bitte eröffne dafür einen neuen Beitrag :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz