Среда, 28.06.2017, 11:54 Приветствую вас Гость | Группа "Гости" 


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: xXxSh@dowxXx, Anton93, Волк-1024 
delfcode » Delphi » Вопросы по Delphi » Хэндл окна
Хэндл окна
MyipsДата: Четверг, 11.08.2011, 15:48 | Сообщение # 1
Частый гость
Зарегистрирован: 13.05.2011
Группа: Пользователи
Сообщений: 26
Статус: Offline
Кто-нибудь напишите, как получить хэндл окна.
 
NeoДата: Четверг, 11.08.2011, 16:31 | Сообщение # 2
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 316
Статус: Offline
Чтобы получить хэндл окна я использую обычно две функции:
1)GetForeGroundWindow; это функция,которая возвращает хэндл активного окна.
2)FindWindow(nil,'Имя окна');а эта функция возвратит хэндл окна по его заголовку.
Вот примерчик:
Code
procedure TForm1.Button1Click(Sender: TObject);
Var
   wnd1,wnd2:hwnd;
   A:array[0..255] of char;
begin
    wnd1:=FindWindow(nil,'Диспетчер задач Windows');
    wnd2:=GetForeGroundWindow;
    //По хэнделу можно определить заголовок окна функцией GetWindowText
    GetWindowText(wnd2,A,255);
    ShowMessage('Заголовок активного окна - '+A);
    //По хэнделу можно заблокировать,закрыть,свернуть и тд.окно.
    EnableWindow(wnd1,false);//true - разблокировать
end;
 
MyipsДата: Четверг, 11.08.2011, 16:50 | Сообщение # 3
Частый гость
Зарегистрирован: 13.05.2011
Группа: Пользователи
Сообщений: 26
Статус: Offline
А как реализовать для кейлоггера?
 
MyipsДата: Четверг, 11.08.2011, 16:51 | Сообщение # 4
Частый гость
Зарегистрирован: 13.05.2011
Группа: Пользователи
Сообщений: 26
Статус: Offline
Просто получаю хэндл только одного активного окна
 
vvova15Дата: Четверг, 11.08.2011, 17:22 | Сообщение # 5
Участник
Зарегистрирован: 24.04.2010
Группа: Пользователи
Сообщений: 83
Статус: Offline
тебе же написали:
function GetForegroundWindow: HWND; stdcall;
вернет дескриптор активного окна



ICQ 185-398
 
MyipsДата: Четверг, 11.08.2011, 19:03 | Сообщение # 6
Частый гость
Зарегистрирован: 13.05.2011
Группа: Пользователи
Сообщений: 26
Статус: Offline
Code


var
   Form1: TForm1;
   sLastCaption: String;
implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
   hWindow: THandle;
   sText: Array [0..255] Of Char;
   f: TextFile;
begin
   hWindow := GetForegroundWindow();
   GetWindowText(hWindow, sText, 256);
   if sLastCaption <> sText then
   begin
     sLastCaption := sText;
     if sText <> '' then
       begin
  AssignFile(f,'C:\log.txt');
  Rewrite(f);
  WriteLn(f, sText);
  CloseFile(f);
   end;
   end;
   end;

end.


Делаю так, но log.txt перезаписывается. Пробывал вместо Rewrite писать Append , но тогда файл log.txt вообще не появляется.
 
vvova15Дата: Четверг, 11.08.2011, 19:29 | Сообщение # 7
Участник
Зарегистрирован: 24.04.2010
Группа: Пользователи
Сообщений: 83
Статус: Offline
append добавляет в файл только в том случае когда последний существует, поэтому делай так:
Code

AssignFile(f,'file.txt');     
if fileexists('file.txt') then append(f) else rewrite(f);



ICQ 185-398
 
MyipsДата: Четверг, 11.08.2011, 20:13 | Сообщение # 8
Частый гость
Зарегистрирован: 13.05.2011
Группа: Пользователи
Сообщений: 26
Статус: Offline
Спасибо!
 
NeoДата: Пятница, 12.08.2011, 06:15 | Сообщение # 9
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 316
Статус: Offline
Думаю,что использовать таймер здесь - не очень хорошая идея.Лучше это делать в цикле.Как я понял,ты хотел
чтобы название окна записывалось в лог один раз,а не до тех пор пока оно не станет неактивным.
И ещё,зачем так часто (в таймере) использовать AssignFile(f,'C:\log.txt'); и CloseFile(f);? Лучше AssignFile использовать только на создание,например,формы,а Closefile на закрытие.
Вот что получилось:
Code
var
      Form1: TForm1;
      f: TextFile;
implementation

{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
      AssignFile(f,'C:\log.txt');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
       hWindow,save: THandle;
       sText: Array [0..255] Of Char;
       sLastCaption:string;
     begin
      While true do
      begin
       hWindow :=GetForegroundWindow;
       GetWindowText(hWindow, sText, 255);
        if not fileExists('C:\log.txt') then
        ReWrite(f) else
        Append(f);
        if (hWindow <> save)and(sText<>'') then
          WriteLn(f,sText);
        save:=GetForegroundWindow;
        Application.ProcessMessages;
        sleep(500);
        Application.ProcessMessages;
      end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
      CloseFile(f);
end;


Сообщение отредактировал Neo - Пятница, 12.08.2011, 06:17
 
MyipsДата: Пятница, 12.08.2011, 20:28 | Сообщение # 10
Частый гость
Зарегистрирован: 13.05.2011
Группа: Пользователи
Сообщений: 26
Статус: Offline
Интересует еще один вопрос, как записывать хэндл только при нажатии мышкой или наведении?
 
gravitasДата: Пятница, 12.08.2011, 20:47 | Сообщение # 11
Авторитетный
Зарегистрирован: 01.05.2010
Группа: Пользователи
Сообщений: 385
Статус: Offline
Функция WindowFromPoint(Mouse.CursorPos);
Пример:
Code
function GetMouseHandle: HWND;
begin
Result := WindowFromPoint(Mouse.CursorPos);
end;

Вызывать по таймеру или как удобнее.


TheDeduction

Для ускорения получения ответов на ваши вопросы рекомендуется подкармливание в виде +'ов в рейтинг :)
 
NeoДата: Пятница, 12.08.2011, 21:16 | Сообщение # 12
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 316
Статус: Offline
Ну при нажатии можно использовать и GetForegroundWindow,т.к по-любому окно станет активным,если по нему щёлкнуть мышкой.Хэндл можно получить и при наведении мышкой на окно,точнее на заголовок окна.Вот примерчик:
Code
procedure TForm1.Timer1Timer(Sender: TObject);//таймер у меня на 1000
Var wnd:hwnd;
     A:array[0..255] of char;
     P:TPoint;
Begin
    GetCursorPos(P);
    wnd:=WindowFromPoint(P);
    GetWindowText(wnd,A,255);
    ShowMessage(A);
end;
 
delfcode » Delphi » Вопросы по Delphi » Хэндл окна
Страница 1 из 11
Поиск:

delfcode.ru © 2008 - 2017 Хостинг от uCoz