Программа должна убивать процесс по нужному сочетанию клавиш. Устанавливаю хук.
Если сразу же после этого нажимать нужные сочетания клавиш — процессы стреляются. Если еще после установки переключить
фокус на какое-нить окошко, свернуть-развернуть, то клавиатурная процедура моего хука уже не вызывается.
В чем может быть проблема?
Здравствуйте, Аноним, Вы писали:
А>А хук глобальный ставится и находится в DLL?
Да, инсталится и находится в длл. Это ж и странно — вроде все как надо, а не пашет.
Здравствуйте, __helen__, Вы писали:
___>Да, инсталится и находится в длл. Это ж и странно — вроде все как надо, а не пашет.
Несите код в студию. Для начала, нужны процедура установки хука, процедура хука (можно скелет) и определения используемых хуком глобальных переменных.
Здравствуйте, Аноним, Вы писали:
А>Несите код в студию. Для начала, нужны процедура установки хука, процедура хука (можно скелет) и определения используемых хуком глобальных переменных.
#include "stdafx.h"
#include "keyhook.h"
#include "stdio.h"
#include "stdlib.h"
#pragma data_seg(".SHARDAT")
HINSTANCE hins;
static HHOOK hkb=NULL;
KEYHOOK__API BOOL keyShift;
KEYHOOK__API BOOL keyCtrl;
KEYHOOK__API BOOL keyD;
KEYHOOK__API char strProcess[256];
KEYHOOK__API CRITICAL_SECTION criticalSection;
#pragma data_seg()
BOOL isProcessDeleted = FALSE;
typedef BOOL (WINAPI *PENUMERATEPROC)(DWORD* , DWORD , DWORD* );
typedef BOOL (WINAPI *PENUMPROCMOD)( HANDLE, HMODULE* , DWORD , LPDWORD);
typedef DWORD (WINAPI *PGETMODBASENAME)( HANDLE, HMODULE, LPTSTR ,DWORD);
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
hins = (HINSTANCE)hModule;
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
LRESULT __declspec(dllexport)__stdcall CALLBACK KeyboardProc( int nCode, WPARAM wParam, LPARAM lParam)
{
char strProcess_local[256];
int i;
char str[256];
// EnterCriticalSection(&criticalSection);
strcpy(strProcess_local,strProcess);
if (((DWORD)lParam & 0x40000000) &&(HC_ACTION == nCode))
{
if (VK_SHIFT == wParam)
{
keyShift = TRUE;
}
if (VK_CONTROL == wParam)
{
keyCtrl = TRUE;
}
if ( 68 == wParam)
{
keyD = TRUE;
}
}
else
{
if (!((DWORD)lParam & 0x40000000) &&(HC_ACTION == nCode))
{
if (VK_SHIFT == wParam)
{
keyShift = FALSE;
isProcessDeleted = FALSE;
}
if (VK_CONTROL == wParam)
{
keyCtrl = FALSE;
isProcessDeleted = FALSE;
}
if ( 68 == wParam)
{
keyD = FALSE;
isProcessDeleted = FALSE;
}
}
}
// LeaveCriticalSection(&criticalSection);
if ((keyShift) && (keyCtrl) && (keyD))
{
if(!isProcessDeleted)
{
isProcessDeleted = TRUE;
// Стреляем процесс!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
HMODULE mod;
PENUMERATEPROC EnumerateProcesses;
PENUMPROCMOD EnumerateProcessModules;
PGETMODBASENAME GetModBaseName;
mod = LoadLibrary("psapi.dll");
if(!mod)
{
MessageBox(0,"psapi.dll wasn't found","Error",MB_OK);
return FALSE;
}
EnumerateProcesses = (PENUMERATEPROC)GetProcAddress(mod,"EnumProcesses");
if(!EnumerateProcesses)
{
MessageBox(0,"EnumProcesses wasn't found","Error",MB_OK);
return FALSE;
}
EnumerateProcessModules = (PENUMPROCMOD)GetProcAddress(mod,"EnumProcessModules");
if(!EnumerateProcessModules)
{
MessageBox(0,"EnumProcessModules wasn't found","Error",MB_OK);
return FALSE;
}
GetModBaseName = (PGETMODBASENAME)GetProcAddress(mod,"GetModuleBaseNameA");
int err = GetLastError();
if(!GetModBaseName)
{
MessageBox(0,"GetModuleBaseNameA wasn't found","Error",MB_OK);
return FALSE;
}
DWORD aProcesses[1024], cbNeeded=0, cProcesses;
if ( !(*EnumerateProcesses)( aProcesses, sizeof(aProcesses), &cbNeeded ) )
{
MessageBox(0,"Cant enumerate processes!","Warning",MB_OK);
}
else
{
cProcesses = cbNeeded / sizeof(DWORD);
char szProcessName [MAX_PATH];
HANDLE hProcess;
HMODULE hMod;
DWORD cbNeeded;
BOOL succeedTermin;
for ( i = 0; i < cProcesses; i++ )
{
strcpy(szProcessName,"<unknown>");
hProcess = OpenProcess( PROCESS_ALL_ACCESS,
FALSE, aProcesses[i] );
// Get the process name.
if (NULL != hProcess )
{
if ( EnumerateProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
{
GetModBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) );
}
}
CharUpperBuff(szProcessName,strlen(szProcessName));
CharUpperBuff(strProcess_local,strlen(strProcess_local));
if (strcmp(szProcessName,strProcess_local)==0)
{
succeedTermin = TerminateProcess(hProcess,0);
if (succeedTermin)
{
MessageBox(0,"Process terminated successfully!","Success",MB_OK);
break;
}
else
{
MessageBox(0,"Cant terminate process!","Error",MB_OK);
}
}
}
}
FreeLibrary(mod);
}
}
LRESULT RetVal = CallNextHookEx( hkb, nCode, wParam, lParam );
return RetVal;
}
BOOL __declspec(dllexport)__stdcall installhook()
{
hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hins,0);
return hkb!=NULL;
}
BOOL __declspec(dllexport) UnHook()
{
BOOL unhooked = UnhookWindowsHookEx(hkb);
return unhooked;
}
Здравствуйте, __helen__, Вы писали:
___>Здравствуйте, Аноним, Вы писали:
А>>Несите код в студию. Для начала, нужны процедура установки хука, процедура хука (можно скелет) и определения используемых хуком глобальных переменных.
___>___>#pragma data_seg(".SHARDAT")
___>HINSTANCE hins;
___>static HHOOK hkb=NULL;
___>KEYHOOK__API BOOL keyShift;
___>KEYHOOK__API BOOL keyCtrl;
___>KEYHOOK__API BOOL keyD;
___>KEYHOOK__API char strProcess[256];
___>KEYHOOK__API CRITICAL_SECTION criticalSection;
___>#pragma data_seg()
___>
Переменные надо либо проинициализировать, либо указать им __declspec(allocate(".SHARDAT")). иначе они окажутся в BSS несмотря на прагму.
--
Sergey Chadov
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>