...
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; |