Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сообщение перехватываем, но

20K
12 сентября 2006 года
TriodPlus
1 / / 12.09.2006
Здравствуйте.
Стоит задача: программе нужно узнать, была ли нажата какая - нибуть клавиша (не обязательно на активном окне данной программы ).
Что я делаю:
функцию перехвата пишу в dll:


//==============================
HHOOK SysHook;
BOOL WasKeyDown = FALSE;

LRESULT CALLBACK SysMsgProc(

int code, // hook code (код ловушки)
WPARAM wParam, // removal flag (флаг)
LPARAM lParam // address of structure with message
// (адрес структуры с сообщением)
)
{
//Проверяю сообщение
if (code == HC_ACTION)
{
//Проверяю тип сообщения.
//Если была нажата левая кнопка мыши
if (((tagMSG*)lParam)->message == WM_KEYUP)
{
//Клавиша была нажата
WasKeyDown = TRUE;


Beep(1000,300); //Для отладки

}


}
//Передать сообщение другим ловушкам в системе
return CallNextHookEx(SysHook, code, wParam, lParam);

}

///////////////////////////////////////////////////////////////////

exportdll void RunStopHook(bool State)
{
if (State)
{
SysHook = SetWindowsHookEx(WH_GETMESSAGE, &SysMsgProc, theApp.m_hInstance , 0);
}
else
UnhookWindowsHookEx(SysHook);
}

///////////////////////////////////////////////////////////////////
exportdll BOOL ReturnWasKeyDown()
{
return WasKeyDown;
}

///////////////////////////////////////////////////////////////////
exportdll void ResetKeyDown()
{
WasKeyDown = FALSE;
}
//===========================
Функция ReturnWasKeyDown возвращает результат, а ResetKeyDown обнуляет статус что была нажата клавиша.
Так проблема в том, что когда клацать клавишами на окне проги которая вызывает эту dll то все работает, но когда клацать на других окнах то функция перехвата выполняется (пикает – выполняется функция Beep) а переменной WasKeyDown не присваивается значение TRUE (оно то присваивается, но только не для процесса моей проги, а для того процесса, где клацали клавишами).

Как мне зделать так, чтобы переменной WasKeyDown присваивалось значение в моем процессе. Пробовал через указатели, отдельный класс создавал – не помогает.:rolleyes:
406
12 сентября 2006 года
vitaly2003s
481 / / 27.07.2004
Проблема у тебя в том что вызваная тобой функция хука при клике не на окно принадлежащее твоему процессу исполняется в адресном пространстве чужого процесса и соответсвенно переменная твоего процесса WasKeyDown остается неизмененой,а ее копия в чужом процессе изменяется как ты хочеш. Так вот нужно использовать либо расшареные секцию либо использовать методы синхронизации межпроцесовых коммуникаций.
Поищи здесь по форумам,здесь куча примеров про секции в длл и interprocess communications должны быть.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог