Hook не всегда реагирует на клавиатурные события
От: __helen__  
Дата: 10.06.06 21:41
Оценка:
Программа должна убивать процесс по нужному сочетанию клавиш. Устанавливаю хук.
Если сразу же после этого нажимать нужные сочетания клавиш — процессы стреляются. Если еще после установки переключить

фокус на какое-нить окошко, свернуть-развернуть, то клавиатурная процедура моего хука уже не вызывается.
В чем может быть проблема?
Re: Hook не всегда реагирует на клавиатурные события
От: Аноним  
Дата: 11.06.06 22:05
Оценка:
Здравствуйте, __helen__, Вы писали:


___> Если еще после установки переключить


___>фокус на какое-нить окошко, свернуть-развернуть, то клавиатурная процедура моего хука уже не вызывается.

___>В чем может быть проблема?

А хук глобальный ставится и находится в DLL?
Re[2]: Hook не всегда реагирует на клавиатурные события
От: __helen__  
Дата: 12.06.06 08:38
Оценка:
Здравствуйте, Аноним, Вы писали:



А>А хук глобальный ставится и находится в DLL?


Да, инсталится и находится в длл. Это ж и странно — вроде все как надо, а не пашет.
Re[3]: Hook не всегда реагирует на клавиатурные события
От: Аноним  
Дата: 12.06.06 21:49
Оценка:
Здравствуйте, __helen__, Вы писали:

___>Да, инсталится и находится в длл. Это ж и странно — вроде все как надо, а не пашет.


Несите код в студию. Для начала, нужны процедура установки хука, процедура хука (можно скелет) и определения используемых хуком глобальных переменных.
Re[4]: Hook не всегда реагирует на клавиатурные события
От: __helen__  
Дата: 12.06.06 22:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Несите код в студию. Для начала, нужны процедура установки хука, процедура хука (можно скелет) и определения используемых хуком глобальных переменных.


#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;
}
Re: Hook не всегда реагирует на клавиатурные события
От: __helen__  
Дата: 15.06.06 11:19
Оценка:
Никто не знает как решить проблему?
Re[2]: Hook не всегда реагирует на клавиатурные события
От: RobinBobin  
Дата: 15.06.06 14:18
Оценка:
Здравствуйте, __helen__, Вы писали:

___>Никто не знает как решить проблему?


Насколько я знаю, все переменные, объявленные в гловальной секции (.SHARDATA) должны быть инициализированы...
Re[5]: Hook не всегда реагирует на клавиатурные события
От: a-lex Россия  
Дата: 16.06.06 15:09
Оценка:
Здравствуйте, __helen__, Вы писали:

[]

Присоединяюсь к сказанному RobinBobin'ом. Насколько мне не изменияет память, MSVC складывает все неинициализированные переменные в BSS, вне зависимости от #pragma data_seg. Это можно проверить, посмотрев map-файл.
Re[5]: Hook не всегда реагирует на клавиатурные события
От: vvotan Россия  
Дата: 16.06.06 15:40
Оценка:
Здравствуйте, __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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.