Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2011, 15:35   #1
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию Получить хендл и класс окна по названию exe

Собственно сабж. Допустим имеется запущеный ехе файл "explorer.exe" или "LastFM.exe". Как получить класс и хендл?
Lauri вне форума Ответить с цитированием
Старый 01.07.2011, 15:39   #2
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

а если у процесса нет окна или наоборот много окон, так хендл какого окна тебе нужен?
fate вне форума Ответить с цитированием
Старый 01.07.2011, 15:43   #3
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию

Цитата:
Сообщение от fate Посмотреть сообщение
а если у процесса нет окна или наоборот много окон, так хендл какого окна тебе нужен?
Как понять какого?
Lauri вне форума Ответить с цитированием
Старый 01.07.2011, 15:47   #4
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

ну несколько если окон у процесса, у каждого окна свой хендл
fate вне форума Ответить с цитированием
Старый 01.07.2011, 15:50   #5
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию

Цитата:
Сообщение от fate Посмотреть сообщение
ну несколько если окон у процесса, у каждого окна свой хендл
Ну по идее же у процесса есть главное окно по закрытию которого, программа закрывается. Его мне и надо.
InqSoft W.S показал что класс рабочего стола (explorer.exe) - SysListView32, мне нужно орпиделить это программно и получить хэндл.
Lauri вне форума Ответить с цитированием
Старый 01.07.2011, 16:10   #6
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

ну как-то так:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Tlhelp32, StdCtrls;
function EnumProc(Wd: HWnd; Param: Integer): Boolean;stdcall;
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
 // procedure findHandl(id:integer;h:hwnd);
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
EnumWindows(@EnumProc,0);
end;


procedure findHandl(id:integer;h:hwnd);
var
 ssh1, ssh2 : THandle;
 pe32 : TProcessEntry32;
 me32 : TModuleEntry32;
begin

         ssh1 := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
         pe32.dwSize := SizeOf(pe32);
         me32.dwSize := SizeOf(me32);
   if Process32First(ssh1, pe32) then
   repeat
   if UpperCase(pe32.szExeFile)=UpperCase('notepad.exe') then begin
       ssh2 := CreateToolhelp32Snapshot (TH32CS_SNAPMODULE, pe32.th32ProcessID);
       if Module32First(ssh2, me32) then
         if me32.th32ProcessID=id then
            form1.Memo1.lines.add(inttostr(h));
       CloseHandle(ssh2);
    end;//if
   until not Process32Next(ssh1, pe32);
CloseHandle(ssh1);
end;


function EnumProc(Wd: HWnd; Param: Integer): Boolean;stdcall;
var ProcessId:integer;
begin
GetWindowThreadProcessId(wd, @ProcessId);
findHandl(ProcessId,wd);
result:=true;
end;
end.
в мемо выводит хендлы всех окон у этого процесса, нандл главного окна всегда первый.
fate вне форума Ответить с цитированием
Старый 01.07.2011, 16:17   #7
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

тебе же еще и имя класса нужно
вот процедуру переделал
Код:
procedure findHandl(id:integer;h:hwnd);
var
 ssh1, ssh2 : THandle;
 pe32 : TProcessEntry32;
 me32 : TModuleEntry32;
 str:array[0..255]of char;
begin

         ssh1 := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
         pe32.dwSize := SizeOf(pe32);
         me32.dwSize := SizeOf(me32);
   if Process32First(ssh1, pe32) then
   repeat
   if UpperCase(pe32.szExeFile)=UpperCase('notepad.exe') then begin
       ssh2 := CreateToolhelp32Snapshot (TH32CS_SNAPMODULE, pe32.th32ProcessID);
       if Module32First(ssh2, me32) then
         if me32.th32ProcessID=id then begin
         ZeroMemory(@str,sizeof(str));
         GetClassName(h,str,sizeof(str));
            form1.Memo1.lines.add(inttostr(h)+' '+str);
         end;//if
       CloseHandle(ssh2);
    end;//if
   until not Process32Next(ssh1, pe32);
CloseHandle(ssh1);
end;
fate вне форума Ответить с цитированием
Старый 01.07.2011, 16:29   #8
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию

Спасибо, буду пробовать!)

Последний раз редактировалось Lauri; 01.07.2011 в 16:31.
Lauri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить хендл битмапа tuip Общие вопросы C/C++ 1 27.01.2011 15:45
хендл окна сообщения vanektoo Общие вопросы Delphi 3 07.11.2008 22:41
Как зная хендл окна закрыть его SeRhy Общие вопросы Delphi 1 24.08.2008 11:02
Получаю хендл окна виндовского калькулятора Lich Win Api 8 01.07.2008 10:43
Как мне в обработчике хука узнать хендл окна? vitalik007 Win Api 5 16.05.2008 09:34