Alvar sMedlem sedan mars 2000398 inlägg !!1: Om jag har ett program som visar en popup varje gång det startas och jag vill inte att den popupen ska visas, går det att göra ett program som kan döda/dölja det fönstret?
Med programmet ATM så kan man dölja hela fönstret genom att leta upp det i ”windows info”, högerklicka med musen, ta alternativet Show control och sen skicka kommandot SW_HIDE eller SW_SHOWMINNOACTIVE.
Går det att döda/dölja fönstret om man angiver titeln på fönstret? Kan inget om sånt här men om andra program har möjlighet att döda/dölja fönster så borde det ju gå att göra med delphi också :)
--------------------------------------
2: Går det att döda ett program ifrån delphi om man har filnamnet, och hur isf?
------------------
One technique mastered is better than one hundred sampled.
jtMedlem sedan juni 2000350 inlägg 1.
Följande snutt döljer/visar notepad.
var
wnd: HWnd;
begin
wnd := Findwindow('Notepad', Nil);
if wnd <> 0 then
begin
ShowWindow(wnd, SW_HIDE );
Sleep(1000);
ShowWindow(Wnd, SW_SHOW);
end;
end;
2.
Exempel på hur man kan döda ett program.
Du måste lägga till tlHelp32 i uses.
procedure KillExe(Namn: String);
var
hSnapShot: THandle;
EntryProcess: TPROCESSENTRY32;
success: boolean;
h: THandle;
begin
hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hSnapShot = -1 then
exit;
EntryProcess.dwSize := sizeof(EntryProcess);
success := Process32First(hSnapShot, EntryProcess);
while success do
begin
if UpperCase(ExtractFileName(entryProcess.szExeFile)) = UpperCase(Namn) then
begin
h:=OpenProcess(PROCESS_TERMINATE,Longbool(FALSE),entryProcess.th32ProcessID );
TerminateProcess(h,0);
end;
success := Process32Next(hSnapShot, EntryProcess);
end;
CloseHandle(hSnapShot);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
KillExe('notepad.exe');
end;
Har inte kollat koden så noga men den ger kanske lite tips. TerminateProcess är ett ganska rått sätt att avsluta program.
WiNNeMedlem sedan maj 2000192 inlägg Vill man stänga ett annat program snyggare kan man be det snällt genom att skicka ett WM_CLOSE message till det. Först får man hitta rätt windows
handle precis som Notepad exemplet här ovan. Har gjort det här innan och har kod färdig hemma, ska lägga in det här
(blir inte förrän ikväll)
------------------
winne.net
jtMedlem sedan juni 2000350 inlägg Att skicka WM_CLOSE(eller liknande) är ett mycket bättre sätt, funkar inte WM_CLOSE kan man använda TerminateProcess(tex om programmt inte svarar på meddelandet).
Jag har för mig att det som krånglar till frågan är att fåtag i rätt windows handle när man bara har filens namn.
Den lösning jag använt krävde en kombination av EnumWindows, GetWindowThreadProcessID och CreateToolhelp32Snapshot för att lösa detta, har någon en smidigare lösning så är jag intresserad.
WiNNeMedlem sedan maj 2000192 inlägg Här är koden för att söka efter ett fönster och sen döda det programmet.
var
program_to_close:string;
Function TWCallBack2(H : THandle; V : Longint) : longBool; stdcall;
Begin
GetwindowText(H,@WName[0],100);
If strpas(@WName[0])=program_to_close Then
Begin
if h<>null then PostMessage(h, WM_QUIT, 0, 0);
End;
Result := True;
End;
Procedure TForm1.Kill_Other_Program;
Var Dummy,i : Longint;
Begin
Dummy:=0;
If CB_Close.checked Then
Begin
For i:=0 to LB_Programs.Items.Count-1 do
Begin
program_to_close:=LB_Programs.Items.Strings;
EnumWindows(@TWCallBack2,Dummy); //Search through the windows
End;
End;
End;
------------------
winer.nu