--- ---

In many situations you might like to detect if an application is blocked. For example while automating Internet Explorer, you'd like to know if Internet Explorer has stopped responding.

    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, ComObj, StdCtrls;

    type
      TForm1 = class(TForm)
        btnLaunch: TButton;
        btnCheck: TButton;
        btnKill: TButton;
        procedure btnLaunchClick(Sender: TObject);
        procedure btnCheckClick(Sender: TObject);
        procedure btnKillClick(Sender: TObject);
      public
        modObjIE : OLEVariant;
        modlngWndIE : THandle;
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.btnLaunchClick(Sender: TObject);
    begin
      modObjIE := CreateOleObject('InternetExplorer.Application');
      modObjIE.Visible := true;
      modObjIE.Navigate2('https://www.borland.com');
      modlngWndIE := modObjIE.hwnd;
    end;

    procedure TForm1.btnCheckClick(Sender: TObject);
    var
     dwResult : DWORD;
     lngReturnValue : longint;
    begin
      lngReturnValue := SendMessageTimeout(
        modlngWndIE, WM_NULL, 0, 0,
        SMTO_ABORTIFHUNG OR SMTO_BLOCK, 1000, dwResult
      );
      if lngReturnValue > 0 then
        ShowMessage('Responding')
      else
        ShowMessage('Not Responding');
    end;

    procedure TForm1.btnKillClick(Sender: TObject);
    var
     ProcessID : DWORD;
     Process : THandle;
    begin
      GetWindowThreadProcessId(modlngWndIE, @ProcessID);
      Process := OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID);
      TerminateProcess(Process, 0);
    end;

    end.

Although the code is written for Internet Explorer, the idea can be used for other applications as well:

    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;

    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.Button1Click(Sender: TObject);
    var
      H : THandle;
      lngReturnValue : longint;
      DWResult : DWORD;
    begin
      H := FindWindow('Notepad', nil);
      if H > 0 then
      begin
        lngReturnValue := SendMessageTimeout(
          H, WM_NULL, 0, 0, SMTO_ABORTIFHUNG And SMTO_BLOCK,
          1000, DWResult
        );
        if lngReturnValue > 0 then
          ShowMessage('Responding')
        else
          ShowMessage('Not responding');
      end
      else
        ShowMessage('Application not found');
    end;

    end.