![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Приостановка работы хука [XP]
Боб © (2015-01-18 15:21:00)Нашёл в интернете функцию, позволяющую выводить MessageBox’ы посередине родительской формы, а не экрана. Код работает безотказно.
…
implementation
{$R *.dfm}
var
MyHook: HHOOK;
X, Y: Integer;
function HookProc(const Code, WParam, lParam: DWORD): DWORD; stdcall;
var
This, That: TRect;
begin
if (Code = HCBT_ACTIVATE) then
begin
GetWindowRect(WParam, This);
GetWindowRect(Form1.Handle, That);
X := (That.Left + (That.Right - That.Left) shr 1) -
((This.Right - This.Left) shr 1);
Y := (That.Top + (That.Bottom - That.Top) shr 1) -
((This.Bottom - This.Top) shr 1);
SetWindowPos(WParam, 0, X, Y, 0, 0,
SWP_NOSIZE + SWP_NOZORDER + SWP_NOACTIVATE);
end;
Result := CallNextHookEx(MyHook, Code, WParam, lParam);
end;
…
procedure TForm1.FormCreate(Sender: TObject);
begin
MyHook := SetWindowsHookEx(HCBT_ACTIVATE, @HookProc, HInstance,
GetCurrentThreadID);
end;
Сейчас мне захотелось слегка расширить этот функционал: чтобы, когда часть формы находится за пределами Рабочего стола, то выводить диалоговые окна не посередине уже по центру экрана (стандартно).
Вот моя реализация, которая ни фига не работает.
private
procedure WMExitSizeMove(var Msg: TMessage); message WM_EXITSIZEMOVE;
…
procedure TForm1.WMExitSizeMove(var Msg: TMessage);
begin
if (Form1.Left < 0) or (Form1.Top < 0) or
((Form1.Left + Form1.Width) > Screen.Width) or
((Form1.Top + Form1.Height) > Screen.Height) then
UnhookWindowsHookEx(MyHook)
else
MyHook := SetWindowsHookEx(HCBT_ACTIVATE, @HookProc, HInstance,
GetCurrentThreadID);
inherited;
end;
Как можно приостановить на время работу этого хука?
Smile (2015-01-18 17:44:00) [1]> Нашёл в интернете функцию, позволяющую выводить MessageBox’ы посередине родительской формы
Чем стандартный MessageDlgPos не устраивал, позволяющий выводить в любом месте родительской формы?