какао - экран не обновляется после нажатия кнопки CGEventPost - PullRequest
4 голосов
/ 13 июня 2011

Я программно генерирую щелчки мышью, когда пользователь нажимает определенную клавишу клавиатуры (CapsLock). Поэтому я делаю левую кнопку мыши, когда CapsLock включен, затем левую кнопку мыши, когда CapsLock выключен.

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

Однако есть одна проблема - окно не перемещается, пока я двигаю мышь, оно перемещается в конечную позицию только после того, как я нажму CapsLock во второй раз. то есть после того, как я «отпустил» кнопку мыши.

Что мне нужно сделать, чтобы экран обновлялся при перемещении мыши?

Интересно, я тоже подсел на

[NSEvent addGlobalMonitorForEventsMatchingMask: NSLeftMouseDraggedMask

и обнаружил, что мой оператор NSLog выводит только после Я отпустил левую кнопку мыши (настоящая левая кнопка мыши)

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

// simulate mouse down

// get current mouse pos
CGEventRef ourEvent = CGEventCreate(NULL);
CGPoint point = CGEventGetLocation(ourEvent);
NSLog(@"Location? x= %f, y = %f", (float)point.x, (float)point.y);

CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
CGEventRef theEvent = CGEventCreateMouseEvent(source, kCGEventLeftMouseDown, point, kCGMouseButtonLeft);
CGEventSetType(theEvent, kCGEventLeftMouseDown);
CGEventPost(kCGHIDEventTap, theEvent);
CFRelease(theEvent);


// simulate mouse up

// get current mouse pos
CGEventRef ourEvent = CGEventCreate(NULL);
CGPoint point = CGEventGetLocation(ourEvent);
NSLog(@"Location? x= %f, y = %f", (float)point.x, (float)point.y);

CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
CGEventRef theEvent = CGEventCreateMouseEvent(source, kCGEventLeftMouseUp, point, kCGMouseButtonLeft);
CGEventSetType(theEvent, kCGEventLeftMouseUp);
CGEventPost(kCGHIDEventTap, theEvent);
CFRelease(theEvent);

1 Ответ

7 голосов
/ 23 июня 2011

Если вы хотите иметь возможность перетаскивать окна, проблема в том, что вам также необходимо опубликовать событие LeftMouseDragged.

Просто позвоните beginEventMonitoring, чтобы начать прослушивание событий нажатия клавиш Caps Lock и перемещения мыши.События.Обработчики событий будут имитировать левое нажатие и движение мыши так, как вы хотели.Вот ссылка на мой блог, где вы можете скачать полный рабочий пример для Xcode 4: http://www.jakepetroules.com/2011/06/25/simulating-mouse-events-in-cocoa

Пример находится в свободном доступе, делайте с ним что угодно.:)

Согласно Apple ( документация NSEvent ), «Включить доступ для вспомогательных устройств» необходимо проверить в «Системных настройках»> «Универсальный доступ», чтобы это работало, но у меня естьэто не проверено, и это не было проблемой.Просто на голову.

Пожалуйста, дайте мне знать, если у вас возникнут какие-либо проблемы, и я сделаю все возможное, чтобы помочь.

// Begin listening for caps lock key presses and mouse movements
- (void)beginEventMonitoring
{
    // Determines whether the caps lock key was initially down before we started listening for events
    wasCapsLockDown = CGEventSourceKeyState(kCGEventSourceStateHIDSystemState, kVK_CapsLock);

    capsLockEventMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSFlagsChangedMask) handler: ^(NSEvent *event)
    {
        // Determines whether the caps lock key was pressed and posts a mouse down or mouse up event depending on its state
        bool isCapsLockDown = [event modifierFlags] & NSAlphaShiftKeyMask;
        if (isCapsLockDown && !wasCapsLockDown)
        {
            [self simulateMouseEvent: kCGEventLeftMouseDown];
            wasCapsLockDown = true;
        }
        else if (wasCapsLockDown)
        {
            [self simulateMouseEvent: kCGEventLeftMouseUp];
            wasCapsLockDown = false;
        }
    }];

    mouseMovementEventMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSMouseMovedMask) handler:^(NSEvent *event)
    {
        [self simulateMouseEvent: kCGEventLeftMouseDragged];
    }];
}

// Cease listening for caps lock key presses and mouse movements
- (void)endEventMonitoring
{
    if (capsLockEventMonitor)
    {
        [NSEvent removeMonitor: capsLockEventMonitor];
        capsLockEventMonitor = nil;
    }

    if (mouseMovementEventMonitor)
    {
        [NSEvent removeMonitor: mouseMovementEventMonitor];
        mouseMovementEventMonitor = nil;
    }
}

-(void)simulateMouseEvent:(CGEventType)eventType
{
    // Get the current mouse position
    CGEventRef ourEvent = CGEventCreate(NULL);
    CGPoint mouseLocation = CGEventGetLocation(ourEvent);

    // Create and post the event
    CGEventRef event = CGEventCreateMouseEvent(CGEventSourceCreate(kCGEventSourceStateHIDSystemState), eventType, mouseLocation, kCGMouseButtonLeft);
    CGEventPost(kCGHIDEventTap, event);
    CFRelease(event);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...