在本文中,我们将详细介绍MacOSX的系统范围快捷键的各个方面,并为您提供关于mac系统快捷键大全的相关解答,同时,我们也将为您带来关于cocoa–如何在MacOSX下捕获/发布系统范围的键盘/鼠标事
在本文中,我们将详细介绍Mac OS X的系统范围快捷键的各个方面,并为您提供关于mac系统快捷键大全的相关解答,同时,我们也将为您带来关于cocoa – 如何在Mac OS X下捕获/发布系统范围的键盘/鼠标事件?、Idea for Mac 快捷键(快捷键选择:Mac OS X 10.5+)、Java系统范围内的键盘快捷键、Linux上的Python中的系统范围互斥的有用知识。
本文目录一览:- Mac OS X的系统范围快捷键(mac系统快捷键大全)
- cocoa – 如何在Mac OS X下捕获/发布系统范围的键盘/鼠标事件?
- Idea for Mac 快捷键(快捷键选择:Mac OS X 10.5+)
- Java系统范围内的键盘快捷键
- Linux上的Python中的系统范围互斥
Mac OS X的系统范围快捷键(mac系统快捷键大全)
因此,我被要求将一些内部帮助程序移植到Mac OS X 10.7。
由于与平台相关的代码很少,因此可以很好地运行,但是一个应用程序需要系统范围的快捷功能(即RegisterHotkey功能),而且我找不到在Mac上如何实现此功能的任何文档。
该程序在Python 3.2中使用了PyQt gui。Windows的相应代码基本上是:
def register_hotkey(self): hwnd = int(self.winId()) modifiers, key = self._get_hotkey() user32.RegisterHotKey(hwnd, self._MESSAGE_ID, modifiers, key)
然后接收热键事件:
def winEvent(self, msg): if msg.message == w32.WM_HOTKEY: self.handle_hotkey() return True, id(msg) return False, id(msg)
注意,我不需要python变体,我可以轻松编写一个简单的c扩展名-因此也欢迎使用C / objective-c解决方案。
答案1
小编典典我最近对quodlibet捕获多媒体密钥的扩展进行了编码(因为已经吸收到quodlibet本身中了);对于您的设置,将应用相同的过程。
我使用了QuartzCGEventTapCreate
钩子和事件循环,以及Cocoa
AppKit框架来解密实现此目的的关键代码。
以下代码注册通过全局按键传递的python回调,并启动事件循环:
import Quartzfrom AppKit import NSKeyUp, NSSystemDefined, NSEvent# Set up a tap, with type of tap, location, options and event masktap = Quartz.CGEventTapCreate( Quartz.kCGSessionEventTap, # Session level is enough for our needs Quartz.kCGHeadInsertEventTap, # Insert wherever, we do not filter Quartz.kCGEventTapOptionListenOnly, # Listening is enough Quartz.CGEventMaskBit(NSSystemDefined), # NSSystemDefined for media keys keyboardTapCallback, None)runLoopSource = Quartz.CFMachPortCreateRunLoopSource(None, tap, 0)Quartz.CFRunLoopAddSource( Quartz.CFRunLoopGetCurrent(), runLoopSource, Quartz.kCFRunLoopDefaultMode)# Enable the tapQuartz.CGEventTapEnable(tap, True)# and run! This won''t return until we exit or are terminated.Quartz.CFRunLoopRun()
我只为系统定义的按键(媒体按键)定义了一个抽头。您必须指定其他事件掩码(CGEventMaskBit
具有一种或多种事件类型);例如Quartz.CGEventMaskBit(Quartz.kCGEventKeyUp)
按键事件。
回调应该具有以下签名(它实现CGEventTapCallBack
了Quartz
API中的方法:
def keyboardTapCallback(proxy, type_, event, refcon): # Convert the Quartz CGEvent into something more useful keyEvent = NSEvent.eventWithCGEvent_(event)
我将Quartz事件转换为NSEvent
,因为我在Mac多媒体键上可以找到的所有信息都引用了该类。
原则上,您也可以使用AppKit
API实现相同的操作,但是您的Python应用程序被视为Mac应用程序(在Dock中带有图标和所有内容可见),而我希望将其完全保留在后台。
cocoa – 如何在Mac OS X下捕获/发布系统范围的键盘/鼠标事件?
我不需要担心菜单或跟踪哪个窗口接收输入的标识符.
我知道如何在Windows下执行此操作,但不知道Mac OS X.
解决方法
这是我在我的一个应用程序中使用的代码snippit:
//this method calls a carbon method to attach a global event handler - (void)attachEventHandlers { //create our event type spec for the keyup Eventtypespec eventType; eventType.eventClass = kEventClassKeyboard; eventType.eventKind = kEventRawKeyUp; //create a callback for our event to fire in EventHandlerUPP handlerFunction = NewEventHandlerUPP(globalKeyPress); //install the event handler Osstatus err = InstallEventHandler(GetEventMonitorTarget(),handlerFunction,1,&eventType,self,NULL); //error checking if( err ) { //Todo: need an alert sheet here NSLog(@"Error registering keyboard handler...%d",err); } //create our event type spec for the mouse events Eventtypespec eventTypeM; eventTypeM.eventClass = kEventClassMouse; eventTypeM.eventKind = kEventMouseUp; //create a callback for our event to fire in EventHandlerUPP handlerFunctionM = NewEventHandlerUPP(globalmousepress); //install the event handler Osstatus errM = InstallEventHandler(GetEventMonitorTarget(),handlerFunctionM,&eventTypeM,NULL); //error checking if( errM ) { //Todo: need an alert sheet here NSLog(@"Error registering mouse handler...%d",err); } }
这是我正在使用的回调方法的示例:
Osstatus globalKeyPress(EventHandlerCallRef nextHandler,EventRef theEvent,void *userData) { NSEvent *anEvent = [NSEvent eventWithEventRef:theEvent]; NSEventType type = [anEvent type]; WarstrokerApplication *application = (WarstrokerApplication*)userData; //is it a key up event? if( type == NSKeyUp) { //which key is it? switch( [anEvent keyCode] ) { case NUMERIC_KEYPAD_PLUS: //this is the character we are using for our toggle //call the handler function [application toggleKeypressed]; break; //Comment this line back in to figure out the keykode for a particular character default: NSLog(@"Keypressed: %d,**%@**",[anEvent keyCode],[anEvent characters]); break; } } return CallNextEventHandler(nextHandler,theEvent); }
Idea for Mac 快捷键(快捷键选择:Mac OS X 10.5+)
- 删除一行
- 查找
- 查找替换
- 复制一行
- 定位到具体的行列
- 查找类
- 查找任意文件
- 可以在整个工程或着某个目录下面查找字符串
- 大小写转换
- 格式化代码
- 回到上次编辑的地儿
- 重新导入引入包
Java系统范围内的键盘快捷键
是否有任何方法或库来获取系统范围的(全局)键盘快捷方式以在Java应用程序中执行操作?
Linux上的Python中的系统范围互斥
有什么简单的方法可以在Linux上的Python中使用系统范围的互斥锁?“全系统”是指互斥体将由一组Python 进程使用
;这与传统互斥锁相反,传统互斥锁由同一进程中的一组 线程 使用。
编辑:我不确定Python的multiprocessing
软件包是我所需要的。例如,我可以在两个不同的解释器中执行以下命令:
from multiprocessing import LockL = Lock()L.acquire()
当我在两个单独的解释器中同时执行这些命令时,我希望其中之一挂起。相反,它们都没有挂起。看来他们没有获得相同的互斥量。
答案1
小编典典Unix的“传统”答案是使用文件锁。您可以lockf(3)
用来锁定文件的各个部分,以便其他进程无法对其进行编辑。一个非常普遍的滥用是将其用作进程之间的互斥体。python等效项是fcntl.lockf。
传统上,您将锁定过程的PID写入锁定文件,以使由于持有锁定而死的进程导致的死锁是可识别和可修复的。
因为您的锁位于全局名称空间(文件系统)中,并且可用于所有进程,所以这可以满足您的所需。这种方法还具有非Python程序可以参与锁定的好处。缺点是您需要一个放置该锁文件的位置;另外,某些文件系统实际上并没有正确锁定,因此存在无提示无法实现排除的风险。你赢了一些,你输了一些。
今天关于Mac OS X的系统范围快捷键和mac系统快捷键大全的介绍到此结束,谢谢您的阅读,有关cocoa – 如何在Mac OS X下捕获/发布系统范围的键盘/鼠标事件?、Idea for Mac 快捷键(快捷键选择:Mac OS X 10.5+)、Java系统范围内的键盘快捷键、Linux上的Python中的系统范围互斥等更多相关知识的信息可以在本站进行查询。
本文标签: