Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как, зная Handle окна программы определить имя EXЕ 
:(
    Опции темы
Kirgston
Дата 11.1.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Всем доброго времени суток! Вот я взял и ДРКБ маленький кусочек кода... но я никак не пойму что должно ити входящим параметром ?

Код

function TForm1.ExeNameByHandle(aWinHandle: HWND): string;
var pProcID: ^DWORD;
begin
GetMem(pProcID, SizeOf(DWORD));
GetWindowThreadProcessId(aWinHandle, pProcID);
result:=GetExeNameByProcID(pProcID^);
FreeMem(pProcID);
end;

function TForm1.GetExeNameByProcID(ProcID: DWord): string;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
Result := '';
while (Integer(ContinueLoop) <> 0) and (Result = '') do
       begin
       if FProcessEntry32.th32ProcessID = ProcID then
               Result := FProcessEntry32.szExeFile;
       ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
       end;
CloseHandle(FSnapshotHandle);
end;

PM MAIL   Вверх
Kirgston
Дата 11.1.2009, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Просто первым параметром входит HWND, если я пишу просто строку с возможным какбы заголовком окна то оно мне орет мол это строка... подскажите пожалуйста что туда надо вводить входным параметром. Зарание большое спасибо!
PM MAIL   Вверх
MetalFan
Дата 11.1.2009, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Handle и строка-заголовок окна несколько разные вещи.
пользуй FindWindow/EnumWindows

Это сообщение отредактировал(а) MetalFan - 11.1.2009, 12:55


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Kirgston
Дата 11.1.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



А как мне можно узнать Хендл ееее чужеродных программ? )))) Ееее Notepad чисто случайно ввел и узнал =) а как например другие?
PM MAIL   Вверх
Kirgston
Дата 11.1.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Просто тут пошли хитрые программки которые изменяют название процесса от названия самого себя. Можна както эээ ну например закрыть программу знаю её Caption? Кепшен главной формы?

Тобиш как можно закрыть эту программу? 
http://rapidshare.com/files/182031259/Catastrophe.rar.html
http://www.sendspace.com/file/v8fux8
http://depositfiles.com/files/affs5xax5
PM MAIL   Вверх
Virtuals
Дата 11.1.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



Цитата(Kirgston @  11.1.2009,  13:37 Найти цитируемый пост)
Можна както эээ ну например закрыть программу знаю её Caption? Кепшен главной формы?


Код

procedure TForm1.Button5Click(Sender: TObject);
var
wn:hwnd;
begin
wn:=FindWindow('IEFrame',nil);
if wn<>0 then
 begin
  postmessage(wn, WM_Close,0,0);
  postmessage(wn, WM_QUIT,0,0);
 end;
end;

прибьет по классу.

если не знаеш класса или не знаеш полноги имени окна, а так оно и бывает, то лучше EnumWindows
ЗЫ а против таких хитрых прог пока лучшее это имя класса(имена классов дочерних окон), для однозначного опознавания врага.
а так же размеры и положения дочерних окон (это_ж кнопки эдиты и другие части).
PM MAIL ICQ   Вверх
Kirgston
Дата 11.1.2009, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Я извиняюсь а не могли бы вы помочь найти имя класса? А то... ну вобщем я же не знаю какое там имя класса =) 

Вот программка которая кабы... ну вы наводите мышкой на нее а она показывает в окне что это за процесс... собственно по Хендлу. А как мне с неё стянуть Хендл? Чтобы записать и потом по нему делать килл таск?
Код


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, tlhelp32, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Timer2: TTimer;
    function ExeNameByHandle(aWinHandle:HWND):string;
    function GetExeNameByProcID(ProcID: DWord): string;
    function KillTask(ExeFileName: string): integer;
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);




  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

function TForm1.ExeNameByHandle(aWinHandle: HWND): string;
var pProcID: ^DWORD;
begin
GetMem(pProcID, SizeOf(DWORD));
GetWindowThreadProcessId(aWinHandle, pProcID);
result:=GetExeNameByProcID(pProcID^);
FreeMem(pProcID);
//Killtask(result);
end;

function TForm1.GetExeNameByProcID(ProcID: DWord): string;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
Result := '';
while (Integer(ContinueLoop) <> 0) and (Result = '') do
       begin
       if FProcessEntry32.th32ProcessID = ProcID then
               Result := FProcessEntry32.szExeFile;
       ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
       end;
CloseHandle(FSnapshotHandle);
end;



function TForm1.KillTask(ExeFileName: string): integer;
const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := 0;

FSnapshotHandle := CreateToolhelp32Snapshot
                    (TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,
                                FProcessEntry32);

while integer(ContinueLoop) <> 0 do
begin
   if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
        UpperCase(ExeFileName))
    or (UpperCase(FProcessEntry32.szExeFile) =
        UpperCase(ExeFileName))) then
     Result := Integer(TerminateProcess(OpenProcess(
                       PROCESS_TERMINATE, BOOL(0),
                       FProcessEntry32.th32ProcessID), 0));
   ContinueLoop := Process32Next(FSnapshotHandle,
                                 FProcessEntry32);
