Solved

Get last window handle?

Posted on 2004-04-14
13
944 Views
Last Modified: 2010-08-05
HI :D

I have a little program that has some shortcuts to windows apps:
I need function to Get the handle of the last program...


Can Somebody Help? please :P
0
Comment
Question by:lnishimura
[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
  • 5
  • 4
  • 3
  • +1
13 Comments
 
LVL 20

Expert Comment

by:Madshi
ID: 10830909
Could you please specify what you mean with "the last program"?
0
 

Author Comment

by:lnishimura
ID: 10830929
All Exe Program Software that creates a window has a handle right?
Ussually an integer... i need to know the handle of the last one...


Got it?


here goes a sample that lists the handles but i cant get the  last one opened


procedure LIstApp;
const
MAX_WINDOW = 16364;
var
 I     : Integer
Caption: Array[0..255]Of Char;
//Lista  : TStringList;
begin
//Lista:=TStringList.Create;
//Lista.Sorted:=True;
For I:=1 To MAX_WINDOW Do
Begin
If((GetWindowText(I,Caption,255)<>0)And (GetWindowLong(I,GWL_EXSTYLE)<>0)And
(GetWindowLong(I,GWL_HWNDPARENT)=0)And (GetWindowLong(I,GWL_HINSTANCE)<>0))Then
If(IsWindowVisible(I))Then begin

 form1.Lista.Items.Add(inttostr(i));
 end;

end;
end;
0
 
LVL 20

Expert Comment

by:Madshi
ID: 10831047
You should use EnumWindows instead of looping through possible window handles.
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!

 

Author Comment

by:lnishimura
ID: 10831096
Any Sample or function i can use?
0
 
LVL 3

Expert Comment

by:MarcG
ID: 10831207

For EnumWindows you need to write a function that is called when a window is found. Like this:

function EnumWindowsProc(hWnd: HWND; lParam: LParam): Bool;
var
  processID, tmpID: DWord;
  tmpCaption: array[0..99] of Char;
  tmp: String;
begin
  Result:= True;
  GetWindowThreadProcessID(hWnd, @processID);
  //*** do not get oneself
  if processID <> GetCurrentProcessID then
  begin
    //*** exclude taskbar, desktop and own tray menu
    if (hWnd <> FindWindow('Shell_TrayWnd', nil)) and
      (hWnd <> FindWindow('Progman', nil)) and
      (hWnd <> Findwindow(nil, 'frmMain.mnuTray')) then
    begin
      if isWindowVisible(hWnd) then
      begin
         { Do something }
      end;
    end;
  end;
end;

Then call EnumWindows like this:

EnumWindows(@EnumWindowsProc, 0);

The EnumWindowsProc above is from a prog of me, so the code inside is just an example.
0
 
LVL 20

Expert Comment

by:Madshi
ID: 10831382
Pleae make that EnumWindowsProc to be "stdcall" !!
0
 
LVL 12

Expert Comment

by:Ivanov_G
ID: 10832340

   You execute these windows Apps from your code.... right ? If so - just when you execute with ShellExecute for example take the result somewhere. It returns Handle ...
0
 

Author Comment

by:lnishimura
ID: 10833144
i Know i can put some thing after ShellExecute...and MarcG is very nice to use too....However
what can i put after shellExecute that returns me the las handle?
0
 
LVL 12

Expert Comment

by:Ivanov_G
ID: 10833317

    I don't understand you .... ShellExecute is function - it has result :

  HINSTANCE ShellExecute(
    HWND hwnd,      // handle to parent window
    LPCTSTR lpOperation,      // pointer to string that specifies operation to perform
    LPCTSTR lpFile,      // pointer to filename or folder name string
    LPCTSTR lpParameters,      // pointer to string that specifies executable-file parameters
    LPCTSTR lpDirectory,      // pointer to string that specifies default directory
    INT nShowCmd       // whether file is shown when opened
  );

Return Values

If the function succeeds, the return value is the instance handle of the application that was run, or the handle of a dynamic data exchange (DDE) server application.
0
 

Author Comment

by:lnishimura
ID: 10833348
hmn
i will test it

let you know...does it returns the Handle of the soft i opened rght?
0
 
LVL 12

Expert Comment

by:Ivanov_G
ID: 10833412

   "instance handle of the application that was run"

   you can find the declaration of HInst type, which is in fact THandle... Enjoy :)
0
 

Author Comment

by:lnishimura
ID: 10833465
dude.... i'm too much stupid to undersntand your answer(still newbie in delphi)...

Can u post some code that really helps me a lot Thanx :D
0
 
LVL 12

Accepted Solution

by:
Ivanov_G earned 500 total points
ID: 10833797

    Sorry, my mistake, MSDN says that with ShellExecute you receive number > 32 if success, else - <= 32. You can not do anything with this.

   The methods you need to get Handle are CreateProcess and OpenProcess. Here is some source you can look at :
   http://www.delphicorner.f9.co.uk/articles/wapi4.htm

   Then use OpenProcess and you will have the Handle.
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

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…
Nobody understands Phishing better than an anti-spam company. That’s why we are providing Phishing Awareness Training to our customers. According to a report by Verizon, only 3% of targeted users report malicious emails to management. With compan…
I've attached the XLSM Excel spreadsheet I used in the video and also text files containing the macros used below. https://filedb.experts-exchange.com/incoming/2017/03_w12/1151775/Permutations.txt https://filedb.experts-exchange.com/incoming/201…

740 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