Как я могу установить положение курсора от мыши в Windows?

Я довольно новичок, когда дело доходит до C ++, поэтому со мной все в порядке. Я пытаюсь создать небольшое приложение, которое будет определять, когда курсор мыши перемещается к краю экрана, и перемещает его к противоположному краю, чтобы создать непрерывный эффект рабочего стола, если это имеет смысл.

Ниже приведен некоторый код от кого-то другого (часть «ловушка мыши»), которую я адаптировал, добавив SetCursorPos, чтобы на данный момент переместить мышь в фиксированное положение. Когда я запускаю его, SetCursorPos возвращает true, что, как я предполагаю, означает, что вызов выполнен успешно, но мышь не двигается. Я где-то читал что-то об ограничениях безопасности в более поздней версии Windows, предотвращая подобные вещи, что имело бы смысл, но источник был неясен, насколько это правда. Кто-нибудь знает, почему это не будет работать?

Спасибо, код ниже:

#define _WIN32_WINNT 0x0400
#pragma comment( lib, "user32.lib" )

#include <windows.h>
#include <stdio.h>

HHOOK hMouseHook;

__declspec(dllexport) LRESULT CALLBACK KeyboardEvent (int nCode, WPARAM wParam, LPARAM lParam)
{
MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lParam;
if (pMouseStruct != NULL)
{
if (pMouseStruct->pt.x < -1900)
{
BOOL r = SetCursorPos(
500,
500
);

printf("Trigger %d.  Response %d", pMouseStruct->pt.x, r);
}
}

return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}

void MessageLoop()
{
MSG message;
while (GetMessage(&message,NULL,0,0)) {
TranslateMessage( &message );
DispatchMessage( &message );
}
}

DWORD WINAPI MyMouseLogger(LPVOID lpParm)
{
HINSTANCE hInstance = GetModuleHandle(NULL);
if (!hInstance) hInstance = LoadLibrary((LPCSTR) lpParm);
if (!hInstance) return 1;

hMouseHook = SetWindowsHookEx (
WH_MOUSE_LL,
(HOOKPROC) KeyboardEvent,
hInstance,
NULL
);
MessageLoop();
UnhookWindowsHookEx(hMouseHook);
return 0;
}

int main(int argc, char** argv)
{
HANDLE hThread;
DWORD dwThread;

hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)
MyMouseLogger, (LPVOID) argv[0], NULL, &dwThread);
if (hThread)
return WaitForSingleObject(hThread,INFINITE);
else return 1;
}

2

Решение

Это кажется проблемой с вызовом SetCursorPos в вашей процедуре ловушки. Я предполагаю, что это явно запрещено в Vista / Windows 7, но я не смог найти никакой документации, подтверждающей это. Я немного изменил ваш код, чтобы опубликовать сообщение о потоке, когда он хочет переместить курсор, и выполнить фактический SetCursorPos внутри вашего сообщения. Это работает нормально, как только это будет сделано.

В вашей процедуре подключения:

if (pMouseStruct->pt.x < -1900)
{
PostThreadMessage( GetCurrentThreadId(), WM_USER, 0, 0 );
printf("Trigger %d.  Response %d", pMouseStruct->pt.x, r);
}

В вашем цикле сообщений:

while (GetMessage(&message,NULL,0,0)) {
if( message.hwnd == NULL ) {
if( message.message == WM_USER ) {
SetWindowPos( 500, 500 );
}
} else {
TranslateMessage( &message );
DispatchMessage( &message );
}
}

(Обратите внимание, что это просто демонстрация, а не фактическое исправление.)

Тем не менее, есть много серьезных проблем с вашим кодом. Я не думаю, что здесь уместно вдаваться во все из них, но я рекомендую вам опубликовать это на https://codereview.stackexchange.com/.

3

Другие решения

Похоже, вам нужно перевести координаты.
в соответствии с документами вам нужно позвонить ClientToScreen или же ScreenToClient перевести точку. Я не знаю, какое окно является ссылкой. Вам нужно передать этот дескриптор окна как точку (как выходной параметр) как параметр. а затем использовать измененную точку с SetCursorPos

проверять пример

Если вы хотите экран, который вы должны сделать GetDC(NULL) и передать возвращенную ручку ClientToScreen

0

По вопросам рекламы [email protected]