Форум программистов, компьютерный форум CyberForum.ru

Delphi и WinAPI

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

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

03.11.2016, 15:07. Просмотров 385. Ответов 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 не ловит.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2016, 15:07     Вывод на экран текстового сообщения при изменении размера любого окна на рабочем столе
Посмотрите здесь:
Распознавание содержимого на Рабочем столе Delphi WinAPI
Delphi WinAPI Получение координат значков на рабочем столе
Вывод чисел из текстового документа Delphi WinAPI
Delphi WinAPI Получить PID всех окон при изменении ключа реестра
Вывод окна на передний план Delphi WinAPI
Delphi WinAPI Вывод нового окна чужой программы
Запрограммировать вывод на печать окна другой программы из delphi Delphi WinAPI
Delphi WinAPI Изменение размеров окна при перетаскивании
Как задать размер стороннего окна при открытии и расположение от формы (справа/слева)? Delphi WinAPI
Delphi WinAPI Как задать имя окна браузера Амиго для поиска дескриптора окна FindWindow
Изменение размера текстового поля при изменении размеров окна JavaScript
При перетаскивании окна на рабочем столе отображается тень окна, как это убрать? Windows

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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