var Hinst :
THandle; WndArr :
array of
THandle; Wnd :
THandle; ...... Procedure KillDelphiWndTimers(const AppCaption:string); var
i : integer; function GetTimerWindows(Handle: HWND; Info: Pointer): BOOL;
stdcall; const sClName
='TPUtilWindow'; var s :
String; begin Result
:= True; SetLength(s,Length(sClName)+1); GetClassName(Handle, PChar(s),Length(s)); SetLength(s,Length(sClName));
:) if
(GetWindowLong(Handle, GWL_HINSTANCE) = Hinst ) and (s=sClName) then begin
SetLength(WndArr,High(WndArr)+2);
WndArr[High(WndArr)]:=Handle; end; end; begin Wnd:=FindWindow(nil,Pchar(AppCaption)); if
Wnd=0 then Exit; hinst:=GetWindowLong(Wnd, GWL_HINSTANCE); EnumWindows(@GetTimerWindows,0); for
i:=0 to High(WndArr) do KillTimer(WndArr[i],1); end;
Программный код на Delphi, который ищет и уничтожает окна таймера для приложения с конкретным заголовком. Вот разбивка кода:
Переменные и константы
Hinst: переменная типа THandle, которая хранит инстанс-указатель основного окна.
WndArr: массив THandle значений, который будет хранить указатели на найденные окна таймера.
Wnd: переменная типа THandle, которая хранит указатель на основное окно (найденное с помощью FindWindow).
sClName: константная строка, содержащая имя класса окон таймера ('TPUtilWindow').
s: переменная типа String, используемая для хранения имени класса, полученного из окна.
AppCaption: параметр типа string, который specifies заголовок приложения, для которого нужно найти и уничтожить окна таймера.
Процедура KillDelphiWndTimers
Эта процедура принимает строку AppCaption в качестве входного параметра и выполняет следующие шаги:
1. Найдет основное окно с указанным заголовком с помощью FindWindow.
2. Если не найдено основное окно, выйдет из процедуры.
3. Получит инстанс-указатель основного окна с помощью GetWindowLong.
4. Вызовет EnumWindows для перечисления всех окон в системе, передавая указатель на функцию GetTimerWindows как callback-функцию.
5. Переберет массив WndArr и уничтожит каждое окно таймера с помощью KillTimer.
Функция GetTimerWindows
Эта функция вызывается EnumWindows для каждого окна, найденного при перечислении окон. Она проверяет, совпадает ли имя класса окна с sClName, и если инстанс-указатель окна равен Hinst. Если обе условия истинны, она добавляет указатель на окно в массив WndArr.
Предложения по улучшению
1. Код предполагает, что окна таймера имеют конкретное имя класса ('TPUtilWindow'). Было бы более надежно использовать регулярное выражение или более конкретный алгоритм для поиска.
2. Код использует GetWindowLong для получения инстанс-указателя основного окна, что может не работать, если основное окно создано с помощью другой техники (например, с помощью третьей-сторонней библиотеки).
3. Код предполагает, что все окна таймера типа TPUtilWindow. Если есть другие типы окон таймера, это подход может не быть эффективным.
4. Код не обрабатывает ошибки или исключения должным образом. Было бы лучше использовать блоки try-except для ловли потенциальных ошибок и предоставления значимых сообщений об ошибках.
В целом, код кажется достигать своей цели поиска и уничтожения окон таймера для конкретного приложения. Однако он может улучшиться в плане надежности, обработки ошибок и гибкости.
Статья 'Удалить таймер в Delphi (kill timer) по заголовку окна' описывает процедуру, которая позволяет найти и остановить таймеры в приложении Delphi, используя заголовок окна.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.