Страницы

Поиск по вопросам

Показаны сообщения с ярлыком клавиатура. Показать все сообщения
Показаны сообщения с ярлыком клавиатура. Показать все сообщения

четверг, 9 апреля 2020 г.

Не работает атрибут “android:imeOptions”

#android #android_edittext #клавиатура

                    
В некотором layout есть EditText и если  по документации от Google установить этому
виджету атрибут android:imeOptions="actionSearch", то вместо стандартного значка "Enter"
на клавиатуре должна появиться иконка поиска (лупа).  Но когда я попробовал это реализовать
на практике

        


иконка осталась прежней. Т.е смена иконки не работает. 
Попробовал реализовать смену иконки программно, написав в Activity : editText.setImeOptions(EditorInfo.IME_ACTION_SEARCH);
Это, к сожалению, тоже не сработало. Более того, видимо как следствие этого, не работает
и переопределенный метод для обработки нажатия по кнопке поиска:

    @Override
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {

    Log.d("WHALETAG", "Что то собирается нажаться");
    if (i == EditorInfo.IME_ACTION_SEARCH){
        Toast.makeText(this, "Поиск: " + editText.getText(), Toast.LENGTH_SHORT).show();
        return true;
    }

    return false;
}


От чего такое?
    


Ответы

Ответ 1



Решение нашлось довольно нестандартно: если это происходит, необходимо для EditText указать еще один атрибут android:singleLine="true" И в результате получится: и иконка поиска будет исправно отображаться.

вторник, 17 марта 2020 г.

Церковнославянская раскладка в Ubuntu

#ubuntu #кодировка #клавиатура #локаль


Необходимо набирать текст на церковнославянском языке. Как мне это сделать?    


Ответы

Ответ 1



Церковно-славянский в LinuxКак установить церковнославянские шрифтыМетоды реализации церковно-славянского письма в компьютерных системахДля разработчиковЦерковнославянский язык в Линуксе

воскресенье, 8 марта 2020 г.

Обработка событий клавиатуры в DOS

#c #клавиатура #dos


Мне нужно создать окно, размеры которого можно менять нажатием клавиши.

К примеру Right Shift в программе Borland C++ 3.1 на языке программирования Си. Само
окно я создал, но не понимаю, как написать функцию, которая бы понимала, что нажата
нужная клавиша и меняла бы размер окна. Прошу вас о помощи.
    


Ответы

Ответ 1



Неправильный путь - опрашивать устройства ввода внутри элемента, который получил фокус. Его даже рассматривать не будем, сразу перейдём к правильному. Правильный - внешний обработчик, который ставит полученные события в очередь. И эта очередь доступна окнам, кнопкам и прочим объектам. В Windows тут специально ничего делать не надо, эта схема обработки событий и так присутствует изначально. Для DOS идеальным решением будет работа с прерываниями (свой обработчик int 9h для клавиатуры, int 33h для мыши и т.д.). Именно так устроена обработка событий в Turbo Vision, поэтому имеет смысл не изобретать велосипед, а взять всё оттуда. Тем более что исходники есть. Для Linux всё немного сложней (см. пример, и это не единственный вариант), но общий смысл остаётся тот же. И главное, что нужно понять. Несмотря на то, что общий принцип один и тот же, реализация его очень сильно завязана на ОС и платформу, и именно она составляет львиную долю работы (ни язык C, ни язык C++ не имеют средств для полноценной работы с устройствами ввода, поэтому всё нужно делать самостоятельно). И тратя время на DOS нужно хорошо понмать зачем это делается, так как в подавляющем большинстве случаев время это будет потрачено впустую.

среда, 26 февраля 2020 г.

LyX: раскладка клавиатуры

#клавиатура #latex #lyx


В LyX в Инструменты>Настройки>Редактирование>Клавиатура/Мышь, там, где Клавиатура,
есть флажок Использовать раскладку клавиатуры. Никто не знает, зачем он?
    


Ответы

Ответ 1



