Global de mouse movido Eventos em Cocoa
-
06-07-2019 - |
Pergunta
Existe uma maneira de se inscrever para rato global de eventos movidos em Cocoa? Eu era capaz de se inscrever para os eventos usando InstallEventHandler()
de carbono, mas preferiria um cacau equivalente. Eu olhei para eventos NSNotificationCenter
, mas não parece haver quaisquer nomes de eventos públicos (estão lá os privados?)
Como alternativa, há uma maneira de usar NSTrackingArea
de pontos de vista com um fundo clearColor
?
O aplicativo só está Snow Leopard.
Solução
Em SnowLeopard há um novo método de classe em NSEvent
que faz exatamente o que você quer: + (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block
. Você vai querer mask = NSMouseMovedMask
.
Outras dicas
Uma pergunta semelhante já foi perguntado sobre StackOverflow: Como fazer um NSView subclasse alça transparente eventos de mouse?
Para resumir, o método de vista tansparent não funcionou. Quartzo Taps eventos parecem ser a melhor resposta.
Aqui estão algumas dicas sobre como trabalhar com torneiras:
-
Criar a torneira com
CGEventTapCreate
.
a) Para a localização (primeiro) parâmetro que você provavelmente vai querer usarkCGSessionEventTap
.
b) Para a colocação (segundo) parâmetro que você provavelmente vai quererkCGHeadInsertEventTap
.
c) Para o parâmetro máscara evento, tente(1 << kCGEventMouseMoved)
. -
Crie uma fonte de loop de execução com
CFMachPortCreateRunLoopSource
, passando a torneira evento como o segundo parâmetro. -
Adicionar a fonte de loop de execução para o loop de execução. Supondo que você quer que ele adicionado ao ciclo de processamento principal, faça:
CFRunLoopAddSource(CFRunLoopGetMain(), sourceFromStep2, kCFRunLoopDefaultMode);
-
Ativar a torneira evento com
CGEventTapEnable
Se você deseja controlar o mouse, não importa onde ele está, você quer um CGEventTap. Não há Cacau equivalente. Se você só quer segui-lo em sua aplicação, então você deve explicar por que você está encontrando-se incapaz de fazê-lo um pouco mais profundamente.