Для создания программы расположите на новой форме таймер, установите ее свойство WindowState на wsMinimized и используйте следующий код:
...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')) DOtryFreeCellPath := ReadString('FreeCell', 'Path','C:\WIN32APP\FREECELL\FREECELL.EXE') + #0;NextGame := ReadInteger('FreeCell', 'NextGame', 1);finallyFree;end;InstHandle := ShellExecute(Handle, NIL, @FreeCellPath[1],NIL, NIL, SW_SHOW);WndHandle := 0;IF InstHandle >= 32 THENEnumWindows(@TForm1.EnumFunc, LongInt(Self));IF WndHandle <> 0 THENBEGIN{Вычисляем 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;ENDELSE 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 THENBEGINWndHandle := H;Result := 0;ENDELSE Result := 1;END; procedure TForm1.Timer1Timer(Sender: TObject); VAR Buffer : ARRAY[0..10] OF Char; DlgHandle : Word;begin {Если пользователь закрыл FreeCell, выходим!}IF GetModuleUsage(InstHandle) = 0 THENBEGINClose;Exit;END;{При необходимости укажите номер игры}DlgHandle := FindWindow('#32770', 'Game Number');IF DlgHandle <> 0 THENBEGINStr(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 THENBEGINInc(NextGame);WITH TIniFile.Create(ChangeFileExt(Application.ExeName, '.INI')) DOtry 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 THENBEGINIF (NOT (GetDlgItemText(DlgHandle, 6, Buffer, 10) IN [0,10]))AND (StrComp(Buffer, '&Yes') = 0) THENPostMessage(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) THENPostMessage(DlgHandle, WM_COMMAND, 1,MakeLong(GetDlgItem(DlgHandle, 1), BN_CLICKED))END;end; |
[000530]