Solved

How to Kill or Minimized Window Explorer

Posted on 2001-07-02
7
436 Views
Last Modified: 2011-09-20
Hi,

How to kill or Minimized the Running Window Explorer ?
I try to use FindWindow('Explorer', nil) but the handle can't be found. and I try to use FindWindow('Progman', nil) but It trigger to ShutDown the Window.

Thanks,
Cuilin
0
Comment
Question by:cuilin
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
7 Comments
 
LVL 2

Expert Comment

by:Tasomia
ID: 6244320
Try this:


var
  h : HWND;
begin
  h := FindWindow('ExploreWClass',nil);
  if h <> 0 then
    SendMessage(h, WM_CLOSE, 0, 0);
end;
0
 
LVL 17

Expert Comment

by:inthe
ID: 6244711
Hi,
explorer wont usually listen to sendmessage ,better to use postmessage:


first example is to kill the process which is a bit blatent ,something you should really only use if for instance explorer has hung.

procedure CloseIExplorer(h : HWND);
Var pID,hProcess:DWord;
Begin
GetWindowThreadProcessId(h,@pID);
hProcess:=OpenProcess(PROCESS_TERMINATE,TRUE,pID);
TerminateProcess(hProcess,1);
End;

//TO kill process IMEDIATLY
procedure TForm1.Button1Click(Sender: TObject);
Var
 IExplorer : Thandle;
begin
 IExplorer := FindWindow('IEFrame',nil);
 If IExplorer <> 0 Then
CloseIExplorer(IExplorer);
 end;



but these would be better to use for close and minimize:

 //TO CLOSE  nicely
 procedure TForm1.Button1Click(Sender: TObject);
Var
 IExplorer : Thandle;
begin
 IExplorer := FindWindow('IEFrame',nil);
 If IExplorer <> 0 Then
  PostMessage(IExplorer, WM_CLOSE,0,0);
//or PostMessage(IExplorer, WM_QUIT,0,0);
 end;

//TO MINIMIZE
procedure TForm1.Button2Click(Sender: TObject);
Var
 IExplorer : Thandle;
begin
 IExplorer := FindWindow('IEFrame',nil);
 If IExplorer <> 0 Then
 PostMessage(IExplorer,WM_SYSCOMMAND, SC_MINIMIZE,0);
 end;


note WM_CLOSE is better for like notepad so it can ask you to save any changes etc while WM_QUIT just ignores any changes and quits ,cant think of a situation where that would matter for explorer but still wm_close is probably better.
0
 
LVL 17

Expert Comment

by:inthe
ID: 6244721
to get the proper classnames to use with findwindow() you should have a program installed with delphi called winsight.if not get a free program from here called sinfo:

http://lcpx07.lc.ehu.es/JMA/win95.html

it will tell you the classnames etc ..
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 6

Expert Comment

by:Jaymol
ID: 6244942
Or alternativelt, use findwindow with the window title and then use GetClassName with the handle.

(Saves downloading other software, but isn't as easy.)

John.
0
 
LVL 2

Expert Comment

by:FrodoBeggins
ID: 6245522
Are you sure you want to close Explorer? 99% of all windows users use it as Shell. If you close the shell it will be very dificult for the user to work. In fact, if Explorer is the shell, after kiling it it starts up again.
If you are trying to write some kind of Shell, then it should be starterd _as_ a shell. In win 9x it is done by putting "SHELL=c:\my_shell\my_shell.exe" in system.ini. In NT you need to write a string value named "Shell" with value "c:\my_shell\my_shell.exe" in "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Winlogon"
0
 
LVL 3

Expert Comment

by:vladh
ID: 6709150
The following code was tested on Windows2000:

VAR
   ProcessId,                  // Used to store Windows Explorer Process ID number
   hwnd:  longint;             // Used to store WIndows Explorer Window handle
   ProcessHandle: cardinal;    // Used to store WIndows Explorer process handle


begin
//.... your code here....

       hwnd := FindWindow('ExploreWClass',NIL);
       if (hwnd <> 0) then
          ShowMessage('Got Window handle of EXPLORER.EXE: '+IntToStr(hwnd));

       ProcessHandle:=0;
       rCode:= GetWindowThreadProcessId(hwnd,@ProcessId);
       if ProcessId<>0 then
          ShowMessage('Got Process ID of EXPLORER.EXE: '+IntToStr(ProcessId)); //ProcessID is the number (PID) that would show up in Task Manager next to Explorer.exe process

       ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, TRUE, ProcessId);
       IF ProcessHandle <> 0 THEN
           ShowMessage('Got process handle of EXPLORER.EXE: '+IntToStr(ProcessHandle));
      TerminateProcess(ProcessHandle,0);  // Kills Windows Explorer and restart a program specified by "DefaultShell" parameter in System.INI or Registry (see the above comment by FrodoBeggins)
//.... more of your code.....
end;

Please keep in mind, using TerminateProcess is not recommended. There is a better (and harder) way of achieving the same task properly, however I did not do more research becuase this solution suited my needs.
This trick would allow you to almost completely overtake the system while your app runs.

Hope this helps.
Vlad
0
 
LVL 3

Accepted Solution

by:
vladh earned 200 total points
ID: 6709165
inthe,

I beleive we are trying to kill Windows Explorer, not Internet Explorer... The idea is the same, but the class name for FindWindow is different

Regards,
Vlad
0

Featured Post

Free Tool: Postgres Monitoring System

A PHP and Perl based system to collect and display usage statistics from PostgreSQL databases.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…

696 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question