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.
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;
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.
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.
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.