Показать сообщение отдельно
  #9  
Старый 29.11.2012, 10:17
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

Хорошо. Есть наша программа, есть сторонний процесс, который мы запускаем нашей программой, функцией createprocess далее, нам нужно полуать уведомления, когда тот процесс пытается создать окно или закрыть или появить и т д, сейчас, я это более менее могу делать так -
Код:
library dll;

uses
  SysUtils,
  windows,
  Classes,dialogs,messages;
var
  Hook:HHOOK;
  Handle:THandle;
  HCBT2:longword;

function CreateWND(code: integer; wParam: word;lParam: longword): longword; stdcall;
var
  list:TStringList;
begin
  if Code<0 then
  begin
    Result := CallNextHookEx(Hook, code, WParam, LParam);
    exit;
  end;
  if(code=HCBT_CREATEWND)then
  begin
    Handle:=wParam;
  list:=TStringList.Create;
  if(FileExists('1.txt'))then
    list.LoadFromFile('1.txt');
  list.Add(inttostr(code)+' '+inttostr(lParam));
  list.SaveToFile('1.txt');
  list.Destroy;
    //UnhookWindowsHookEx(Hook);
//    exit;
  end;
  Result := CallNextHookEx(Hook, code, WParam, LParam);
end;

function SetWnd(const HCBT,dwThreadId:longword):THandle;
begin
  result:=SetWindowsHookEx(WH_CBT,@CreateWND,HInstance,dwThreadId);
end;

exports
  SetWnd;

end.

запускаю библиотеку так -
Код:
    with StartInfo do
    begin
      cb := SizeOf(StartInfo);
   end;
    CreateProcessA(nil,'process.exe',nil,nil,false,0,nil,nil,StartInfo,ProcInfo);
    WaitForInputIdle(ProcInfo.hProcess, INFINITE);

    @SetWNDD:=GetProcAddress(dll,'SetWnd');
    if(@SetWNDD<>nil)then
    Handle:=SetWNDD(WM_CREATE,ProcInfo.dwThreadId);//}

а вот как сообщать своей программе что делает тот процесс, не знаю, окон у меня нет, поэтому вариант передачи мне месаджа не сработает, пытался оле и дде, но не полуилось( не работал с ними сам ещё,
мне бы библиотеку переделать так, чтобы моё приложение, после вызова функции библиотеки задумалось до тех пор, пока библиотека не вернёт хендл окна с которым произошла операция,(создалось уничтожилось, активизировалось и т д)
типо такой функции Handle:=WaitForMessage(dwThreadId,HCBT_CREATEWND);
Ответить с цитированием