Solved

How to Kill or Minimized Window Explorer

Posted on 2001-07-02
7
426 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
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
This Micro Tutorial will give you a basic overview how to record your screen with Microsoft Expression Encoder. This program is still free and open for the public to download. This will be demonstrated using Microsoft Expression Encoder 4.
Video by: Mark
This lesson goes over how to construct ordered and unordered lists and how to create hyperlinks.

911 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

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now