Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Убедиться, что приложение (окно) не отвечает

Delphi , Программа и Интерфейс , Приложения чужие

Убедиться, что приложение (окно) не отвечает

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

// The Documented way 

{ 
  An application can check if a window is responding to messages by 
  sending the WM_NULL message with the SendMessageTimeout function. 

  Um zu uberprufen, ob ein anderes Fenster (Anwendung) noch reagiert, 
  kann man ihr mit der SendMessageTimeout() API eine WM_NULL Nachricht schicken. 
}

 function AppIsResponding(ClassName: string): Boolean;
 const
   { Specifies the duration, in milliseconds, of the time-out period }
   TIMEOUT = 50;
 var
   Res: DWORD;
   h: HWND;
 begin
   h := FindWindow(PChar(ClassName), nil);
   if h <> 0 then
     Result := SendMessageTimeOut(H,
       WM_NULL,
       0,
       0,
       SMTO_NORMAL or SMTO_ABORTIFHUNG,
       TIMEOUT,
       Res) <> 0
   else
     ShowMessage(Format('%s not found!', [ClassName]));
 end;

 procedure TForm1.Button1Click(Sender: TObject);
 begin
   if AppIsResponding('OpusApp') then
     { OpusApp is the Class Name of WINWORD }
     ShowMessage('App. responding');
 end;

Код, предоставленный для проверки, является функцией, которая отправляет WM_NULL-сообщение в окно с конкретным именем класса, используя функцию SendMessageTimeout. Функция SendMessageTimeout отправляет сообщение в окно и возвращает сразу, не ожидая, пока окно обработает сообщение. Если окно не отвечает в течение указанного периода времени, функция вернет 0.

Вот разбивка кода:

  1. Функция AppIsResponding:

    • Она принимает имя класса в качестве параметра.
    • Использует функцию FindWindow для поиска окна с указанным именем класса.
    • Если окно найдено (h <> 0), она отправляет WM_NULL-сообщение, используя SendMessageTimeout.
    • Сообщение отправляется с периодом ожидания, заданным константой TIMEOUT (50 миллисекунд).
    • Функция возвращает True, если окно отвечает на сообщение в течение периода ожидания, иначе False.
    • Если окно не найдено, она отображает ошибку.
  2. Процедура Button1Click:

    • Она вызывает функцию AppIsResponding с именем класса 'OpusApp'.
    • Если приложение отвечает (то есть возвращает True из AppIsResponding), она отображает сообщение, указывающее, что приложение отвечает.

Код использует синтаксис Delphi и предназначен для использования в Windows-приложении. Не ясно, что 'OpusApp' на самом деле означает, но, вероятно, это имя класса окна или приложения, которое вы хотите проверить на отзывчивость.

Некоторые предложения:

  1. Обработка ошибок: Функция AppIsResponding не обрабатывает ошибки должным образом. Например, если окно не найдено, она отображает ошибку, но не возвращает значимого результата (то есть False). Вы можете добавить более robust обработку ошибок.

  2. Значение периода ожидания: Период ожидания установлен в 50 миллисекунд, что может быть слишком коротким или слишком длинным в зависимости от характеристик вашего приложения. Вы можете изменить это значение в соответствии с потребностями вашего приложения.

В целом, важно отметить, что проверка отзывчивости с помощью SendMessageTimeout может иметь неожиданные последствия, если не используется осторожно. Например, если приложение не отвечает, но еще имеет открыто окна, вызов SendMessageTimeout может привести к тому, что эти окна станут orphaned и потенциально приведет к краху системы. Вы должны тщательно рассмотреть, является ли это подходящим для вашего конкретного случая использования.

В статье описывается способ проверки, отвечает ли приложение (окно) на отправленные сообщения, используя функцию SendMessageTimeout и WM_NULL-направление.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Приложения чужие ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 02:04:08/0.0033071041107178/0