Хэндл окна
|
|
Myips | Дата: Четверг, 11.08.2011, 15:48 | Сообщение # 1 |
Частый гость
Зарегистрирован: 13.05.2011
Группа: Пользователи
Сообщений: 26
Статус: Offline
| Кто-нибудь напишите, как получить хэндл окна.
|
|
| |
Neo | Дата: Четверг, 11.08.2011, 16:31 | Сообщение # 2 |
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: 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
Группа: Модераторы
Сообщений: 317
Статус: 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
Группа: Модераторы
Сообщений: 317
Статус: 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;
|
|
| |