Этот неприметный с виду флажок обеспечивает довольно существенный перевес между LyX и другими "настоящими редакторами LaTeX". Я не скажу, что LyX имеет преимущество перед этими редакторами прямо-таки по всем показателям в силу недостаточной своей компетентности в этом вопросе, но с этой стороны он их точно превосходит. Итак, эта функция нужна для того, чтобы с одной клавиатуры (не переключая язык ввода, что, впрочем, пока не важно) можно было вводить необычные (там, диакритические, и т. п.) символы. Именно: нажимаем кнопку Просмотреть для первой и Выбрать для второй клавиатуры (где находятся эти кнопки, указано в первом посте данной темы) и устанавливаем с помощью выбора соответствующих файлов с расширением .kmap (на всякий случай скажу, что эти файлы находятся в C:\Program Files\LyX 2.0\Resources\kbd), как наи удобно, какой язык (какую раскладку клавиатуры) на какую клавиатуру (первую или вторую) повесить. Нажимаем кнопку Сохранить при этом диалоговое окно настроек закроется (в данном случае можно нажать кнопку Применить, тогда можно в основном окне LyX что-то делать без ограничения функционала, там, писать, выполнять команды всех меню без закрытия диалогового окна Настройки, но мы нажимаем Сохранить, потому что нам надо желательно сразу перезапустить LyX). Потом, повторюсь, лучше перезапустить LyX. Язык ввода в окне LyX ставим английский. Переключение раскладок осуществляется сочетаниями клавиш Alt+K+1 или Alt+K+2 соответственно. Сочетание Alt+K+Т осуществляет переключение между выбранными раскладками по кругу (так сказано в мануале). Ну, это все мелочи. Хочу, однако, отметить, что в мануале сказано, что эта функция работает не на всех системах. И, действительно, у меня, на Windows 7 максимальной (до этого на профессиональной), это работает (работало) только отчасти: когда в первой указана какая-либо раскладка, переключение на вторую не происходит. Но зато при включении этой функции, независимо от выбранной первой раскладки, при переходе в математический Ctrl+M) или выклочный (Ctrl+Shift+M) режимы, язык ввода становится английским! При выходе же из математического (или выклочного) режима (можно мышкой щелкнуть вне прямоугольника, обозначаемого красными уголками, в котором курсор находится в момент ввода математической формулы, или кнопками навигации курсора) язык ввода становится опять тем, который указан в первой клавиатуре. Это о-очень удобно, когда пишешь что-то с математическими формулами на языке, отличном от английского: сто раз не переключать язык ввода на английский (для ввода формул) и назад, на свой язык. Однако не для всякого языка в папке, названной мной выше, есть соответствующий файл .kmap. Нет его, в частности, для русского языка. Поэтому его нужно изготовить. Делается это довольно просто. Копируем и вставляем в эту же папку файл null.kmap, переименовываем его в russian.kmap (я подозреваю, что файл null.kmap для того и задуман, чтобы непосредственно из него изготавливать нужный пользователю файл .kmap, но на всякий случай я его трогать не стал, а изготовил свой). И в russian.kmap вставляем такие строки: \kmap q й \kmap w ц \kmap e у .................. \kmap m ь \kmap "," б \kmap "." ю \kmap "6" ‚ \kmap "7" . \kmap "@" \" \kmap "^" ; \kmap "&" : \kmap "`" ё \kmap "~" Ё \kmap "$" $ \kmap Q Й \kmap W Ц \kmap E У \kmap R К ............. \kmap L Д \kmap : Ж \kmap "”" Э \kmap Z Я \kmap X Ч \kmap C С \kmap V М \kmap B И \kmap N Т \kmap M Ь \kmap "<" Б \kmap ">" Ю т. е. строка имеет такую структуру: «\kmap» «символ английской раскладки» «символ русской раскладки (вернее, казахской раскладки: я ее больше предпочитаю, потому что там наиболее употребительные знаки препинания – точка и запятая – расположены на разных клавишах при практически всех буквах русского языка, нет только букв “Ё” и “ё”, потому что их нет в казахском алфавите, что легко восполнимо с помощью Alt-кодов символов), расположенный на одной клавише с введенным ранее английским символом» (наверное, скорее всего, русский символ не обязательно ставить с одной клавиши с кодируемой английской буквой, не пробовал, мне это не к чему). Многоточия обозначают пропущенные буквы. Все, закрываем с сохранением изменений файл russian.kmap, который, что перекликается с написанным мной выше, и выбираем для первой раскладки (с помощью кнопки Просмотреть, упоминавшейся мной выше), для второй раскладки можно ничего не выбирать. Перезапускаем LyX. Язык ввода ставим английский. При этом он начинает писать русскими буквами так, что какую русскую букву нажмешь, такую он и выведет в окно LyX, при переходе же в математический или выклочный режим (без надоедливого переключения мышкой языка ввода) он выводит в окно LyX латинский символ, который ты и нажимал. ИМХО, очень удобно. Отмечу, что, несмотря на все мои попытки, сделать, чтобы так работала буква "Э", мне не удалось: кавычка вылетает и всё тут. Ну, это и не беда: эта буква употребляется сравнительно редко, так что когда нужно, нажимаем и удерживаем клавишу Alt, с цифровой клавиатуры вводим последовательно 1, 5, 7, отпускаем клавишу Alt. В окне LyX, там, где мигает курсор, появится буква "Э". На всякий случай выкладываю свой файл russian.kmap. Так, ну, вроде все. Старался писать максимально доходчиво.

четверг, 13 февраля 2020 г.

Экранная клавиатура android

#android #клавиатура


В ландшафтном режиме на некоторых устройствах при открытии клавиатуры над ней остается
видно часть формы, а на других появляется большое окно ввода. При этом в какое поле
вводим текст, не видно. Как сделать, чтобы над клавиатурой всегда была видна часть
формы? Куда копать?    


Ответы

Ответ 1



Добавьте к вашему EditText такой атрибут в XML android:imeOptions="flagNoExtractUi" Вообще ответ найден в гугле за 36 секунд.

вторник, 28 января 2020 г.

Лучшая клавиатура для программиста?

#клавиатура


Здравствуйте!
История такая. Старая клавиатура померла три месяца назад, к новой никак не могу
приноровиться. Решил сделать себе подарок в виде отличной клавиатуры. Но, вдоволь начитавшись
форумов, понял, что дело это не из легких.
Для себя сделал два вывода: клавиатура должна быть механической, тип механизма -
Cherry-MX Blue
Но и таких клавиатур предостаточно:

iOne Scorpius M10
iOne Scorpius M10 BL
Ducky DK-9008
Ducky DK-9000
Ducky DK-1008
Ducky DK-1087
Ducky DK-9008-G2
Cherry G80-3000 LSCRC-2
iOne Scorpius 35
Das Model S

Выскажите пожалуйста своё мнение, свои предпочтения по данному вопросу, какими клавиатурами
пользовались и какие понравились. Буду очень рад, если мнения будут подкреплены опытом.
Скажу честно, на ощупь не трогал ни одну из таких клавиатур и у друзей таких нет. Что
касается магазинов, то в них обычно дешевые мембранные клавиатуры.
P.S.: Почему я задаю такой вопрос здесь, а не на форумах? Во-первых, считаю, что
здесь собрано большое количество программистов, готовых делится своим мнением и не
боятся высказываться. Во-вторых, есть система голосования за ответы, можно понять не
только мнение автора ответа, но и сколько человек поддерживают его мысли.    


Ответы

Ответ 1



Клавиатуру нужно выбирать по тактильным ощущениям. То есть взять и по клацать, если приятно на ощупь можно брать если нет то не стоит. а механизм это уже второстепенно, может быть мембранная и работать на ней удобно а может быть механическая и чувствовать дискомфорт. Так же брать желательно полноформатную, с нормальным размером клавиш. Боле весомо правильное положение рук и положение кисти руки. Так как больше устают сами руки и кисти при длительной работе за клавиатурой нежели пальцы. Так же желательно стул с подлокотниками чтобы локти не весели в воздухе когда работаешь, и обязательно раз в час делать разминку для пальцев. ЗЫ Провожу за компьютером больше 10 часов в день из них 5-6 пишу, советы из своего опыта, конкретную клавиатуру советовать дело не благодарное :)

Ответ 2



Ms natural 4000 на работе стоит, работаю программистом c#/java, обожаю эту клавиатуру

Ответ 3



Вариантов несколько. На практике я работал за следующими, которые могу порекомендовать: IBM Model M. Посмотреть можно здесь, здесь и здесь. Адская, мегаудобная штука. Минусы: нет кнопок Win и контекстного меню (этих кнопок в 87 году быть не могло просто). Еще она громкая. Плюсы - отличный ход клавиш, четкий клик, длинный и качественный хвост. Самое главное - колпачки съемные (!) и клаву легко локализовать при наличии нужных колпачков. IBM Notebook keyboard. Идеальная как на ноутбуках ThinkPad T40(p)/T41(p)/T42(p)/T43(p) и T60(p)/T61(p). Также они ставились вплоть до T500/R500. Лучше если с механизмом от NMB (было еще два производителя, вроде lexmark и chicony). Существует и в виде отдельной клавиатуры. Плюсы - удобно, в комплекте с "мышкой". У отдельной - интерфейс USB + встроенный хаб. У обеих вариаций (в ноуте и отдельно) - четкий, ясный клик. Mitsumi keyboard millenium. Кнопки мембранные. Клик мягкий. Супруга в восторге, а я лично не очень - терпимо. Клава практически не слышна. Подвергалась неоднократным залитиям, падениям, жена по ней фигачила ножом. Клава до сих жива. Еще поглядите обязательно Хабр

Ответ 4



Использую тонкую мембранную клавиатуру с разъёмами USB, Mini-Jack, MIC и дополнительными мультимедийными клавишами A4Tech KLS-7MU Silver PS/2. На ней клавиши основного блока расположены слегка "ёлочкой", поэтому запястья при работе находятся в правильном положении. Занимаюсь программированием на Java, PHP, а также веб-разработкой, не отказываю себе в удовольствии провести часок-другой за какой-нибудь игрушкой - никаких проблем, дискомфорта. Клаве третий год уже.

Ответ 5



Если печатаете "вслепую" то имеет место выбирать клавиатуру с привычным для вас расположением кнопок, если нет то воспользуйтесь методом предложенным @savro

Ответ 6



Сегодня заказал такую. Говорят что мега удобная, только достать не просто. Через полчаса гугления на хабре случайно выцепил ссылку на магазин, там и заказал.

пятница, 24 января 2020 г.

Не работает обработка нажатия Enter с клавиатуры. Обрабатываются только цифры

#java #android #клавиатура #listener #обработка


Находил несколько примеров по этому поводу, где то со switch где то c if, но суть
не в этом, так и так не работает. Обработчик реагирует только на нажатия цифр. Даже
default в switch`e не реагирует. Что я делаю не так? Вот код

