2015-05-22 2 views
0

У меня есть рабочий код (here), который перехватывает коды ключей для событий, не связанных с модификатором, и событий с измененным изменением.Ловушка каждый ключ SHIFT независимо от OS X

Но если вы делаете:

LSHIFT down -> RSHIFT down -> RSHIFT up -> LSHIFT up 

... 2 внутренних действия не будут вызывать либо из этих крюков, потому что состояние модификатора не меняется!

(EDIT: Woops я испытал, что из прежде чем писать, потому что на самом деле новый модификатор изменен производится каждым реальным изменением.)

Моя единственная мысль, может быть дополнительно смотреть на еще нижний уровень (here) - но это не выглядит красиво, независимо от того, с какого угла я его смотрю.

+0

Нет, у них есть отдельные коды ключей. Я подтвердил это, выполнив код во второй ссылке. –

+1

Предполагая, что вы создаете приложение Cocoa с Obj-C (учитывая тег OSX), вы можете использовать код [здесь] (http://stackoverflow.com/questions/10715910/is-there-a-way-to-differentiate -between-влево и вправо-Shift-ключи благополучие нажима). Внедрите '- (void) flagsChanged: (NSEvent *)' и проверьте '[theEvent modifiers]'. LShift - 131330, а RShift - 131332 – Arc676

+0

@ Arc676, вы молодец! Я только что проверил, и он действительно правильно изолирует события L & R Shift. Даже такие композиты, как + L + R-L-R и + L + R-R-L. Если вы ответите, я с радостью приму это. –

ответ

2

Взятые из ответа Джастина Бу here

я добавил еще несколько модификаторов только в случае, если кто-то натыкается на это и хочет другие ключи, а также.

- (void) flagsChanged:(NSEvent*)theEvent{ 
    if ([theEvent modifier] == 131330){ 
     //do stuff regarding left shift 
    }else if ([theEvent modifier] == 131332){ 
     //do stuff regarding right shift 
    }else if ([theEvent modifier] == 65792){ 
     //caps lock is on 
    }else if ([theEvent modifier] == 8388864){ 
     //FN key pressed 
    }else if ([theEvent modifier] == 262401){ 
     //control key pressed 
    }else if ([theEvent modifier] == 524576){ 
     //option key pressed 
    }else if ([theEvent modifier] == 1048840){ 
     //command key pressed 
    }else if ([theEvent modifier] == 256){ 
     //there are no modified pressed and caps lock is off 
    } 
} 

Я рекомендую хранить некоторые BOOL с в своем классе, такие как LShiftDown и RShiftDown, поскольку этот метод должен быть вызван, когда модификаторы нажимаются. Вероятно, вы также можете обнаружить это свойство в своей реализации keyDown, чтобы обнаружить различия, такие как «a» и «A».

Смежные вопросы