#c #winapi
Вопрос:
Как мне «заблокировать» WM_LBUTTONDOWN
сообщение, которое должно быть отправлено?
Функция находится внутри библиотеки dll, я также пытался использовать LowLevelMouseProc
ее, но она не работает с кодом ошибки: 1429
что означает «глобальный только крюк».
- Я не владею этим окном, о котором идет речь.
Я попытался вернуть a WM_NULL
в приведенном ниже коде, но это также не работает, что еще я мог бы попробовать?
extern "C" __declspec(dllexport) LRESULT CALLBACK mouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
MSLLHOOKSTRUCT* mhs = nullptr;
int x = 0;
int y = 0;
std::wstringstream ss;
std::wstringstream ss2;
if (nCode == HC_ACTION)
{
switch (wParam)
{
case WM_LBUTTONDOWN:
ss << L"nWM_LBUTTONDOWN " << wParam;
wParam = WM_NULL;
break;
case WM_LBUTTONUP:
ss << L"nWM_LBUTTONUP " << wParam;
break;
case WM_MOUSEMOVE:
break;
case WM_RBUTTONDOWN:
ss << L"nWM_RBUTTONDOWN: " << wParam;
break;
case WM_RBUTTONUP:
ss << L"nWM_RBUTTONUP: " << wParam;
break;
default:
ss << L"nUnknown msg: " << wParam;
break;
}
}
OutputDebugString(ss.str().c_str());
mhs = reinterpret_cast<MSLLHOOKSTRUCT*>(lParam);
x = mhs->pt.x;
y = mhs->pt.y;
ss2 << L"nx: " << x << L" y: " << y;
OutputDebugString(ss2.str().c_str());
return CallNextHookEx(NULL, nCode, wParam, lParam);
Ответ №1:
Согласно документации по MouseProc
функции обратного вызова:
Если nCode больше или равен нулю, а процедура подключения не обработала сообщение, настоятельно рекомендуется вызвать CallNextHookEx и вернуть возвращаемое значение; в противном случае другие приложения, установившие крючки WH_MOUSE, не будут получать уведомления о подключении и в результате могут вести себя неправильно. Если процедура hook обработала сообщение, она может вернуть ненулевое значение, чтобы система не передала сообщение процедуре целевого окна.
Что касается вашей WH_MOUSE_LL
ошибки, вы не можете установить этот крючок для конкретного потока, только в глобальном масштабе.