win32api: временно заблокировать щелчки мыши?

Есть ли способ отключить обычные щелчки мыши в Windows с помощью win API? Я могу отключить щелчки в любом месте, кроме определенной точки, выполнив ClipCursor, но щелчки все равно регистрируются.

В качестве альтернативы я также хочу условно отключить щелчки мышью... например, я хочу сделать невозможным закрытие окна приложения, которое я не контролирую, поэтому я хочу, чтобы щелчки, отправленные на «X» этого окна, не шли через.


person Claudiu    schedule 22.02.2011    source источник
comment
Есть веская причина, по которой это трудно сделать. Вы не должны этого делать вообще. Что бы вы ни пытались решить, попробуйте лучшее решение. Даже идея предотвращения закрытия приложения настолько плоха. Вы просто будете поощрять уничтожение приложения через диспетчер задач. Как насчет ALT+F4 или ALT+f,x?   -  person tenfour    schedule 22.02.2011
comment
@tenfour: я хочу только предотвратить случайное закрытие окна с помощью кнопки «X».   -  person Claudiu    schedule 22.02.2011
comment
Затем зарегистрируйте обработчик событий и отобразите диалоговое окно с запросом подтверждения. не запрещайте пользователю закрывать окно, если он действительно этого хочет.   -  person Chinmay Kanchi    schedule 22.02.2011
comment
Этот вопрос и ваш предыдущий вопрос (stackoverflow.com/questions/5080777) будут намного лучше, если вы объясните, что вы на самом деле пытаясь сделать. Я уже спрашивал тебя, почему ты не можешь нам сказать? Или, если вы просто не будете, почему бы вам не заявить об этом.   -  person David Heffernan    schedule 22.02.2011
comment
@David: сценарий заключается в том, что человек сидит за компьютером и использует приложение X, для которого требуется много щелчков мышью. моя программа взаимодействует с приложением Y, работающим на том же компьютере, и для взаимодействия с ним она должна непрерывно выполнять такие действия, как ввод данных. это должно работать, пока пользователь сидит там и нажимает на приложение X. У меня нет кода для приложения Y, поэтому я не могу сделать это аккуратно с вызовами API или чем-то еще.   -  person Claudiu    schedule 22.02.2011


Ответы (1)


Можно, и это очень опасно. Вот как в С++

LRESULT __stdcall LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if ((nCode < 0) || false)
    {
        result = CallNextHookEx(myLowLevelMouseHookHandle, nCode, wParam, lParam);
    }

    return result;
}

Измените false в приведенном выше примере, чтобы снова включить клавиатуру.

Кстати, этот метод также работает с вводом с клавиатуры, даже Ctrl+Alt+Del не работает.

Если вы хотите разрешить движение мыши, но блокировать только щелчки, добавьте код if ((wParam == WM_MOUSEMOVE) || (wParam == WM_NCMOUSEMOVE)).

Дополнительные сведения см. на странице http://msdn.microsoft.com/en-us/library/ms644986(VS.85).aspx

person servermanfail    schedule 22.02.2011
comment
Я предполагаю, что мне нужно sethookex или что-то в этом роде, чтобы ОС что-то делала с этой функцией? - person Claudiu; 22.02.2011
comment
Правильно: myLowLevelMouseHookHandle = SetWindowsHookEx(WH_MOUSE_LL, &LowLevelMouseProc, myInstance, 0); myLowLevelMouseHookInstalled = (myLowLevelMouseHookHandle != NULL); - person servermanfail; 22.02.2011