Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 311

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Я пытаюсь написать программу для мониторинга активированных окон в Windows, но почему то программа обнаружывает только окна приложений находящихся в папке с программой.Помогите разобраться почему и как это исправить.
Вот код программы и dll.

Заранее спасибо

Приложение:
  1.  
  2. unit Unit1;
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, ExtCtrls;
  6.  
  7. type
  8. TForm1 = class(TForm)
  9. Timer1: TTimer;
  10. procedure FormCreate(Sender: TObject);
  11. procedure FormClose(Sender: TObject; var Action:
  12. TCloseAction);
  13. var
  14. Form1: TForm1;
  15. procedure SetHook(Hook : Boolean) stdcall;
  16. external 'SysHook.dll' index 1;
  17.  
  18. {$R *.dfm}
  19. procedure TForm1.FormCreate(Sender: TObject);
  20. begin
  21. SetHook(true);
  22. end;
  23.  
  24. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  25. begin
  26. SetHook(false);
  27. end;
  28.  
  29. end.
  30.  
  31.  
  32. library SysHook;
  33. uses
  34. Windows,
  35. Messages,
  36. SysUtils,Dialogs,
  37.  
  38. var
  39. SysHook1:HHook=0;
  40. Wnd : Hwnd = 0;
  41.  
  42. function SysMsgProc (code : integer; wParam : word;
  43. lParam : longint) : longint; export; stdcall;
  44. var {f:TStringList;} f:TextFile;
  45. Str:String;
  46. windtext, windir: array [0..255] of char;
  47.  
  48. begin
  49. Result:=CallNextHookEx(SysHook1,Code,wParam,LParam);
  50. if code=HCBT_ACTIVATE then
  51. begin
  52. Wnd := wParam;
  53. GetWindowText(Wnd,windtext,255);
  54. Str:=Windtext;
  55. AssignFile(f,'1234.txt');
  56. if not FileExists('1234.txt') then
  57. begin
  58. Rewrite(f);
  59. CloseFile(f);
  60. end;
  61. Append(f);
  62. Writeln(f,Str);
  63. Flush(f);
  64. CloseFile(f) ;
  65. end;
  66. end;
  67.  
  68. function SetHook (Hook:Boolean):Boolean; export;stdcall;
  69.  
  70. begin
  71. if Hook then
  72. begin
  73. SysHook1:=SetWindowsHookEX((WH_CBT),
  74. @SysMsgProc,Hinstance,0);
  75.  
  76. end
  77. else
  78. begin
  79. UnhookWindowsHookEX (SysHook1);
  80. SysHook1:=0;
  81. end;
  82.  
  83. end;
  84.  
  85. {$R *.res}
  86. exports SetHook index 1;
  87.  
  88. begin
  89. end.


Кириченко Сергей Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Кириченко Сергей (статус: 1-ый класс)
Вопрос отправлен: 21 октября 2009, 19:11
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Amidamaru

Здравствуйте, Кириченко!
В самом коде ошибок вроде нету. Но я думаю Вам стоит более явно указывать имя файла. Кстати советую поискать 1234.txt по всему компьютеру. Думаю Вы найдете не один такой файл.
Используйте например 'c:\1234.txt' или в dll создайте строковую переменную для папки для сохранения, и устанавливайте её значение в SetHook в dll.

Ответ отправил: Amidamaru (статус: 4-ый класс)
Время отправки: 21 октября 2009, 19:33
Оценка за ответ: 5

Комментарий к оценке: Спасибо помогло.Действительно нашелся не один файл с именем 1234.txt.

Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 22 октября 2009, 03:06; участников в обсуждении: 2.
Паровоз

Паровоз (статус: 10-ый класс), 21 октября 2009, 20:17 [#1]:

To Кириченко:
А Вы пробовали шевелить окна не из Вашей папки?
Кириченко Сергей

Кириченко Сергей (статус: 1-ый класс), 22 октября 2009, 03:06 [#2]:

Да пробовал.
Спасибо.Все работает правильно, просто из за не явного указания пути к файлу отчета. Отчет создавался в каталоге активированного приложения.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:52
Выполнено за 0.03 сек.