edit.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (KeyEvent.ACTION_DOWN == event.getAction()){
                switch (keyCode){
                    case KeyEvent.KEYCODE_ENTER:
                        Log.e("TAG", "Нажат интер");
                        break;
                    case KeyEvent.KEYCODE_2:
                        Log.e("TAG", "Нажато 2");
                        break;
                    case KeyEvent.KEYCODE_E:
                        Log.e("TAG", "Нажато e");
                        break;
                    default: Log.e("TAG", "Нажато что то");
                }
            }
            return false;
        }
    });


Весь обработчик реагирует только на цифры. Нажимаю буквы или какие нибудь другие
символы default не срабатывает, нажимаю цифры кроме 2 - срабатывает. Нажимаю 2 - работает.
Все клавиши перетыкал "Нажато е" не выходит. И интер тоже. Может дело в модели телефона
не знаю, у меня Lenovo S650 Андроид 4.4.2 Api 19. Другого телефона нет для проверки.
    


Ответы

Ответ 1



OnKeyListener работает криво и в основном только как раз для цифр с кейпада, остальные клавиши не воспринимает. Странно при этом, что ентер тоже не работает. В этом случае лучше использовать TextWatcher, как-то так: myTextView.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.subSequence(count-1,count).equals("нужная кнопка")) ...выполнить нужное действие } @Override public void afterTextChanged(Editable s) { } });

C# Захват сочетания нажатых клавиш на клавиатуре

#c_sharp #клавиатура #keyboardhook


Хочу сделать простенькое приложение с захватом комбинации клавиш (напр. alt+a), но
дело в том что клавиши хукаются только по отдельности, есть ли какая-то возможность
использовать модификаторы, alt, shift, и т.д.
Вот сам код:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        globalKeyboardHook gkh = new globalKeyboardHook();
        private void Form1_Load(object sender, EventArgs e)
        {
            gkh.HookedKeys.Add(Keys.A);
            gkh.HookedKeys.Add(Keys.B);
            gkh.HookedKeys.Add(Keys.LMenu);
            gkh.KeyDown += new KeyEventHandler(gkh_KeyDown);
            gkh.KeyUp += new KeyEventHandler(gkh_KeyUp);
        }
        void gkh_KeyUp(object sender, KeyEventArgs e)
        {
            label1.Text="Up\t" + e.KeyCode.ToString();
            e.Handled = true;
        }

        void gkh_KeyDown(object sender, KeyEventArgs e)
        {
            label1.Text = "Down\t" + e.KeyCode.ToString();
            e.Handled = true;
        }
    }
    class globalKeyboardHook
    {
        #region Constant, Structure and Delegate Definitions
        /// 
        /// defines the callback type for the hook
        /// 
        public delegate int keyboardHookProc(int code, int wParam, ref keyboardHookStruct
lParam);

        public struct keyboardHookStruct
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }

        const int WH_KEYBOARD_LL = 13;
        const int WM_KEYDOWN = 0x100;
        const int WM_KEYUP = 0x101;
        const int WM_SYSKEYDOWN = 0x104;
        const int WM_SYSKEYUP = 0x105;
        #endregion

        #region Instance Variables
        /// 
        /// The collections of keys to watch for
        /// 
        public List HookedKeys = new List();
        /// 
        /// Handle to the hook, need this to unhook and call the next hook
        /// 
        IntPtr hhook = IntPtr.Zero;
        #endregion

        #region Events
        /// 
        /// Occurs when one of the hooked keys is pressed
        /// 
        public event KeyEventHandler KeyDown;
        /// 
        /// Occurs when one of the hooked keys is released
        /// 
        public event KeyEventHandler KeyUp;
        #endregion

        #region Constructors and Destructors
        /// 
        /// Initializes a new instance of the  class
and installs the keyboard hook.
        /// 
        public globalKeyboardHook()
        {
            hook();
        }

        /// 
        /// Releases unmanaged resources and performs other cleanup operations before the
        ///  is reclaimed by garbage collection and
uninstalls the keyboard hook.
        /// 
        ~globalKeyboardHook()
        {
            unhook();
        }
        #endregion

        #region Public Methods
        /// 
        /// Installs the global hook
        /// 
        public void hook()
        {
            IntPtr hInstance = LoadLibrary("User32");
            hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, hInstance, 0);
        }

        /// 
        /// Uninstalls the global hook
        /// 
        public void unhook()
        {
            UnhookWindowsHookEx(hhook);
        }

        /// 
        /// The callback for the keyboard hook
        /// 
        /// The hook code, if it isn't >= 0, the function shouldn't
do anyting
        /// The event type
        /// The keyhook event information
        /// 
        public int hookProc(int code, int wParam, ref keyboardHookStruct lParam)
        {
            if (code >= 0)
            {
                Keys key = (Keys)lParam.vkCode;
                //MessageBox.Show(key.ToString());
                if (HookedKeys.Contains(key))
                {
                    KeyEventArgs kea = new KeyEventArgs(key);
                    if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown
!= null))
                    {
                        KeyDown(this, kea);
                    }
                    else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp
!= null))
                    {
                        KeyUp(this, kea);
                    }
                    if (kea.Handled)
                        return 1;
                }
            }
            return CallNextHookEx(hhook, code, wParam, ref lParam);
        }
        #endregion

        #region DLL imports
        /// 
        /// Sets the windows hook, do the desired event, one of hInstance or threadId
must be non-null
        /// 
        /// The id of the event you want to hook
        /// The callback.
        /// The handle you want to attach the event to, can
be null
        /// The thread you want to attach the event to, can
be null
        /// a handle to the desired hook
        [DllImport("user32.dll")]
        static extern IntPtr SetWindowsHookEx(int idHook, keyboardHookProc callback,
IntPtr hInstance, uint threadId);

        /// 
        /// Unhooks the windows hook.
        /// 
        /// The hook handle that was returned from SetWindowsHookEx
        /// True if successful, false otherwise
        [DllImport("user32.dll")]
        static extern bool UnhookWindowsHookEx(IntPtr hInstance);

        /// 
        /// Calls the next hook.
        /// 
        /// The hook id
        /// The hook code
        /// The wparam.
        /// The lparam.
        /// 
        [DllImport("user32.dll")]
        static extern int CallNextHookEx(IntPtr idHook, int nCode, int wParam, ref
keyboardHookStruct lParam);

        /// 
        /// Loads the library.
        /// 
        /// Name of the library
        /// A handle to the library
        [DllImport("kernel32.dll")]
        static extern IntPtr LoadLibrary(string lpFileName);
        #endregion
    }
}


Хукаются только отдельно нажатые клавиши, которые нужны в работе и по отдельности,
как сделать хук только на сочетание клавиш с модификаторами?
    


Ответы

Ответ 1



Нужная Вам информация хранится в lParam метода hookProc http://www.firststeps.ru/mfc/winapi/hook/r.php?32 Смотрите по ходу выполнения что лежит в lParam.flags

воскресенье, 12 января 2020 г.

Как настроить ввод спецсимволов через Alt в линуксе?

#linux #windows #клавиатура


В Windows можно вводить спецсимволы при помощи Alt и десятичного кода.
Например, чтобы ввести неразрывный пробел, надо нажать
Alt + 0 1 6 0.

В линуксе есть аналогичная функциональность, но используется Ctrl+Shift+U и шестнадцатеричный
код: Ctrl + Shift + U A 0.

А можно ли перенастроить на виндоусовский вариант?
Точнее так: можно ли сделать, чтобы работали одновременно оба варианта?

PS: Linux Mint.
    


Ответы

Ответ 1



Можно попробовать настроить Alt как Compose key. Но это наверняка вызовет массу неудобств. Лучше использовать стандартный (обычно это Shift+AltGr) и сделать список соответствующих комбинаций. Для этого нужно скопировать файл /usr/share/X11/locale/<ваша локаль>/Compose в ~/.XCompose и отредактировать последний. Этот способ более универсальный, поскольку Ctrl+Shift+U работает не во всех приложениях.

пятница, 10 января 2020 г.

(Linux/Ubuntu) Как настроить стрелки на определенные клавиши при зажатом Alt

#linux #ubuntu #клавиатура


Надоело постоянно сдвигать правую руку на стрелки каждый раз когда нужно перемещаться
по коду. Есть идея для этого использовать к примеру клавиши IJKL при зажатом Alt, но
вот как это все настроить даже не представляю. Сижу на Ubuntu.
    


Ответы

Ответ 1



Вариант 1 Можно использовать xdotool и назначить горячие клавиши в Меню - Параметры системы - Клавиатура - Комбинации клавиш - Дополнительные комбинации. Здесь надо добавить 4 кнопки соответственно: xdotool keyup Ctrl key Up keydown Ctrl xdotool keyup Ctrl key Left keydown Ctrl xdotool keyup Ctrl key Down keydown Ctrl xdotool keyup Ctrl key Right keydown Ctrl И назначить им комбинации Control + I, Control + J, Control + K, Control + L Корявый, конечно, вариант. Но раз уж ничего другого не предлагают... Вариант 2 Использовать xmodmap: $ cat > ~/.Xmodmap keycode 37 = Mode_switch keysym j = j J Left keysym l = l L Right keysym i = i I Up keysym k = k K Down ^C $ xmodmap ~/.Xmodmap keycode 37 - это левый Control Команду $ xmodmap ~/.Xmodmap нужно поместить в автозагрузку. Второй вариант считаю более правильным.

четверг, 9 января 2020 г.

Как поставить знак тильды (~) не используя кнопки с тильдой?

#клавиатура


Как любого рода сочетанием клавиш поставить знак тильды, если у меня на тильду поставлен
другой функционал? (в моем случае переключение клавиатуры)

Например Ctrl + ~ (или другими) поставить тильду ~?  
    


Ответы

Ответ 1



Для того, что бы узнать альтернативное сочетание клавиш на ЛЮБОЙ знак тебе нужно зайти в "Пуск" => Character Map и там найти нужный знак. Там же есть информация о том, как вызвать даный символ. Там будет на тильде написано U+007E: Tilde 007E - это номер знака в ASCII таблице, только 16ричный. Но нам нужен десятичный номер знака, а не шестнадцатеричный. Переводим при помощи инженерного/программерского калькулятора: или же ищем при помощи интернета в десятичной системе и получаем: 126. Это значит что в виндовсе нужно зажать Alt + набрать ASCII номер (126 или 0126) на цифровой клавиатуре (та что прямоугольная с правой стороны). Вот знак напечатанный этим способом: ~

воскресенье, 5 января 2020 г.

Как отловить все клавиши через низкоуровневый хук?

#c_sharp #winapi #клавиатура #keyboardhook


Как отловить в HookCallback все клавиши с проверкой по шифтам и.т.п?
Обычный (Keys) Marshal.ReadInt32 (lParam) просто пишет большими буквами.

public delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
private static readonly LowLevelKeyboardProc _proc = HookCallback;

private static IntPtr _hookID = IntPtr.Zero;

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
  if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
  {
    try
    {
       Console.WriteLine((Keys)Marshal.ReadInt32(lParam));
    }
    catch (AccessViolationException ex) { Console.WriteLine($"Error: {ex.ToString()}"); }
  }
  return NativeMethods.CallNextHookEx(_hookID, nCode, wParam, lParam);
}


У меня есть идея занести список клавиш в List и оттуда как-то делать проверку. 

Но может у Вас есть идеи по лучше?! ( желательно с примером )
    


Ответы

Ответ 1



Как-то так: using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.ComponentModel; using System.Windows.Forms; namespace ConsoleApplication1 { class Program { static KeyLogger k; static void Main(string[] args) { k = new KeyLogger(); k.Start(); Console.CancelKeyPress += Console_CancelKeyPress; Console.WriteLine("Started listening for keyboard events..."); Application.Run(); } private static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e) { k.Stop(); Application.Exit(); } } sealed class KeyLogger : IDisposable //отслеживает события клавиатуры с помощью низкоуровневого хука Windows { //объявления типов, констант и функций Windows API delegate IntPtr KeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); const int WH_KEYBOARD_LL = 13; const int HC_ACTION = 0; const int WM_KEYDOWN = 0x0100; const uint VK_CAPITAL = 0x14; [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] static extern IntPtr SetWindowsHookEx(int idHook, KeyboardProc lpfn, IntPtr hInstance, int threadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("kernel32.dll")] private static extern IntPtr LoadLibrary(string dllToLoad); [DllImport("USER32.dll")] public static extern short GetKeyState(int vKey); [DllImport("user32.dll")] public static extern short GetAsyncKeyState(int vKey); [DllImport("user32.dll")] public static extern int ToUnicodeEx( uint wVirtKey, uint wScanCode, byte[] lpKeyState, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszBuff, int cchBuff, uint wFlags, IntPtr dwhkl); [DllImport("user32.dll")] public static extern bool GetKeyboardState(byte[] lpKeyState); [DllImport("user32.dll")] public static extern uint MapVirtualKey( uint uCode, uint uMapType); [DllImport("user32.dll")] public static extern IntPtr GetKeyboardLayout(uint idThread); [DllImport("user32.dll")] public static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId); [DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow(); //преобразование виртуального кода клавиши в его Юникод-представление public static string VKCodeToUnicode(uint vkCode) { StringBuilder buf = new StringBuilder(); byte[] keyboardState = new byte[255]; short x; byte y; for (int i = 0; i < 255; i++) { if (i == VK_CAPITAL) { x = GetKeyState(i); } else { x = GetAsyncKeyState(i); } y = 0; if ((x & 0x8000) != 0) y = (byte)(y | 0x80); if ((x & 0x0001) != 0) y = (byte)(y | 0x01); keyboardState[i] = y; } ToUnicodeEx(vkCode, MapVirtualKey(vkCode, 0), keyboardState, buf, 5, 0, GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero))); return buf.ToString(); } IntPtr _hookID = IntPtr.Zero; //начинает отслеживание событий клавиатуры public void Start() { if (disposed) throw new ObjectDisposedException("KeyLogger"); if (_hookID != IntPtr.Zero) return; _hookID = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookCallback, IntPtr.Zero, 0); if (_hookID == IntPtr.Zero) { int error = Marshal.GetLastWin32Error(); throw new Win32Exception(error, "Failed to install hook! Error: "+ error.ToString()); } } //останавливает отслеживание событий клавиатуры public void Stop() { if (disposed) return; if (_hookID == IntPtr.Zero) return; UnhookWindowsHookEx(_hookID); _hookID = IntPtr.Zero; } //вызывается Windows при нажатии клавиши IntPtr KeyboardHookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) { int vkCode = Marshal.ReadInt32(lParam); string s = VKCodeToUnicode((uint)vkCode); Console.Out.WriteLine("Key: " + ((Keys)vkCode).ToString() + "; Character: " + s); } return CallNextHookEx(_hookID, nCode, wParam, lParam); } //так как KeyLogger использует неуправляемый ресурс, реализуем Dispose и Finalize... bool disposed = false; public void Dispose() { if (disposed) return; Stop(); disposed = true; GC.SuppressFinalize(this); } ~KeyLogger() { Dispose(); } } } Известная проблема (Windows 10): если активно консольное окно, всегда распознаются символы раскладки, установленной в момент создания консоли, вместо текущей раскладки. Основано на данных вопросах: GetKeyboardState: определение состояния клавиши Некорректная работа перехватчика нажатых клавиш (кейлоггер) C#

вторник, 31 декабря 2019 г.

Можно ли в vim заменить Esc на сочетание клавиш?

#vim #клавиатура #linux


Заметил, что в vim часто приходится нажимать на Esc для перехода между режимами.
Можно ли Esc заменить в данном случае на сочетание клавиш?    


Ответы

Ответ 1



Вообще я лично пользуюсь сочетанием клавиш jj. Добавте это в ваш .vimrc " exit to normal mode with 'jj' inoremap jj Это хак используют сотни vimer'ов, просто посмотрите на .dotfiles репозитории на github.com. Причина очень проста, вы постоянно держите палец на кнопке j для навигации по тексту. А для нажатия любой другой кнопки вам потребуется переместить палец. Попробуйте ;)

Ответ 2



Есть ещё встроенные Ctrl+C, Ctrl+[. Если всё равно хочется своё, используй :map

Ответ 3



Еще если используется vim в терминале, то дефолтное поведение терминала часто такое: alt+буква посылает , затем букву. Так можно одновременно выйти из insert-mode и сделать следующее действие.

пятница, 27 декабря 2019 г.

Как в Ubuntu 18 настроить переключение раскладки на Ctrl+Shift?

#linux #ubuntu #клавиатура #gnome


В настройках горячих клавиш невозможно поменять на горячую клавишу ни Ctrl + Shift
ни на Alt + Shift.

Также в интернете широко обсуждается решение использовать GNOME Tweaker, но его проблема
в том, что перестают работать комбинации клавиш Ctrl + Shift + Any. 
    


Ответы

Ответ 1



Проблема решилась командами: sudo add-apt-repository ppa:nrbrtx/xorg-hotkeys sudo apt dist-upgrade А после настройкой через GNOME Tweaks (ссылка подробную настройку есть в самом вопросе) Таким образом становится возможно и переключать раскладку любыми комбинациями и использовать раскладки клавиш в которых присутствует комбинация переключения раскладки. UPD: Проблема не решается до конца - при использовании комбинации клавиш внутри которых есть клавиши переключения раскладки и переключается язык и включается хоткей. А должно быть только второе

среда, 25 декабря 2019 г.

Как сделать ключевые слова на клавишах как в Spectrum?

#linux #gui #desktop #клавиатура


Раньше был компьютер Spectrum,и там был 
специальный режим набора, когда клавиша печатала сразу целое слово.

Например, нажал клавишу P, а напечаталось слово PRINT

Как сделать такой режим в Linux сразу во всех программах, то есть на уровне системы,
а не отдельного приложения?

Видел, что в xkb есть некие actions (в compatibility map), но в списке доступных
я не нашел замены одной клавиши на последовательность нажатий.

Будет ли хорошим решением добавить новую разновидность action, или есть другие варианты?
    


Ответы

Ответ 1



можно воспользоваться механизмом xcompose, предварительно определив в настройках клавиатуры клавишу, используемую в качестве compose key. пример файла ~/.XCompose:

: "PRINT" нажимаете и отпускаете compose key, затем shift+p, и получаете слово PRINT. примеры правил можно посмотреть в /usr/share/X11/locale/en_US.UTF-8/Compose

Обработка нажатий на цифровую клавиатуру

#c_sharp #winforms #клавиатура


День добрый, друзья!
Пишу программу, в которой можно задавать горячие клавиши на действия. И столкнулся
с проблемой в цифровой клавиатуре. Если нажать например на 0 (на цифровой клавиатуре),
то в textbox в событии KeyDown, e.KeyCode будет иметь значение Keys.NumPad0, а если
нажать на SHIFT + 0(на цифровой клавиатуре) то e.KeyCode = Keys.Insert, а e.Modifiers
= Keys.None и e.Shift = false;

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
  if (e.Shift && e.KeyCode == Keys.NumPad0)
  {
    MessageBox.Show("SHIFT + NumPad0");
  }
}


