Jump to content
sr._neves

Interacção Delphi e windows

Recommended Posts

sr._neves

Bem eu estou a criar um pequeno programa em delphi para desligar o PC numa hora escolhida pelo utilizador e assim mas não conheço nenhuns comandos de delphi que façam interacção com o windows !

Alguém tem um cito onde posso aprender esses comandos e coisas desse género ?

Desde já obrigado

Share this post


Link to post
Share on other sites
thoga31

Existem bibliotecas com funções que acedem ao Windows. Suponho que alguma deva ter funções que executem comandos DOS. Procura pelas seguintes bibliotecas, podem ajudar:

  • dos
  • sysutils
  • windows

Mas existe a solução de criar um programa batch que é iniciado quando a contagem termina:

exec('directório', 'argumentos');

O batch seria:

shutdown /s /t 000

Fica a sugestão, também. :D

Cumpz. ;)


Knowledge is free!

Share this post


Link to post
Share on other sites
sr._neves

exec('directório', 'argumentos');

Se eu tiver um timer e não precisar do argumentos dá para usar apenas:

exec('directiorio');

Share this post


Link to post
Share on other sites
thoga31

exec('directório', 'argumentos');

Se eu tiver um timer e não precisar do argumentos dá para usar apenas:

exec('directiorio');

Sempre que tento executar sem o parâmetro dos argumentos, dá erro, ou seja, não é opcional, é obrigatório.


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Existem várias formas de executar um comando do sistema operativo através do Delphi. Umas são mais viradas para comandos Windows, outros mais para comandos DOS.

No entanto, nenhuma delas é directa, ou seja, não basta dizer o que se quer executar e pronto!

À conta disso, há tempos fiz este procedimento (ou melhor, ajustei ao meu gosto um dos vários métodos que há disponiveis na net):

procedure TfMain.RunExe(const CommandLine:string);
var
   SA: TSecurityAttributes;
   SI: TStartupInfo;
   PI: TProcessInformation;
   AppProcess, AppThread : THandle;
   RootDir, WorkDir:string;
const
     FUNC_NAME = 'RunExe';
begin
     try
        AppProcess:=0;
        AppThread:=0;

        // Initialize dirs
        RootDir:=ExtractFilePath(application.ExeName);
        WorkDir:=ExtractFilePath(CommandLine);

        // Check WorkDir
        if not (FileSearch(ExtractFileName(CommandLine),WorkDir)<>'') then WorkDir:=RootDir;

        // Initialize output file security attributes
        FillChar(SA,SizeOf(SA),#0);
        SA.nLength:=SizeOf(SA);
        SA.lpSecurityDescriptor:=nil;
        SA.bInheritHandle:=True;

        // Initialize Startup Info
        FillChar(SI,SizeOf(SI),#0);
        with SI do
             begin
                  cb:=SizeOf(SI);
                  dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
                  wShowWindow:=SW_HIDE;
                  hStdInput:=GetStdHandle(STD_INPUT_HANDLE);
             end;

        // Create the process
        if CreateProcess(nil, PChar(CommandLine), nil, nil,True, 0, nil,PChar(WorkDir), SI, PI)
           then begin
                     WaitForSingleObject(PI.hProcess,INFINITE);
                     AppProcess:=PI.hProcess;
                     AppThread:=PI.hThread;
                end
           else raise Exception.CreateFmt('CreateProcess() na função %s() falhou!'+ #10#13 + 'Linha de Comandos = %s',[FUNC_NAME,CommandLine]);

        finally
           // Close handles
           if AppProcess <> 0 then CloseHandle(AppProcess);
           if AppThread <> 0 then CloseHandle(AppThread);
        end;
end;

Para usar, basta chamar RunExe('comando_qualquer.exe');

De qualquer maneira, se é para encerrar e/ou reiniciar o windows, há uma outra função própria para isso, também encontrada na net (no caso, no site delphi.about.com, mais uma vez, com uma pequena alteração minha):

function WindowsExit(Reboot:boolean): Boolean;
var
   TTokenHd: THandle;
   TTokenPvg: TTokenPrivileges;
   cbtpPrevious: DWORD;
   rTTokenPvg: TTokenPrivileges;
   pcbtpPreviousRequired: DWORD;
   tpResult: Boolean;
   RebootParam: Longword;
const
     SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
     if Reboot then RebootParam:=EWX_REBOOT or EWX_FORCE
                   else RebootParam:=EWX_POWEROFF or EWX_FORCE;

     if Win32Platform = VER_PLATFORM_WIN32_NT
        then begin
                  tpResult := OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,TTokenHd);
                  if tpResult
                     then begin
                               tpResult := LookupPrivilegeValue(nil,SE_SHUTDOWN_NAME,TTokenPvg.Privileges[0].Luid);
                               TTokenPvg.PrivilegeCount := 1;
                               TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
                               cbtpPrevious := SizeOf(rTTokenPvg) ;
                               pcbtpPreviousRequired := 0;
                               if tpResult then Windows.AdjustTokenPrivileges(TTokenHd,False,TTokenPvg,cbtpPrevious,rTTokenPvg,pcbtpPreviousRequired);
                          end;
             end;
     Result := ExitWindowsEx(RebootParam, 0);
end;

Para usar basta usar:

p/ Encerrar: WindowsExit(false);

p/ Reiniciar: WindowsExit(true);

Assim só precisas fazer o interface e o timer...

EDIT: Alterei o tipo do parametro Reboot para boolean para optimizar o codigo... Afinal, para o que é, basta um byte, não precisamos dos até 32 bytes que o Integer usa... ;)


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
dArkStyle

sim basta ele ter o timer e colocar no evento o codigo :D

Bom procedimento nunopicado  ;)


Stephane SoaresCurso Profissional de Gestão e Programação de Sistemas InformáticosACEITAM-SE PROPOSTAS DE TRABALHO "FREELANCER"

Share this post


Link to post
Share on other sites
dicas3d

Se estás a usar Lazarus podes também usar a class TProcess (não sei se o Delphi a suporta). Esta suporta virtualmente tudo isso.


Abraços

dicas3d

Share this post


Link to post
Share on other sites
sr._neves

Bem eu como não entendi grande coisa do código que postas-te  😳 tentei simplificar as coisa:

e usei este simples código:

 if ((hora1=timetostr(time)) and (data1=datetostr(date))) then
    begin
         WinExec('Shutdown  -r -f -t 00', SW_SHOWNORMAL);

verifica a data e a hora do sistema com aquela que o utilizar digita e pronto!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.