...
private
{ Private declarations }
InstHandle : Word;
WndHandle : hWnd;
NextGame : Word;
function EnumFunc(H : HWnd) : Word;
PROCEDURE WMQUERYOPEN(VAR Msg : TWMQueryOpen);
message WM_QUERYOPEN;
...
interface
USES
ShellApi, IniFiles;
{$R
*.DFM}
procedure TForm1.FormCreate(Sender:
TObject);
VAR H, SubH : hMenu;
NewGameID : Word;
FreeCellPath : String;
begin
WITH TIniFile.Create(ChangeFileExt(Application.ExeName, '.INI')) DO
try
FreeCellPath := ReadString('FreeCell',
'Path',
'C:\WIN32APP\FREECELL\FREECELL.EXE') +
#0;
NextGame := ReadInteger('FreeCell', 'NextGame', 1);
finally
Free;
end;
InstHandle := ShellExecute(Handle, NIL, @FreeCellPath[1],
NIL, NIL, SW_SHOW);
WndHandle := 0;
IF InstHandle >= 32
THEN
EnumWindows(@TForm1.EnumFunc, LongInt(Self));
IF WndHandle <> 0
THEN
BEGIN
{Вычисляем ID пункта меню "Select
Game"}
H := GetMenu(WndHandle);
SubH := GetSubMenu(H, 0);
NewGameID := GetMenuItemID(SubH, 1);
Winprocs.SetFocus(WndHandle);
{вызываем "Select Game"}
PostMessage(WndHandle, WM_COMMAND, NewGameID, 0);
Timer1.Enabled := True;
END
ELSE Close;
end;
PROCEDURE
TForm1.WMQUERYOPEN(VAR Msg : TWMQueryOpen);
BEGIN
Msg.Result := 0;
END;
function TForm1.EnumFunc(H :
HWnd) : Word;
BEGIN
IF GetWindowWord(H, GWW_HINSTANCE) = InstHandle THEN
BEGIN
WndHandle := H;
Result := 0;
END
ELSE Result := 1;
END;
procedure
TForm1.Timer1Timer(Sender: TObject);
VAR Buffer :
ARRAY[0..10] OF
Char;
DlgHandle : Word;
begin
{Если пользователь закрыл FreeCell,
выходим!}
IF GetModuleUsage(InstHandle) = 0
THEN
BEGIN
Close;
Exit;
END;
{При необходимости укажите номер
игры}
DlgHandle := FindWindow('#32770', 'Game Number');
IF DlgHandle <> 0
THEN
BEGIN
Str(NextGame, Buffer);
SendDlgItemMessage(DlgHandle, $CB, WM_SETTEXT,
0, LongInt(@Buffer));
PostMessage(DlgHandle, WM_COMMAND, 1,
MakeLong(GetDlgItem(DlgHandle, 1),
BN_CLICKED));
END;
{Если игра окончена, увеличиваем
счетчик}
DlgHandle := FindWindow('#32770', 'Game Over');
IF DlgHandle <> 0
THEN
BEGIN
Inc(NextGame);
WITH TIniFile.Create(ChangeFileExt(Application.ExeName,
'.INI')) DO
try WriteInteger('FreeCell', 'NextGame', NextGame);
finally Free;
end;
PostMessage(DlgHandle, WM_COMMAND, 6,
MakeLong(GetDlgItem(DlgHandle, 6),
BN_CLICKED));
END;
{Если игра спрашивает, хотите ли вы выйти,
отвечем соответственно yes или OK}
DlgHandle := FindWindow('#32770', 'FreeCell');
IF DlgHandle <> 0
THEN
BEGIN
IF (NOT (GetDlgItemText(DlgHandle, 6, Buffer, 10) IN [0,10]))
AND (StrComp(Buffer, '&Yes') =
0) THEN
PostMessage(DlgHandle, WM_COMMAND, 6,
MakeLong(GetDlgItem(DlgHandle, 6),
BN_CLICKED))
ELSE IF (NOT (GetDlgItemText(DlgHandle, 2, Buffer, 10) IN [0,10]))
AND (StrComp(Buffer, 'Cancel') =
0) THEN
PostMessage(DlgHandle, WM_COMMAND, 1,
MakeLong(GetDlgItem(DlgHandle, 1),
BN_CLICKED))
END;
end;