Solved

How to Kill or Minimized Window Explorer

Posted on 2001-07-02
7
424 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
IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
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 Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Suggested Solutions

In this tutorial I will show you how to use the Windows Speech API in Delphi. I will only cover basic functions such as text to speech and controlling the speed of the speech. SAPI Installation First you need to install the SAPI type library, th…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
It is a freely distributed piece of software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages.
Access reports are powerful and flexible. Learn how to create a query and then a grouped report using the wizard. Modify the report design after the wizard is done to make it look better. There will be another video to explain how to put the final p…

708 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

13 Experts available now in Live!

Get 1:1 Help Now