хук на клавитару - проблема
От: AlexJH  
Дата: 16.07.09 20:17
Оценка:
Задача: поставить глобальный хук на клавиатуру, при нажатии любой клавиши создавать файл с заданным именем.
приложение:
#include <string>
#include <iostream>
#include <conio.h>
#include <windows.h>

static HHOOK*    HookHandle  = NULL;            
HOOKPROC HookProc = NULL;

int main()
{
    HINSTANCE DllHandle = LoadLibrary(L"SharedDll.dll");      
    if( DllHandle )                           
    {                                                        
        //хук - процедура
        HookProc = (HOOKPROC) GetProcAddress( DllHandle, "_HookProc@12");   
        //хэндл библиотеки
        HookHandle = (HHOOK*) GetProcAddress( DllHandle, "dllHook" ); 
        //установка хука
        *HookHandle = SetWindowsHookExW( WH_KEYBOARD, HookProc, DllHandle, NULL );     
        _getch();
        MessageBox(NULL,L"text",L"title",NULL);
        UnhookWindowsHookEx(*HookHandle);       
        FreeLibrary(DllHandle);       
    }
    else
    {
        MessageBox(NULL,L"Failed to load library",L"error",0);
    }
    return 0;
}


DLL:
//секция разделяемой памяти
#include <windows.h>
#include <iostream>

#pragma data_seg(".myseg")
extern "C" __declspec(dllexport)    HHOOK dllHook = NULL;  
#pragma data_seg()
#pragma comment(linker, "/SECTION:.myseg,RWS") 

extern "C" __declspec(dllexport)                              
LRESULT CALLBACK HookProc(                  
                          int code,                               
                          WPARAM wParam,                          
                          LPARAM lParam 
                          )
{      
    fclose(fopen("c:\\PROVERKA.jpg","w"));
    return CallNextHookEx(dllHook, code, wParam, lParam );  
}


Я запускаю приложение, делаю его неактивным (т.к. хук не перехватывает нажатие клавиш на консоль), щёлкаю любую клавишу, и получаю PROVERKA.jpg на диске c:\.
Проблема: стоит мне заменить "c:\\PROVERKA.jpg" на "PROVERKA.jpg" или любое другое имя без абсолютного пути ("xxx.xxx"), то всё совершенно меняется. Поведение: запускаю программу, убираю на задний фон, щёлкаю любую клавишу — ничего не происходит. Когда в конце приложения выскакивает
MessageBox(NULL,L"text",L"title",NULL), то только тогда, делая активным любое окно (даже консоль), я получаю PROVERKA.jpg в той же папке, что и программа.
Как вообще такое может быть? Чем абсолютный путь так кардинально отличается от относительного в моей программе?

17.07.09 10:33: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.