Learn how to a build a cloud-first strategyRegister Now

x
?
Solved

How to Kill or Minimized Window Explorer

Posted on 2001-07-02
7
Medium Priority
?
461 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
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
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
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 800 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

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!

Question has a verified solution.

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

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
Integration Management Part 2
As many of you are aware about Scanpst.exe utility which is owned by Microsoft itself to repair inaccessible or damaged PST files, but the question is do you really think Scanpst.exe is capable to repair all sorts of PST related corruption issues?
Suggested Courses

810 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