【问题标题】:Toggle Keyboard Viewer on Mac OS X programmatically以编程方式切换 Mac OS X 上的键盘查看器
【发布时间】:2012-04-30 18:34:02
【问题描述】:

我创建了一个可可应用程序,它有一个带有文本字段的窗口来获取用户输入,还有一个小键盘图标按钮来调出键盘查看器。当用户单击确定或取消按钮完成时,我想隐藏键盘查看器。我所做的如下:

//action for keyboard-icon button
-(IBAction)input:(id)sender
{
    [self toggleKeyboard:YES];
}

//action for Cancel button
-(IBAction)cancel:(id)sender
{
    [self toggleKeyboard:NO];
    [NSApp abortModal];
    [[self window] orderOut: self];
}

//action for OK button
-(IBAction)ok:(id)sender
{
    [self toggleKeyboard:NO];
    [NSApp stopModal];
    [[self window] orderOut: self];
}


-(void)toggleKeyboard:(BOOL)show
{
    NSDictionary *property = [NSDictionary dictionaryWithObject:(NSString*)kTISTypeKeyboardViewer
                                                  forKey:(NSString*)kTISPropertyInputSourceType];
    NSArray *sources = (NSArray*)TISCreateInputSourceList((CFDictionaryRef)property, false);

    TISInputSourceRef keyboardViewer = (TISInputSourceRef)[sources objectAtIndex:0];
    if (show == YES)
    {
        TISSelectInputSource(keyboardViewer);
    }
    else 
    {
        TISDeselectInputSource(keyboardViewer);
    }

    CFRelease((CFTypeRef)sources);

}

我可以成功启动键盘查看器,但 TISDeselectInputSource 无法始终隐藏它。

【问题讨论】:

  • 您在 MacOS 中显示的“键盘查看器”的使用方式与 iOS 中的弹出式键盘不同,我很确定它不能以编程方式轻松关闭.如果没有其他人提出更好的解决方案,我可能会研究一下如何通过 Apple Events 或 Apple Script 将其关闭。
  • 嗨迈克尔,我只是在 Mac OS 上找不到开源虚拟键盘或任何有关如何实现它的文档。我已经尝试过使用 NSAppleScript 类的 applescript 方法(请参阅 this ),但它不起作用。你能在这里给出一个真正有效的applescript吗?或者关于如何在可可中实现虚拟键盘的一些建议?提前非常感谢!
  • @leochou0729:您尝试显示虚拟键盘是否有特殊原因?
  • 我使用firebreath框架创建了一个跨平台的NPAPI插件,它可以弹出一个模式对话框来获取用户凭据。在 Windows 中,出于安全原因(例如针对键盘记录器),用户可以直接输入密码或选择软键盘作为附加选项。所以我必须在 MAC OS 上实现同样的东西。只是消费者的需求。
  • 有人能给出一个关于如何在可可中实现虚拟键盘的非常基本的示例代码吗?我一直在谷歌搜索,但没有找到答案:(

标签: macos cocoa keyboard viewer


【解决方案1】:

可以通过编程方式隐藏键盘查看器。不久前,我为我的媒体中心制作了一个 AppleScript,它将切换它。我不会包含显示它的部分,部分原因是您已经弄清楚了,但主要是因为我这样做的方式是调用一些我不记得我从哪里得到它的可执行文件。

无论如何,这是 AppleScript:

tell application "System Events"
    if exists (process "Keyboard Viewer") then
        click (process "Keyboard Viewer"'s window 1's buttons whose subrole is "AXCloseButton")
    end if
end tell

这使用了辅助功能,因此您需要打开“启用辅助设备的访问权限”才能使其工作。

请注意,同样的事情可以在 Objective-C / C++ 应用程序中使用 Accessibility API 完成,您可以使用它来避免在应用程序中调用 AppleScript。

【讨论】:

  • 但是即使关闭了键盘查看器的窗口,键盘查看器的进程仍在运行。你需要退出它:quit application "KeyboardViewer"
猜你喜欢
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2015-03-22
相关资源
最近更新 更多