Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi и WinAPI

Войти
Регистрация
Восстановить пароль
 
Apache812
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 29
#1

Вывод на экран текстового сообщения при изменении размера любого окна на рабочем столе - Delphi WinAPI

03.11.2016, 15:07. Просмотров 409. Ответов 0
Метки нет (Все метки)

Доброго времени суток.
Необходимо разработать программу, выводящую на экран текстовое сообщение при изменении размера любого окна на рабочем столе.
Так как ранее с WinApi дела никогда не имел, пришлось осваивать на ходу методом пролетарского тыка. На данный момент имеется вот такой код (смотреть чуть ниже).
При изменении размера окна текстовое сообщение выводится, но с одной оговоркой - только если это окно самого приложения.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function CBTProc(Code: INTEGER; WParam: INTEGER; LParam: INTEGER): INTEGER;  stdcall;
begin
 if Code < 0 then
 begin
   Result := CallNextHookEx(SysHook, Code, WParam, LParam);
   Exit;
   end;
   case Code of
   HCBT_MOVESIZE:
   Begin
      ShowMessage('Размер окна был изменён!');
      Exit;
      end;
   end;
   Result := CallNextHookEx(SysHook, Code, WParam, LParam);
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Wnd := GetForegroundWindow();
  SysHook := SetWindowsHookEx(WH_CBT, @CBTProc, hInstance, GetWindowThreadProcessId(Wnd, NIL));
end;
Добавлено через 9 часов 15 минут
Потом, кровью, бессонницей и матершиной понял, что нужно делать посредством использования глобального хука.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
library Hook;
 
uses
  Windows, Messages;
 
var
  Wnd : HWND = 0;
  SysHook : HHook = 0;
 
function CBTProc(Code : integer; wParam : wParam; lParam : longint) : longint; stdcall;
begin
   if Code < 0 then
   begin
   Result := CallNextHookEx(SysHook, Code, WParam, LParam);
   Exit;
   end;
   case Code of
   HCBT_MOVESIZE:
      Begin
        MessageBox(0, 'HCBT_MOVESIZE', 'CBTHook HCBT_MOVESIZE', MB_ICONASTERISK);
        Exit;
      end;
   HCBT_MINMAX:
      Begin
        MessageBox(0, 'HCBT_MINMAX', 'CBTHook HCBT_MOVESIZE', MB_ICONASTERISK);
        Exit;
      end;
   end;
   Result := CallNextHookEx(SysHook, Code, WParam, LParam);
end;
 
procedure SetHook; StdCall;
begin
  SysHook := SetWindowsHookEx(WH_CBT, @CBTProc, hInstance, 0);
  if SysHook = 0 then
  MessageBox(0,'Error!','ERROR',mb_iconhand);
end;
 
procedure DelHook; StdCall;
begin
  if SysHook <> 0 then
  UnhookWindowsHookEx(SysHook);
end;
 
exports
  SetHook, DelHook;
 
begin
end.
Delphi
1
2
3
4
5
6
7
procedure SetHook; external 'Hook.dll';
procedure DelHook; external 'Hook.dll';
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  SetHook;
end;
Однако проблема осталась - реагирует только на само приложение и (как ни странно) на окно браузера. Все остальные окна в наглую игнорирует.

Добавлено через 6 часов 40 минут
Всё, уже не актуально. Пару часов назад сдал эту лабораторную. Как оказалось, на Windows XP программа работает почти идеально, только окно FireFox не ловит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2016, 15:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вывод на экран текстового сообщения при изменении размера любого окна на рабочем столе (Delphi WinAPI):

Увеличение размера текстового сообщения с интервалом 2 сек. - Delphi
Помогите пожалуйста с решением этого задания! Спасибо. Разработать программу решения задачи, в которой увеличивается размер текстового...

Изменение размера текстового поля при изменении размеров окна - JavaScript
Подскажите, плиз. Как можно сделать так, чтобы при изменении размеров окна броузера изменялся размер текствого поля(т.е. уменьшался,...

При перетаскивании окна на рабочем столе отображается тень окна, как это убрать? - Windows
Помогите разобраться,при перетаскивании окна на рабочем столе отображается тень окна,как это убрать?В свойствах отображение содержимого...

Qml изменение размера Canvas при изменении размера окна - C++ Qt
Может есть какой нибудь способ, чтобы при изменении размера окна (в моем случае window) изменялся размер рисунка Canvas (увеличивался или...

При запуске виндовс 8.1 на рабочем столе темный экран - Windows 8, 8.1
У меня был виндовс 8 профессиональный, поставил виндовс 8.1 и теперь при включении тёмный экран. Нет не пуска не чего, горячие клавиши тоже...

Артефакт при изменении размера окна - Visual C++
Создал панель на основе класса CDockablePane, все бы ничего если бы при изменении его размеров оно не смазывало изображения кнопок на нем и...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2016, 15:07
Привет! Вот еще темы с ответами:

Программы не запускаются на рабочем столе, ко всем ярлыкам на рабочем столе добавляется приставка .Ink - Удаление вирусов
Помогите пожалуйста, использовал рекомендованную вами программу CureIT (нашел 18 вредоносных объектов) и вылечил, но проблема с рабочим...

Перерисовка внутри окна при изменении размера - C++ WinAPI
Подскажите, когда начинаю менять размер окна с помощью мышки - тяну за угол, само окно становится белым цветом. Проблема знакомая но там я...

Изменение Форм при изменении размера окна - C#
Доброй ночи Подскажите пожалуйста как правильно реализовать изменение (положение) форм и элементов внутри окна, когда происходит...

Изменение меню при изменении размера окна - Web-дизайн
Здравствуйте. Видел на одном из сайтов такой прием, когда окно во весь экран меню имеет обычный вид (как на рисунке 1), при уменьшении окна...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru