Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хук на движение мыши. ЛАГИ, хуки hook mouse move движение мыши тормо 
:(
    Опции темы
ano360
Дата 11.6.2010, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 22.5.2006
Где: Москва

Репутация: нет
Всего: нет



есть хук на движение мыши. при включенном этом хуке мыш начинает УЖАСНО лагать. можно ли с этим как-нибудь справиться?
Код

#include "stdafx.h"
#include "DLLHook.h"

#define MUTEX_NAME TEXT("MySuperMutex")
#define VK_C    0x043
void HookThreadRoutine(void* ptr);
int CALLBACK MousedProc(int nCode, WPARAM wParam, LPARAM lParam);
HHOOK hHook;

extern "C" {
    DLLHOOK_API void start(void)
    {
        printf("!!START\n");
        HANDLE hMutex = CreateMutex(NULL, TRUE, MUTEX_NAME);
        if(ERROR_ALREADY_EXISTS == GetLastError())
            return;    //do nothing - already started

        _beginthread(HookThreadRoutine, 0, hMutex);
    }

    DLLHOOK_API void stop(void)
    {
        printf("!!STOP\n");
        HANDLE hMutex = CreateMutex(NULL, TRUE, MUTEX_NAME);
        if(ERROR_ALREADY_EXISTS != GetLastError())
            return;    //not started ?
        
        ReleaseMutex(hMutex);    //release lock
        CloseHandle(hMutex);    //finally close mutex
    }
};


void HookThreadRoutine(void*hMutexPtr)
{
    HANDLE hMutex = static_cast<HANDLE>(hMutexPtr);
    MSG msg = {0};    // структура сообщения
    hHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)&MousedProc, GetModuleHandle(NULL), 0);

    while(true){
        
        if(WAIT_OBJECT_0 == WaitForSingleObject(hMutex, 100)) 
        {
            UnhookWindowsHookEx(hHook);
            break;    //stop the thread
        }

        
        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);    
        }

    
        printf("wait...\n");
    }
}
int CALLBACK MousedProc(int nCode, WPARAM wParam, LPARAM lParam)
{    
    return CallNextHookEx(hHook, nCode, wParam, lParam);
}


Это сообщение отредактировал(а) ano360 - 11.6.2010, 21:39


--------------------
Жизнь есть.
PM MAIL WWW ICQ   Вверх
dumb
Дата 12.6.2010, 04:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



сделай стандартный message loop, опрос состояния mutex'а(без задержки! вместо 100 поставь 0) сделай по получении сообщения. в stop добавь отсылку какого-либо сообщения в свой loop.
PM MAIL   Вверх
ano360
Дата 12.6.2010, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 22.5.2006
Где: Москва

Репутация: нет
Всего: нет



Вот так?
Код

// DLLHook.cpp : Defines the exported functions for the DLL application.
//

#include "stdafx.h"
#include "DLLHook.h"

#define MUTEX_NAME TEXT("MySuperMutex")
#define VK_C    0x043
void HookThreadRoutine(void* ptr);
int CALLBACK MousedProc(int nCode, WPARAM wParam, LPARAM lParam);
int CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
HHOOK hMouseHook;
HHOOK hKeyboardHook;
POINT py ;
BOOL moved;
extern "C" {
    DLLHOOK_API void start(void)
    {
        printf("!!START\n");
        HANDLE hMutex = CreateMutex(NULL, TRUE, MUTEX_NAME);
        if(ERROR_ALREADY_EXISTS == GetLastError())
            return;    //do nothinCCg - already started

        _beginthread(HookThreadRoutine, 0, hMutex);
        GetCursorPos(&py);
        moved = false;
    }
//-------------------------------------------------------------
    DLLHOOK_API void stop(void)
    {
        printf("!!STOP\n");
        HANDLE hMutex = CreateMutex(NULL, TRUE, MUTEX_NAME);
        if(ERROR_ALREADY_EXISTS != GetLastError())
            return;    //not started ?
        
        ReleaseMutex(hMutex);    //release lock
        CloseHandle(hMutex);    //finally close mutex
        SendMessage(NULL, WM_NULL, 123456789, 1);
    }
};

//-------------------------------------------------------------
void HookThreadRoutine(void*hMutexPtr)
{
    HANDLE hMutex = static_cast<HANDLE>(hMutexPtr);
    MSG msg = {0};    // структура сообщения
    hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)&MousedProc, GetModuleHandle(NULL), 0);
    hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)&KeyboardProc, GetModuleHandle(NULL), 0);

    while(GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);

        if (msg.wParam == 123456789)
            if(WAIT_OBJECT_0 == WaitForSingleObject(hMutex, 0)) 
            {
                UnhookWindowsHookEx(hMouseHook);
                break;    //stop the thread
            }
    }
}


я так понимаю так не правильно? как правильно?

Это сообщение отредактировал(а) ano360 - 12.6.2010, 20:57


--------------------
Жизнь есть.
PM MAIL WWW ICQ   Вверх
xvr
Дата 13.6.2010, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(ano360 @  12.6.2010,  20:56 Найти цитируемый пост)
я так понимаю так не правильно?
Как минимум неправильно с Mutax'ами - он должен быть один, а вас их 2 штуки

Во вторых тут Mutex вообще не нужен - вам надо послать в thread (HookThreadRoutine) сообщение, и проверять его надо не по wParam, а по коду сообщения


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0957 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.