使用 C# 和 Xamarin 按下 F8(播放)按钮后阻止 iTunes / Music.app 启动
Posted
技术标签:
【中文标题】使用 C# 和 Xamarin 按下 F8(播放)按钮后阻止 iTunes / Music.app 启动【英文标题】:Prevent iTunes / Music.app Start After Pressing F8(Play) Button with C# & Xamarin 【发布时间】:2020-03-09 04:15:30 【问题描述】:我们知道,如果我们按下 F8(播放)键盘按钮,iTunes 或 Music .app 在 macOS 上默认打开。一些 Swift 类可用于阻止此键盘快捷键,但它们与 C# 和 Xamarin 不兼容。例如,Spotify macOS 应用程序具有此能力。如果您在 UI 上按下播放按钮一次,它将控制 iTunes 并处理“播放”按钮键事件。
我有这个代码块。但是,由于 iTunes,macOS 无法触发代码块。其他键(如字母和数字)正常工作:
private NSEvent KeyboardEventHandler(NSEvent theEvent)
ushort keyCode = theEvent.KeyCode;
if(keyCode== 100) //rbKeyF8 100 is play button.
switch (isplaying)
case true:
StopMusic();
break;
case false:
PlayMusic();
break;
// NSAlert a = new NSAlert()
//
// AlertStyle = NSAlertStyle.Informational,
// InformativeText = "You press the " + keyCode + " button :)",
// MessageText = "Hi"
//;
//a.RunModal();
return theEvent;
我们如何用 C# 做到这一点?谢谢。
【问题讨论】:
您需要在您的 NSApplication 类中覆盖SendEvent
并捕获(和处理)任何 NSEvent.SystemDefined 事件并确定按下了哪些媒体键等...我没有我的 Xamarin .Mac 代码很方便,但我最初转换了一些 Swift 代码,最后还查看了 SPMediaKeyTap
的 ObjC 代码(在 Github 上)。
我无法在 AppDelegate.cs 和 ViewController.cs 中覆盖 SendEvent。我会在哪里覆盖它?谢谢@SushiHangover
【参考方案1】:
答案是: 注册一个新的子类
[Register ("App")]
public class App : NSApplication
public App (System.IntPtr p) : base (p)
public override void SendEvent (NSEvent theEvent)
base.SendEvent (theEvent);
在 Info.plist 中更改 PrincipalClass
<key>NSPrincipalClass</key>
<string>App</string>
并且需要继承 NSApplication 并查看 sendEvent。您应该将 Swift 代码转换为 C#。相关的快速代码在这里: Make my Cocoa app respond to the keyboard play/pause key?
现在,我有另一个问题。是的,这个代码块解决了我的问题 第一部分。现在我的应用程序响应播放按钮按下。然而,iTunes 在我的应用响应后打开。如何防止它打开?
【讨论】:
如果 iTunes 在 app,s 响应后打开,我认为它们会产生一些冲突,Mac 会优先 iTunes 控制。为避免与 iTunes 快捷方式相同的冲突,您可以尝试其他快捷方式(F6 或组合快捷方式)。以上是关于使用 C# 和 Xamarin 按下 F8(播放)按钮后阻止 iTunes / Music.app 启动的主要内容,如果未能解决你的问题,请参考以下文章
如何让 UIView / Menu 滑入和滑出? (使用 C# 而不是 Swift 的 Xamarin IOS)