Путем экспериментов выяснил, что ОС при нажатии шифта и NumPad0 преобразует его в
Insert, а если быть точным, программно "отжимает" Shift и заменяет эту комбинацию на
Insert. Поэтому добавил в метод KeyDown условие

if (e.Modifiers == Keys.Shift)
{
  _FlagShiftPressed = true;
}


а в методе KeyUp

if (e.Shift == false & e.Modifiers == Keys.Shift)
{    
  _FlagShiftPressed = false;
}


Таким образом получилось обработать любые нажатия на цифровую клавиатуру с любым
модификатором. Но после этого вылез подводный камень. При нажатии на SHIFT, отпускании
и последующем нажатии на Insert(например) то получаем результат как при нажатии на
SHIFT+0(на цифровой клаве).
Т.е. в событии KeyUp, при отпускании Shift не сбрасывается флаг и обработка идет
как будто нажата цифровая клавиатура.
Если не понятно выразился, то можно посмотреть на примере задания "горячих кнопок"
в свойствах ярлыка.
Как можно обойти данную проблему, или может есть другие более рациональные пути решения?
    


Ответы

Ответ 1



Нашел решение здесь же, на stackoverflow, и пока работает без ошибок. Приведу его здесь для уменьшения степени энтропии. В моем случае проверяю сканкоды на соответствие след. кнопкам: Insert, Home, PageUp, PageDown, End, Left, Up, Down, Right. protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { switch (msg.Msg) { case WM_KEYDOWN: { int lParam = msg.LParam.ToInt32(); int scanCode = (lParam >> 16) & 0x000000ff; // extract bit 16-23 int ext = (lParam >> 24) & 0x00000001; // extract bit 24 if (ext == 1) { scanCode += 128; } if (scanCode == 210 || scanCode == 199 || scanCode == 201 || scanCode == 209 || scanCode == 200 || scanCode == 203 || scanCode == 205 || scanCode == 208 || scanCode == 207) { _FlagShiftPressed = false; } break; } } return base.ProcessCmdKey(ref msg, keyData); }

Java Линукс/Win консольное прослушивание нажатия клавиатуры

#java #консоль #ввод #клавиатура #listener


Пишу Java консольное приложение для Линукс и Виндовс, которое одновременно прослушивает
нажатие клавиатуры и выводит информацию (без нажатия клавиши Enter для принятия ввода
текста).

Как это можно сделать?

Знаю про JNI, Jline, JavaCurces но нет навыков их использования, хотелось бы сделать
все средствами Java.
    


Ответы

Ответ 1



Одной из ключевых особенностей Java является написание кроссплатформенных программ. Для получения одинакового результата в разных операционных системах Java выполняет разный код в разных ОС. Упомянутые Вами программы это именно именно такие обёртки над системными функциями. Если кроссплатформенность хоть сколько-нибудь важна, лучше использовать их. Из JLine FAQ: How does JLine work? On Windows, JLine uses a native .dll (which it automatically extracts from the jline jar and loads at runtime) to access native console features. On UNIX systems, JLine will perform the necessary terminal setup by launching the "stty" command.

Ответ 2



На данный момент, я нашел решение с использованием jNativeHook. На Windows еще не тестировал, на Alt Linux работает хорошо. Осталось только сделоть прослушку клавиш не глобальгно, а только для окна консоли. package test; import java.io.IOException; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.Logger; import org.jnativehook.GlobalScreen; import org.jnativehook.NativeHookException; import org.jnativehook.keyboard.NativeKeyEvent; import org.jnativehook.keyboard.NativeKeyListener; public class Test0 implements NativeKeyListener { public static void main(String[] args) throws IOException { for (Handler handler : Logger.getLogger("").getHandlers()) handler.setLevel(Level.OFF); try { GlobalScreen.registerNativeHook(); } catch (NativeHookException ex) { System.exit(1); } GlobalScreen.addNativeKeyListener(new Test0()); } public void nativeKeyPressed(NativeKeyEvent e) { System.out.println(NativeKeyEvent.getKeyText(e.getKeyCode()).toLowerCase()); } public void nativeKeyReleased(NativeKeyEvent e) { } public void nativeKeyTyped(NativeKeyEvent e) { } } Все еще надеюсь найти лучшее решение, или сделать прослушку не глобальной.

Ответ 3



Такой вопрос уже был на stackoverflow: Equivalent function to C's “_getch()” in Java? Вот исходный код на ваш вопрос. Опубликованный в посте: public static void getCh() { final JFrame frame = new JFrame(); synchronized (frame) { frame.setUndecorated(true); frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME); frame.addKeyListener(new KeyListener() { @Override public void keyPressed(KeyEvent e) { synchronized (frame) { frame.setVisible(false); frame.dispose(); frame.notify(); } } @Override public void keyReleased(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { } }); frame.setVisible(true); try { frame.wait(); } catch (InterruptedException e1) { } } }

Ответ 4



Эт уже руткит получается. В линухе так получится отслеживать только того, из под которого запущена прога. Да и то вряд-ли.

воскресенье, 22 декабря 2019 г.

Как правильно остановить Thread?

#c_sharp #клавиатура


Язык C#, Visual Studio 2013. Скажите пожалуйста, как в консольном приложении обработать
нажатия клавиши, чтобы остановить работающий Thread? Не могу найти класса с соответствующим
событием, именно, для консольного приложения.
    


Ответы

Ответ 1



Никак. Thread должен сотрудничать, и сам останавливаться, когда его попросят. Например, при помощи разделяемой переменной (но не забудьте о синхронизации при помощи lock): object mutex = new object(); bool stop = false; var t = new Thread(() => { int i = 0; while (true) { Thread.Sleep(500); // тут сделать что-то полезное, например: Console.WriteLine(i++); // проверка на выход lock (mutex) { if (stop) break; } } }); t.Start(); Console.ReadKey(); lock (mutex) stop = true; t.Join(); Вот вам более современный метод, без Thread и Sleep, через Task и CancellationToken: static void Main(string[] args) { CancellationTokenSource cts = new CancellationTokenSource(); var task = Task.Run(() => Work(cts.Token)); Console.ReadKey(); cts.Cancel(); task.Wait(); // для асинхронной функции тут лучше await task } static async Task Work(CancellationToken ct) { try { int i = 0; while (!ct.IsCancellationRequested) { await Task.Delay(500, ct); Console.WriteLine(i++); // после длинных операций внутри цикла имеет смысл вставлять //if (ct.IsCancellationRequested) // return; } } catch (OperationCanceledException ex) { // нас останавливают, выходим } } CancellationToken — это правильный метод передавать сообщения о завершении, используйте его по возможности. Спасибо @rdorn и @Pavel Mayorov за подсказки в комментариях, которые помогли значительно улучшить ответ.

пятница, 20 декабря 2019 г.

Убрать клавиатуру при щелчке на свободное место

#android #клавиатура


Как убрать клавиатуру при щелчке на другое место экрана?    


Ответы

Ответ 1



Мне кажется это какой-то нездоровый паттерн действий юзера. В Андроид предусмотрен способ скрытия клавиатуры нажатием кнопки "Back" или же в некоторых софт-клавиатурах предусмотрена кнопка скрытия клавиатуры. Кроме того нельзя упускать из виду, что есть девайсы с хардверными клавиатурами. Так что я бы не стал заморачиваться таким велосипедостроительством. Если это ваша личная инициатива - забудьте о ней, если хотелки заказчика, то попробуйте объяснить ему что в экосистеме Андроида так не принято делать - покажите ему альтернативы. Если заказчик все равно хочет - установите ему клавиатуру с кнопкой скрытия. Если все равно продолжает настаивать то тогда изобретайте велосипед примерно таким макаром: Определите что такое "другое место экрана" В этом "другом месте экрана" повесьте листенер клика - View.OnClickListener По событию клика убирайте фокус EditText.clearFocus() или просто скрывайте клаву через getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) Проблема здесь в том, что этих "других мест экрана" может быть слишком много и при изменении дизайна придется опять на них вешать слушатели. Альтернативное решение такое: Надо обрабатывать Activity.onTouchEvent() - он вызывается всякий раз когда касание не было перехвачено никаким виджетом/вьюшкой. Далее применяем п. 3. Минус этого решения в том, что скрытие клавы будет происходить только при касании пустого места в Activity - то есть опять упирается в определение понятия "другого места экрана"

Ответ 2



Для скрытия клавиатуры по нажатию на любое место на экране, кроме текстовых полей нужно переопределить метод @Override public boolean dispatchTouchEvent(@NonNull MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { View v = getCurrentFocus(); if (v instanceof EditText) { v.clearFocus(); InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } return super.dispatchTouchEvent(event); }

среда, 18 декабря 2019 г.

Проверить скрыта ли клавиатура

#java #android #клавиатура #kotlin


Основная задача, убирать с моей вьюшки курсор, ПРИ скрытии системной клавиатуры(по
нажатию системной клавиши back).

Вот собственно вьюшка

 


И вот сам метод

private fun setupNotesView() {
    notesView?.setText(presenter.transaction.description)
}


Пробовал добавлять в метод setupNotesView следующий код notesView?.clearFocus() но
увы он не срабатывает в этом участке кода.
    


Ответы

Ответ 1



Помимо решения которое я Вам уже скидывал в комментарии, приходит лишь в голову следующий момент. Так как играться с размерами экрана пожалуй на самая лучшая затея, поэтому осмелюсь предположить что там где Вы хотите убирать фокус с Вашей вьюшки, есть ещё какие то кликабельные вьюшки, в которые Вы и можете собственно прятать Ваш фокус, то есть, перед нажатием на какую то другую вьюшку в методе onClick() использовать Ваш метод notesView?.clearFocus() который при нажатии на любую из вьюшек будет убирать фокус, также не стоит забывать установить следующие параметры в Ваш layout, где все эти вьюшки находятся: android:focusableInTouchMode="true" android:focusable="true" Надеюсь будет полезным.

Ответ 2



Задайте id родителю вашего вью, если это например, LinearLayout, затем реализуйте метод onBackPressed который будет слушателем кнопки backи в нем попробуйте реализовать: @Override public void onBackPressed() { LinearLayout my_linear = (LinearLayout ) findViewById(R.id.my_linear ); my_linear.setFocusable(true); // true/false соответственно my_linear.setFocusableInTouchMode(true); // true/false соответственно super.onBackPressed(); } П.С. если вам нужно чтобы по открытию приложения клавиатура не высплывала, а фокус оставался, то в вашем файле manifest на уровне activity вашего mainactivity добавьте строку: