Bilgisayarı Kapatma ve Timer

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Bilgisayarı Kapatma ve Timer

Mesaj gönderen conari »

S.A
Bilgisayarı kapatma ile ilgili hazır kodu siteden aldım.
Uygulamam da kullanıyorum ama bir timer ile

edite girilen süre ile timerı eşitliyorum
timerı aktif ediyorum

Timer dada bu kapatma kodunu kullanıyorum ama sanki kısır döngüye giriyor. ve süre geçtiği halde kapatmıyor.

uses a v.s. bir şey ekelemek gereklimi direk apiler kullanılmıyormu?
Yorum getirebilirmisiniz.

Kod: Tümünü seç

var
   tkHandle : THandle;
   BufferLun,ret : DWORD;
   tk,tkPrevious : TTokenPrivileges;
   LID : TLargeInteger;
   LUID : TLuIDAndAttributes;
   versione : TOSVersionInfo;
begin
   BufferLun := 1024;
   ret := 0;
   versione.dwOSVersionInfoSize := sizeof(versione);
   GetVersionEx(versione);
   if versione.dwPlatformId = VER_PLATFORM_WIN32_NT then
         begin
         tkHandle := GetCurrentProcess;
         OpenProcessToken(tkHandle,TOKEN_ALL_ACCESS,tkHandle);
         LookupPrivilegeValue(PChar(''),PChar('SeShutDownPrivilege'),LID);
         LUID.Luid := LID;
         LUID.Attributes := SE_PRIVILEGE_ENABLED;
         tk.PrivilegeCount := 1;
         tk.Privileges[0] := LUID;
         AdjustTokenPrivileges(tkHandle,False,tk,BufferLun,tkPrevious,ret);
      end;
      ExitWindowsEx(EWX_SHUTDOWN or EWX_PowerOff,0);
   end;
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
mero
Üye
Mesajlar: 109
Kayıt: 04 Mar 2005 04:54

Mesaj gönderen mero »

Merhaba
Yukarda yazmış olduğunuz kodlardan fazla anlamadığım için bir yorum yapamayacağım.

Ama aşağıdaki fuctionu kullanıyorum ve bir problem yok.

Kod: Tümünü seç

function MyExitWindows(RebootParam: Longword): Boolean;
var
  TTokenHd: THandle;
  TTokenPvg: TTokenPrivileges;
  cbtpPrevious: DWORD;
  rTTokenPvg: TTokenPrivileges;
  pcbtpPreviousRequired: DWORD;
  tpResult: Boolean;
const
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
  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;

// Example to shutdown Windows:

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyExitWindows(EWX_POWEROFF or EWX_FORCE);
end;

// Example to reboot Windows:

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyExitWindows(EWX_REBOOT or EWX_FORCE);
end;

// Parameters for MyExitWindows()


EWX_LOGOFF 

Shuts down all processes running in the security context of the process that called the
ExitWindowsEx function. Then it logs the user off.



EWX_POWEROFF

Shuts down the system and turns off the power.
The system must support the power-off feature.
Windows NT/2000/XP:
The calling process must have the SE_SHUTDOWN_NAME privilege.


EWX_REBOOT

Shuts down the system and then restarts the system.
Windows NT/2000/XP: The calling process must have the SE_SHUTDOWN_NAME privilege.



EWX_SHUTDOWN 

Shuts down the system to a point at which it is safe to turn off the power.
All file buffers have been flushed to disk, and all running processes have stopped.
If the system supports the power-off feature, the power is also turned off.
Windows NT/2000/XP: The calling process must have the SE_SHUTDOWN_NAME privilege.



 
EWX_FORCE 

Forces processes to terminate. When this flag is set,
the system does not send the WM_QUERYENDSESSION and WM_ENDSESSION messages.
This can cause the applications to lose data.
Therefore, you should only use this flag in an emergency.



EWX_FORCEIFHUNG

Windows 2000/XP: Forces processes to terminate if they do not respond to the
WM_QUERYENDSESSION or WM_ENDSESSION message. This flag is ignored if EWX_FORCE is used.

Bunu uygularsanız ve tekrar problem ile karşılaşırsanız muhtemelen zamanı karşılaştırmada bir problem vardır.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

İlgin için teşekkürler

Lakin kodda problem yok normal buton da v.s çalışıyor.
Yani Timer süresi geldiğinde devreye girdiriyorum kodları.

Timer ile çalışmamıştı ama sanırım aştım.
Eğer ki aşamaz isem JValarmı deneyeceğim :) :lol:
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Timer da nasıl çalıştırdığınız önemli. Timer.OnTimer kısmı olsa tespit ve teşhis yapılabilirdi :roll:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

Hoca Selam,

Kodları Timer içine koymadım.

Visible =false;
olan bir buton koydum forma Kodlar bunun click eventinde.

timer.ontimer da

Buton.click;
yapıyorum..
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

Hocam,
Bu arada timer aktif olduktan sonra geçen süre an ve an nasıl alabilirim yani kronometre gibi.

(interval olarak)
Teşekkürler.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
hakkus
Üye
Mesajlar: 160
Kayıt: 18 Haz 2003 12:02
Konum: Konya

Mesaj gönderen hakkus »

Kod: Tümünü seç

var
basla,sure:integer; (bunlar global değişken olsun)
timer1.ontimer a;
begin
basla:=gettickcount;
timer2.enabled:=true;
end;
  /
/
timer2.ontimer;
begin
sure:=(gettickcount-basla) div X;
label1.caption:=inttostr(sure);
// sureyi bulduktan sonra elde ettiğin değeri X yani 100,1000 vs böldürerek saniye, salise gibi değerleri elde edersin.. sure yi real yaparsan div yerine / işaretini kullanabilirsin bu şekildede ondalık kısmını ayırarak yine dakika, saniye, salise gibi değerleri işleyebilirsin..
end;
Kolay gelsin
saygılar
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

@hakkus
Deneyeceğim , Teşekkürler.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
cozturk
Üye
Mesajlar: 484
Kayıt: 15 Haz 2005 05:22

Mesaj gönderen cozturk »

Soru:
Timeri'ı süre bitmeden nasıl resetleriz?
timer1.enable; timer1.disable;
dışında çözüm var mıdır?
aXéNT

Re: Bilgisayarı Kapatma ve Timer

Mesaj gönderen aXéNT »

Konu baya bi eskiymiş ama kirlilik olmasın diye buraya yazıcam.Aynı sorun bendede var. Eşleşmede sorun yok bilgisayarı kapatma kodunu pasif yapıp yerine olay gerçekleşince Label1.Caption:='oldu' yazıyorum zamanı gelince o yazıyı yazıyor melet. Ama lakin bilgisayarı kapatma kodunu koyduğum zaman olmuyor. Kodları butona koyuyorum basıyorum butona ozamanda kapatıyor bilgisayarı. Sorun nedir anladım valla.

Bu aRada kısa bir soru daha ben bu bilgisayraı kapatma kodlarını function olarak tanımladım. Acaba ordamı bi yanlış yaptım anlamadımki.. Gerçi kodu butona koyunca çalışıyo demekki doğru tanımlamışım gerçi... Çıkamadım işin içinden bi el atan olursa sevinirim

Kod: Tümünü seç

Function Cikis:Boolean;
var
   tkHandle : THandle;
   BufferLun,ret : DWORD;
   tk,tkPrevious : TTokenPrivileges;
   LID : TLargeInteger;
   LUID : TLuIDAndAttributes;
   versione : TOSVersionInfo;
begin
   BufferLun := 1024;
   ret := 0;
   versione.dwOSVersionInfoSize := sizeof(versione);
   GetVersionEx(versione);
   if versione.dwPlatformId = VER_PLATFORM_WIN32_NT then
         begin
         tkHandle := GetCurrentProcess;
         OpenProcessToken(tkHandle,TOKEN_ALL_ACCESS,tkHandle);
         LookupPrivilegeValue(PChar(''),PChar('SeShutDownPrivilege'),LID);
         LUID.Luid := LID;
         LUID.Attributes := SE_PRIVILEGE_ENABLED;
         tk.PrivilegeCount := 1;
         tk.Privileges[0] := LUID;
         AdjustTokenPrivileges(tkHandle,False,tk,BufferLun,tkPrevious,ret);
      end;
      ExitWindowsEx(EWX_SHUTDOWN or EWX_PowerOff,0);
   end;
aXéNT

Re: Bilgisayarı Kapatma ve Timer

Mesaj gönderen aXéNT »

Ben kendi soruma kendim cevap verim çözdüm sorunumu kodlarımı aşağıdakiyle değiştirdim haloldu ;

Kod: Tümünü seç

Function MyExitWindows(RebootParam: Longword): Boolean;
var
 TTokenHd: THandle;
 TTokenPvg: TTokenPrivileges;
 cbtpPrevious: DWORD;
 rTTokenPvg: TTokenPrivileges;
 pcbtpPreviousRequired: DWORD;
 tpResult: Boolean;
const
 SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
 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;
Kullanımları:

Bilgisayarı Kapat:

Kod: Tümünü seç

MyExitWindows(EWX_POWEROFF or EWX_FORCE);
Yeniden Başlat:

Kod: Tümünü seç

MyExitWindows(EWX_REBOOT);
Oturumu Kapat:

Kod: Tümünü seç

MyExitWindows(EWX_LOGOFF);
Cevapla