Как заблокировать правую кнопку мыши и без промедления конвертировать в кнопку средней мыши (например, Autohotkey)?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как заблокировать правую кнопку мыши и без промедления конвертировать в кнопку средней мыши (например, Autohotkey)?

Сообщение Anonymous »

Я пытаюсь перенести правую кнопку мыши, чтобы действовать как кнопка средней мыши в C ++ в Windows. < /p>
Что я сделал < /h3>

Я написал код, используя необработанный ввод (см. Ниже). происходит в то же время, поэтому я получаю как с правой кнопкой, так и с средним щелчком. как переигрывание Autohotkey. < /li>
< /ul>
Что я хочу < /h3>

Когда я нажимаю правую кнопку мыши, я хочу полностью блокировать исходную кнопку правой стороны. Как будто я физически нажал среднюю кнопку. /> Поведение должно быть мгновенным и естественным, без заметной задержки, точно так же, как если я физически нажимал среднюю кнопку.#include
#include

// SendInput to simulate middle click
void SendMiddleClick(bool down) {
INPUT input = { 0 };
input.type = INPUT_MOUSE;
input.mi.dwFlags = down ? MOUSEEVENTF_MIDDLEDOWN : MOUSEEVENTF_MIDDLEUP;
SendInput(1, &input, sizeof(INPUT));
}

// Window procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
if (msg == WM_INPUT) {
UINT dwSize = 0;
GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));
if (dwSize > 0) {
BYTE* lpb = new BYTE[dwSize];
if (GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)) == dwSize) {
RAWINPUT* raw = (RAWINPUT*)lpb;
if (raw->header.dwType == RIM_TYPEMOUSE) {
auto flags = raw->data.mouse.usButtonFlags;
if (flags & RI_MOUSE_RIGHT_BUTTON_DOWN) SendMiddleClick(true);
if (flags & RI_MOUSE_RIGHT_BUTTON_UP) SendMiddleClick(false);
}
}
delete[] lpb;
}
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}

int main() {
WNDCLASS wc = { 0 };
wc.lpfnWndProc = WndProc;
wc.hInstance = GetModuleHandle(NULL);
wc.lpszClassName = TEXT("RawInputDemo");
RegisterClass(&wc);

HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("Raw Input Window"),
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
300, 200, NULL, NULL, wc.hInstance, NULL);

RAWINPUTDEVICE rid;
rid.usUsagePage = 0x01;
rid.usUsage = 0x02;
rid.dwFlags = RIDEV_INPUTSINK;
rid.hwndTarget = hwnd;
RegisterRawInputDevices(&rid, 1, sizeof(rid));

MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... without-de
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»