SetWindowsHookEx ile tuş yakalama problem

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
tosturan
Üye
Mesajlar: 17
Kayıt: 02 Eki 2015 09:42

SetWindowsHookEx ile tuş yakalama problem

Mesaj gönderen tosturan »

Merhabalar;

System trayda çalışan bir uygulamam var. SetWindowsHookEx kullanarak basılan tuşları kontrol ettirdiğim bir dll ile çalışıyor. ve page down tuşuna basılırsa bilgisayarda csgo.exe çalışıyor ise bunu kapattırıyorum. csgo.exe altta çalışırken windowsun neresinde basarsam basıyım tuşu yakalayıp kapatıyor. ama csgo.exe penceresi aktifken ve full screen ken bastıgım zaman hiç bir şekilde yakalamıyor. başka oyunlarda aktifkende değilkende kapatıyor. acaba csgo.exenin ne farkı varda oyun aktif ekran iken tuşları yakalamıyor. böyle bir şey tecrübe eden varmıdır acaba.

Kod: Tümünü seç

function MyTaskKeyHookLL(nCode: Integer;
  wp: WPARAM; lp:LPARAM): LRESULT; stdcall;
  const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
  pkh: KBDLLHOOKSTRUCT;
  alt : Boolean;

//  CtrlKeyDown: Boolean;
begin

  pkh:= PKBDLLHOOKSTRUC(lp)^;
  if nCode = HC_ACTION then
  begin
//  pkh.vkCode := 's';


                             //VK_NEXT
//  if ( pkh.vkCode = VkKeyScan() ) then
  if (pkh.vkCode = vk_next) then
    begin

        FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
        ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
        while Integer(ContinueLoop) <> 0 do
        begin
          if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
            UpperCase('csgo.exe')) or (UpperCase(FProcessEntry32.szExeFile) =
            UpperCase('csgo.exe'))) then
              begin
                FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
                FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
                ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
                while Integer(ContinueLoop) <> 0 do
                begin
                  if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
                    UpperCase('csgo.exe')) or (UpperCase(FProcessEntry32.szExeFile) =
                    UpperCase('csgo.exe'))) then
                    Result := Integer(TerminateProcess(
                                      OpenProcess(PROCESS_TERMINATE,
                                                  BOOL(0),
                                                  FProcessEntry32.th32ProcessID),
                                                  0));
                   ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
                end;
                CloseHandle(FSnapshotHandle);

              end;
           ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
        end;
        CloseHandle(FSnapshotHandle);
    end;
 Result:= 0; // gobble it: go directly to jail, do not pass go
    Exit;
    end;
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: SetWindowsHookEx ile tuş yakalama problem

Mesaj gönderen anonymousdelphicoder »

Gercekten sorunuz acik degil, birz daginik yazmissiniz fakat gorunen kadari ile hook isleminiz zaten dogru degil.

Callnexthookex cagrimi yapilmamis buna dikkat edin.
Bir diger onemli bilgi ise hook islemi baslayip proca dustugunde uygulamaniz proca yanlis hatirlamiyor isem 1 veya 2 saniye cevap vermez ise sistem tarafindan hook isleminiz sonlandiriliyor. Test icin, debug modda break point koyup programin o noktaya sicramasini saglayin ve bahsettigim sure boyunca bekleyin tekrar devam ettiginizde hook sonlanmis olacaktir.



En buyuk kaynak msdn, buradan tum detaylari alabilirsiniz.

https://msdn.microsoft.com/en-us/librar ... s.85).aspx

Ornek,

http://www.swissdelphicenter.ch/torry/s ... hp?id=1722

Kolay gelsin.
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: SetWindowsHookEx ile tuş yakalama problem

Mesaj gönderen G.Arkas »

tosturan yazdı:Merhabalar;

System trayda çalışan bir uygulamam var. SetWindowsHookEx kullanarak basılan tuşları kontrol ettirdiğim bir dll ile çalışıyor. ve page down tuşuna basılırsa bilgisayarda csgo.exe çalışıyor ise bunu kapattırıyorum. csgo.exe altta çalışırken windowsun neresinde basarsam basıyım tuşu yakalayıp kapatıyor. ama csgo.exe penceresi aktifken ve full screen ken bastıgım zaman hiç bir şekilde yakalamıyor. başka oyunlarda aktifkende değilkende kapatıyor. acaba csgo.exenin ne farkı varda oyun aktif ekran iken tuşları yakalamıyor. böyle bir şey tecrübe eden varmıdır acaba.

Kod: Tümünü seç

function MyTaskKeyHookLL(nCode: Integer;
  wp: WPARAM; lp:LPARAM): LRESULT; stdcall;
  const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
  pkh: KBDLLHOOKSTRUCT;
  alt : Boolean;

//  CtrlKeyDown: Boolean;
begin

  pkh:= PKBDLLHOOKSTRUC(lp)^;
  if nCode = HC_ACTION then
  begin
//  pkh.vkCode := 's';


                             //VK_NEXT
//  if ( pkh.vkCode = VkKeyScan() ) then
  if (pkh.vkCode = vk_next) then
    begin

        FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
        ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
        while Integer(ContinueLoop) <> 0 do
        begin
          if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
            UpperCase('csgo.exe')) or (UpperCase(FProcessEntry32.szExeFile) =
            UpperCase('csgo.exe'))) then
              begin
                FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
                FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
                ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
                while Integer(ContinueLoop) <> 0 do
                begin
                  if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
                    UpperCase('csgo.exe')) or (UpperCase(FProcessEntry32.szExeFile) =
                    UpperCase('csgo.exe'))) then
                    Result := Integer(TerminateProcess(
                                      OpenProcess(PROCESS_TERMINATE,
                                                  BOOL(0),
                                                  FProcessEntry32.th32ProcessID),
                                                  0));
                   ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
                end;
                CloseHandle(FSnapshotHandle);

              end;
           ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
        end;
        CloseHandle(FSnapshotHandle);
    end;
 Result:= 0; // gobble it: go directly to jail, do not pass go
    Exit;
    end;
Bir oyuna hile yazdığınızı varsayarak cevaplayacağım. Oyun aktifken sizin bunu yapmanızı engelleyecek bir Shield (Koruma aracı) vardır. Dolayısıyla bunu bu şekilde yapamazsınız. Kaynağa inmelisiniz. Tuşların derlendiği yere. Makinanın algıladığı yere. Sistem Sürücü Katmanına.
Resim
Cevapla