Summary Table

Categories Total Count
PII 0
URL 0
DNS 0
EKL 0
IP 0
PORT 0
VsID 0
CF 0
AI 0
VPD 0
PL 0
Other 0

File Content

unit fVA508DispatcherHiddenWindow;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;

type
TfrmVA508JawsDispatcherHiddenWindow = class(TForm)
tmrMain: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure tmrMainTimer(Sender: TObject);
private
FThreads: TStringList;
protected
procedure WndProc(var Msg: TMessage); override;
procedure UpdateThreadList;
public
{ Public declarations }
end;

var
frmVA508JawsDispatcherHiddenWindow: TfrmVA508JawsDispatcherHiddenWindow;

implementation

uses VAUtils, JAWSCommon;

{$R *.dfm}

procedure TfrmVA508JawsDispatcherHiddenWindow.FormCreate(Sender: TObject);
begin
ErrorCheckClassName(Self, DISPATCHER_WINDOW_CLASS);
FThreads := TStringList.Create;
Caption := DISPATCHER_WINDOW_TITLE;
UpdateThreadList;
end;

procedure TfrmVA508JawsDispatcherHiddenWindow.FormDestroy(Sender: TObject);
begin
FThreads.Free;
end;

procedure TfrmVA508JawsDispatcherHiddenWindow.tmrMainTimer(Sender: TObject);
begin
tmrMain.Enabled := FALSE;
UpdateThreadList;
if FThreads.Count < 1 then
Application.Terminate
else
tmrMain.Enabled := TRUE;
end;

function WindowSearchProc(Handle: HWND; var FThreads: TStringList): BOOL; stdcall;
var
cls: string;
test: string;
Thread: DWORD;
ThreadID: string;

begin
cls := GetWindowClassName(Handle);
test := GetWindowTitle(handle);
if (cls = DLL_MAIN_WINDOW_CLASS) then
begin
if (copy(GetWindowTitle(Handle),1,DLL_WINDOW_TITLE_LEN) = DLL_WINDOW_TITLE) then
begin
Thread := GetWindowThreadProcessId(Handle, nil);
ThreadID := FastIntToHex(Thread);
FThreads.AddObject(ThreadID, TObject(Handle))
end;
end;
Result := TRUE;
end;

procedure TfrmVA508JawsDispatcherHiddenWindow.UpdateThreadList;
begin
FThreads.Clear;
EnumWindows(@WindowSearchProc, Integer(@FThreads));
end;

procedure TfrmVA508JawsDispatcherHiddenWindow.WndProc(var Msg: TMessage);
var
CurrentWindow: HWND;
Thread: DWORD;
ThreadID: string;
idx: integer;

procedure FindActiveWindow;
begin
CurrentWindow := GetForegroundWindow();
if IsWindow(CurrentWindow) then
begin
Thread := GetWindowThreadProcessId(CurrentWindow, nil);
ThreadID := FastIntToHex(Thread);
idx := FThreads.IndexOf(ThreadID);
if idx < 0 then
begin
UpdateThreadList;
idx := FThreads.IndexOf(ThreadID);
end;
if idx >= 0 then
begin
SendReturnValue(Handle, Integer(FThreads.Objects[idx]));
end;
end;
end;

begin
if Msg.Msg = MessageID then
begin
Msg.Result := 1;
if assigned(Self) then // JAWS can detect the window before Delphi has finished creating it
begin
try
if Msg.WParam = JAWS_MESSAGE_GET_DLL_WITH_FOCUS then
FindActiveWindow;
except
end;
end;
end;
inherited WndProc(Msg);
end;

end.