end;

CloseHandle(FSnapshotHandle);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Edit1.Text:=ExeNameByHandle(FindWindow(PChar(Edit2.Text),nil));

end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
Edit1.Text:=ExeNameByHandle(WindowFromPoint(Mouse.CursorPos));
end;


Добавлено через 3 минуты и 41 секунду
Просто если я беру

Добавлено через 4 минуты и 28 секунд
Просто если я беру 
Edit1.Text:=PChar(WindowFromPoint(Mouse.CursorPos));

То оно... ну какбы находит чтото типа Хендла но если навожу на ту программу то вылетает с ошибкой.
PM MAIL   Вверх
Virtuals
Дата 11.1.2009, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



Код

THoldhWnd = class(TObject)
private
public
hWindow: hWnd;
end;

var
  Form1: TForm1;
   WN:HWnd;

function GetWindowExeName(Handle: THandle): String;
var
  PE: TProcessEntry32;
  Snap: THandle;
  ProcessId: cardinal;
begin
Result:='';
  GetWindowThreadProcessId(Handle,@ProcessId);
  Snap:= CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if Snap <> 0 then begin
    if Process32First(Snap, PE) then
      if PE.th32ProcessID = ProcessId then
        Result:= String(PE.szExeFile)
      else while Process32Next(Snap, PE) do
        if PE.th32ProcessID = ProcessId then begin
          Result:= String(PE.szExeFile);
          break;
        end;
    CloseHandle(Snap);
  end;
end;

function GetWindowText(hWnd: HWND; lpString: PChar; nMaxCount: LongInt): LRESULT;stdcall;
var tmr:LRESULT;
begin
   tmr:=SendMessage(hWnd, WM_GETTEXT, WPARAM(nMaxCount),lparam(lpString));
   result:=tmr;
end;


procedure trv(NODE:TTreeNode);
 VAR
  buff: ARRAY [0..127] OF Char;
  buff1: ARRAY [0..127] OF Char;
  HoldhWnd: THoldhWnd;
  Wnd : hWnd;
  ser:string;
begin
 Wnd := GetWindow(Form1.Handle, gw_HWndFirst);
 WHILE Wnd <> 0 DO BEGIN
if (GetClassName(Wnd, buff1, sizeof(buff1))<>0)
   or (GetWindowText(Wnd, buff, sizeof(buff))<>0)
   then
    begin
//GetWindowText(Wnd, buff, sizeof(buff));
ser:='';
//ser:=SysErrorMessage(GetLastError);
//================
   HoldhWnd := THoldhWnd.Create;
   HoldhWnd.hWindow := Wnd;
  if not Form1.CheckBox1.Checked then
   Form1.TreeView1.Items.AddChildObject(Node,GetWindowExeName(Wnd)+' '+StrPas(buff)+' '+ser+' <*> '+StrPas(buff1)+'  ***> Visible '+BoolToStr(IsWindowVisible(Wnd),true), TObject(HoldhWnd))
   else if IsWindowVisible(Wnd)
    then
   Form1.TreeView1.Items.AddChildObject(Node,GetWindowExeName(Wnd)+' '+StrPas(buff)+' '+ser+' <*> '+StrPas(buff1)+'  ***> Visible '+BoolToStr(IsWindowVisible(Wnd),true), TObject(HoldhWnd));
//   ListBox1.Items.AddObject(StrPas(buff)+' <*> '+StrPas(buff1), TObject(HoldhWnd));

//================
    end;

//  Wnd := GetWindow(Wnd, GW_HWNDPREV);
  Wnd := GetWindow(Wnd, gw_hWndNext);
 END;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TreeView1.Items.Clear;
TreeView1.Items.BeginUpdate;
 trv(nil);
TreeView1.Items.EndUpdate;
end;


PM MAIL ICQ   Вверх
THandle
Дата 11.1.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Цитата(Kirgston @  11.1.2009,  14:25 Найти цитируемый пост)
А то... ну вобщем я же не знаю какое там имя класса =) 


Может не очень въехал в тему, но класс окна можно посмотреть с помощью программ типа WinSpy++...
PM   Вверх
Kirgston
Дата 11.1.2009, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Большое спасибо за ВинСпай. Нашел я Хендл... только вот проблемка... я переименовываю программку и Хендл другой... Клас... ТФорм1 =)
PM MAIL   Вверх
THandle
Дата 11.1.2009, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Kirgston, Хэндл(кхм...не я) всегда будет разный. Это ж не постоянное значение...

Ищи окно по классу с помощью FindWindow('ClassName', 'WindowCaption')... 
PM   Вверх
Virtuals
Дата 11.1.2009, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



Kirgston, для кого в предыдущем посте код дал? это как раз твой ВинСпай разбирайся
PM MAIL ICQ   Вверх
Kirgston
Дата 12.1.2009, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Ребят спасибо большое ! Хендл очень помог в Хенделе ! =) Виртуалс тут чуток не туда зашел ))) если брать с ТриВиев то это будет очень долго. А так БОЛЬШОЕ СПАСИБО ВАМ РЕБЯТА!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1062 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.