2014-10-08 4 views
1

Я пишу кросс-платформенное приложение, которое в определенном состоянии управляет всеми пользовательскими вводами в течение определенного периода времени.Как захватить мышь на Windows

В GNU/Linux я использовал gtk +, что позволяет мне извлекать события мыши и клавиатуры, такие как движение или нажатия. Это то, что мне нужно, поскольку мое приложение реагирует на них. Он также имеет небольшой графический интерфейс, созданный с помощью gtk +.

Я пытался захватить ввод мыши в Windows без успеха, так как gtk действительно хорошо работает графически, но не захватывает пользовательский ввод. Я попытался с помощью BlockIntput(), но он не работает, как ожидалось, потому что:

  1. мне нужен администратор привилегированности, чтобы запустить приложение
  2. Я не могу прочитать мышь, ни клавиатура ввода

ли есть способ захватить ввод мыши и клавиатуры на окнах и все еще иметь возможность читать свои входы без административных прав?

+1

Вы хотите что-то ищите? http://stackoverflow.com/questions/1789883/grab-exclusive-release-mouse-in-application-windows-c Или даже это: http://msdn.microsoft.com/en-us/library/windows/desktop /ms645533(v=vs.85).aspx – marc

ответ

1

Наконец-то я нашел решение, соответствующее моим требованиям. Одна из ссылок Marc привела меня к использованию крючков в Windows, которые я уже пробовал без успеха, но в итоге я их реализовал как для захвата клавиатуры, так и для мыши.

код

My Windows использует окна библиотеки, и когда мне нужно заблокировать ввод создать поток, который вызывает функцию:

DWORD dwThread; 
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MouseHooker, NULL, 0, &dwThread); 

Затем я установить крюк:

DWORD WINAPI MouseHooker(LPVOID lpParameter) { 
HINSTANCE hExe = GetModuleHandle(NULL); 

//The thread's parameter is the first command line argument which is the path to our executable. 
if (!hExe) //If it fails we will try to actually load ourselves as a library. 
    hExe = LoadLibrary((LPCSTR) lpParameter); 
if (!hExe) 
    return 1; 
//Install the hook as a low level mouse hook thats calls mouseEvent 
hMouseHook = SetWindowsHookEx (WH_MOUSE_LL, (HOOKPROC)MouseEvent, hExe, 0); 
... 
UnhookWindowsHookEx(hMouseHook); 
return 0; 

}

И на каждый код события мыши вызывается:

if (nCode == HC_ACTION && ...) { //HC_ACTION means we may process this event, we may add specific mouse events 
    //We block mouse input here and do our thing 
} 
//return CallNextHookEx(hKeyHook, nCode, wParam, lParam); 
return 1; 

Так как мы не продолжаем с вводом цепи крюка, никогда не обрабатывается, и рабочая станция блокируется.

Код работает на Windows 7, как ожидалось. Я продолжал использовать gtk + в Windows, поскольку я все еще могу генерировать свой графический интерфейс и извлекать входы мыши с помощью gdk. В коде GNU/Linux работает только с использованием библиотек GTK +, поскольку у меня не было проблем при захвате ввода.

Смежные вопросы