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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить Handle окна по Handle процесса? 
:(
    Опции темы
CX
Дата 16.3.2004, 01:08 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Надо сделать сервис под XP, который отслеживает запуск определённых программ. В оконной версии всё было просто: (FindWindow...First (c Application.Handle) ...Next). А вот из сервиса уже не к чему цепляться (First). Перепробовал кучу вариантов - получить десктоп, окно под мышкой, константу HWND_BOTTOM (начало Z-последовательности окон), но ничего не помогло. Кто чего думает по этому поводу? Задача ведь совсем не сложная... В конце-концов, может получать Handle окна по Handle процесса?
  Вверх
<Spawn>
Дата 16.3.2004, 05:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Так воспользуйся EnumWindows:

Код
function EnumWndProc(Handle: HWND; lParam: LParam): Boolean; stdcall;
begin
 Result := True; //если нужно продолжить поиск, иначе присваеваешь результату значение False
 if Handle = Form1.Handle then
   ShowMessage(Format('Handle: %d', [Handle]));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 lp: LParam;
begin
 EnumWindows(@EnumWndProc, lp);
end;



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Guest
Дата 16.3.2004, 23:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











<Spawn>

К сожалению из-под сервиса Windows EnumWindows не работает!
Раскомментируйте EnumWindows в моём юните и сервис перестанет работать:

//Файл MyService.dpr
program MyService;

uses
SvcMgr,
service in 'service.pas' {MyServ: TService};

{$R *.RES}

begin
Application.Initialize;
Application.CreateForm(TMyServ, MyServ);
Application.Run;
end.


//Файл service.pas
unit service;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, ExtCtrls, TlHelp32;

type
TMyServ = class(TService)
Timer: TTimer;
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure TimerTimer(Sender: TObject);
private
procedure Control(Msg: String);
{ Private declarations }
public
function GetServiceController: TServiceController; override;
function GetWin(Handle: HWND; lParam: LParam): Boolean; stdcall;
{ Public declarations }
end;

var
MyServ: TMyServ;
Handle: TextFile;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
MyServ.Controller(CtrlCode);
end;

function TMyServ.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;

procedure TMyServ.ServiceStart(Sender: TService; var Started: Boolean);
var lp: LParam;
begin
Control('Service started');
//EnumWindows(@TMyServ.GetWin, lp);
Timer.Enabled:=True;
end;

procedure TMyServ.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
Timer.Enabled:=False;
Control('Service stopped');
end;

procedure TMyServ.TimerTimer(Sender: TObject);
begin
Control('Service executed');
end;

procedure TMyServ.Control(Msg: String);
begin
AssignFile(Handle,'c:\gkill.txt');
if FileExists('c:\gkill.txt') then Append(Handle)
else Rewrite(Handle);
WriteLn(Handle,Msg+' at '+FormatDateTime('dd-mm-yyyy [hh:nn:ss]',SysUtils.Now));
CloseFile(Handle);
end;

//====================================
//получение хендла окна
function TMyServ.GetWin(Handle: HWND; lParam: LParam): Boolean; stdcall;
var buff: ARRAY [0..127] OF Char;
begin
Result := True; //если нужно продолжить поиск, иначе присваеваешь результату значение False
//получаем заголовок окна
GetWindowText(Handle, buff, sizeof(buff));
//пошем заголовок окна в файл
Control('Window found: '+StrPas(buff));
end;

end.
//Файл Service.dfm
object MyServ: TMyServ
OldCreateOrder = False
DisplayName = 'My Service'
OnStart = ServiceStart
OnStop = ServiceStop
Left = 378
Top = 201
Height = 150
Width = 215
object Timer: TTimer
Enabled = False
Interval = 2000
OnTimer = TimerTimer
Left = 8
Top = 8
end
end

Может будут ещё какие-мысли (определение окон из-под сервиса Windows)? Я уже честно говоря сдался sad.gif
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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