2012-04-19 66 views
1

我创建了一个可视化应用程序,该应用程序具有带文本字段的窗口以获取用户输入,这是一个小键盘图标按钮,用于显示键盘查看器。当用户点击确定或取消按钮完成时,我想隐藏键盘查看器。我所做的就是如下:编程地在Mac OS X上切换键盘查看器

//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在任何时候都被隐藏。请帮忙!!!

+1

您在MacOS中显示的“键盘查看器”并不意味着与iOS中的弹出式键盘使用相同的方式,而且我非常确定它无法通过编程方式轻松解决。如果没有其他人提出更好的解决方案,我可能会研究一下如何通过Apple Events或Apple Script解雇它。 – 2012-04-19 09:09:12

+0

嗨迈克尔,我只是无法找到Mac OS上的开源虚拟键盘或任何关于如何实现它的文档。我尝试过使用NSAppleScript类的applescript方法(参考[this](http://patjack.co.uk/toggle-keyboard-viewer-in-snow-leopard-10-6/)),但它不起作用。你可以在这里发表一个真正有用的applescript吗?或者关于如何在可可中实现虚拟键盘的一些建议?提前感谢! – leochou0729 2012-04-19 09:58:17

+0

@ leochou0729:你是否有特别的理由想要展示虚拟键盘? – 2012-04-20 20:34:19

回答

0

可以以编程方式隐藏键盘查看器。不久前,我为我的媒体中心制作了一个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 

这将使用辅助工具,所以你需要有“启用辅助设备的访问”,才能开启它的工作。

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

+0

但是,即使在关闭键盘查看器的窗口后,键盘查看器的过程仍在运行,您需要退出:*退出应用程序“KeyboardViewer”* – Binarian 2013-11-07 16:25:20