Если вы решили перепробовать ВСЕ номера игры FreeCell, вас можно квалифицировать как законченного маньяка. В этом случае вас, возможно, заинтересует эта маленькая программка. При ее запуске она загружает FreeCell и начинает игру, следующую за той, которую вы не смогли завершить в прошлый раз. А еще она отвечает на глупые вопросы типа "Do you really want to resign the game?". После выигрыша программа изменяет счетчик таким образом, чтобы при очередном запуске номер игры изменялся на следующий автоматически.
Для создания программы расположите на новой форме таймер, установите ее свойство WindowState на wsMinimized и используйте следующий код:
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;