Программное переключение средства просмотра клавиатуры в 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.


person leochou0729    schedule 19.04.2012    source источник
comment
Средство просмотра клавиатуры, которое вы показываете в MacOS, не предназначено для использования так же, как всплывающая клавиатура в iOS, и я почти уверен, что его нельзя легко отключить программно. Если никто другой не предложит лучшего решения, я мог бы немного изучить, как отклонить его с помощью Apple Events или Apple Script.   -  person Michael Dautermann    schedule 19.04.2012
comment
Привет, Майкл, я просто не могу найти виртуальные клавиатуры с открытым исходным кодом в Mac OS или какую-либо документацию о том, как это реализовать. Я пробовал метод AppleScript (см. этот ), используя класс NSApleScript, но это не работает. Не могли бы вы выдать здесь действительно работающий яблочный скрипт? или какие-нибудь предложения о том, как реализовать виртуальную клавиатуру в какао? Заранее большое спасибо!   -  person leochou0729    schedule 19.04.2012
comment
@ leochou0729: Есть ли особая причина, по которой вы пытаетесь показать виртуальную клавиатуру?   -  person Peter Hosey    schedule 21.04.2012
comment
Я создал кросс-платформенный плагин NPAPI с использованием фреймворка firebreath, который может открывать модальное диалоговое окно для получения учетных данных пользователя. В Windows пользователь может напрямую вводить свои пароли или выбрать виртуальную клавиатуру в качестве дополнительной опции по соображениям безопасности (например, от кейлоггеров). Поэтому я ДОЛЖЕН реализовать то же самое в MAC OS. просто потребительский спрос.   -  person leochou0729    schedule 21.04.2012
comment
Может ли кто-нибудь дать очень простой пример кода о том, как реализовать виртуальную клавиатуру в какао? Я много гуглил и не нашел ответа :(   -  person leochou0729    schedule 21.04.2012
comment
Может ли кто-нибудь дать мне несколько предложений ??   -  person leochou0729    schedule 03.05.2012


Ответы (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++ с помощью API специальных возможностей, который вы можете использовать, чтобы избежать необходимости вызывать AppleScript в своем приложении.

person GuyGizmo    schedule 13.06.2013
comment
Но процесс просмотра клавиатуры все еще выполняется даже после закрытия окна просмотра клавиатуры. Вам нужно выйти из него: выйти из приложения KeyboardViewer - person Binarian; 07.11.2013