|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
|  | 
|  | Опции темы | Поиск в этой теме | Опции просмотра | 
| 
			 
			#1  
			
			
			
			
		 | |||
| 
 | |||
|  Hook SetWindowsPos чужого процесса Есть некий процесс, который периодически делает BringToFront своей дочерней формы. Как это можно отменить? | 
| 
			 
			#2  
			
			
			
			
		 | |||
| 
 | |||
|   Не могу отловить WM_WINDOWPOSCHANGING Код: 
function HookProc(nCode: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  wnd: integer;
begin
 ...
  if (nCode < 0) then
  begin
   
    Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
  end;
  case nCode of
  
    WM_WINDOWPOSCHANGING:  SendMessage(AppWnd, MYWM_WINDOWPOSCHANGING, wParam, 0);
  end;
  //Передаём сообщение дальше по цепочке hook-ов
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
end;
procedure SetHook(wnd: integer); export; stdcall;
begin
 
  HookHandle := SetWindowsHookEx(WH_CALLWNDPROC, @HookProc, HInstance, 0);
  ...
end;
procedure DellHook; export; stdcall;
begin
  
  UnHookWindowsHookEx(HookHandle);
end;
exports
  SetHook, DellHook;Последний раз редактировалось nixon232, 28.01.2019 в 19:32. | 
| 
			 
			#3  
			
			
			
			
		 | |||
| 
 | |||
|   Отвечу немного сам себе. Я зачем-то обрабатываю ncode. вот только в  Код:  
  case pmsg(lparam)^.message of
   
    WM_WINDOWPOSCHANGING:  SendMessage(AppWnd, MYWM_WINDOWPOSCHANGING, wParam, 0);
  end; | 
| 
			 
			#4  
			
			
			
			
		 | |||
| 
 | |||
|   Все еще ничего не проходит. Неужели никто не знает? Код: SAS;
uses
  System.SysUtils,
  System.Classes,
  Winapi.Windows,
  Winapi.Messages;
{$R *.res}
type
  TMessageHookCallback = procedure(const Msg:TMsg) of object;
var
  HookHandle: Cardinal;
  CallbackProc: TMessageHookCallback;
function GetMsgProc(code: integer; wParam: WPARAM; lParam: LPARAM): LResult;
  stdcall;
begin
  if (code = HC_ACTION) and Assigned(CallbackProc) then  // Тут бываем
    if PMsg(lParam)^.message = WM_WINDOWPOSCHANGING then // и тут
      CallbackProc(PMsg(lParam)^); // а тут нет...
  Result := CallNextHookEx(HookHandle, Code, wParam, lParam);
end;
procedure DisableMessageHook;
  stdcall;
begin
  CallbackProc := nil;
  if HookHandle <> 0 then
  begin
    UnhookWindowsHookEx(HookHandle);
    HookHandle := 0;
  end;
end;
procedure EnableMessageHook(ACallbackProc: TMessageHookCallback);
  stdcall;
begin
  DisableMessageHook;
  CallbackProc := ACallbackProc;
  HookHandle := SetWindowsHookEx(WH_GETMESSAGE, @GetMsgProc, hInstance, 0);
  if HookHandle = 0 then
    RaiseLastOsError;
end;
exports
  GetMsgProc,
  EnableMessageHook,
  DisableMessageHook;
end. |