воскресенье, 17 марта 2013 г.

Мигаем подсветкой клавиатуры

Дело было вечером, делать было нечего. Купил я как то ноут Asus N56VM, в нем есть подсветка клавиатуры и подумалось мне, что просто подсветка это не интересно.
Что можно сделать с подсветкой? - Правильно! Помигать!
Вот и взялся я посмотреть как включается подсветка. После некоторых поисков, локализовал управление подсветкой с помощью клавиатуры в "C:\Program Files (x86)\ASUS\ATK Package\ATK Hotkey\HControl.exe". После дебагинка в IDA были найдено следующие:
что подсветка включалась - выключалась с помощью вызова DeviceIoControl с определенными параметрами. В результате была написана функция включения и регулировки подсветки.
        public static int GetLevel()
        {
            return Level(0, 0x424B4C47);
        } 
        public static int SetLevel(int level)
        {
            return Level(level, 0x424B4C53);
        }
        public static int Level(int level, int code)
        {
            byte[] outBuffer = new byte[0x300];
            int[] inBuffer = new int[6] { 2, 0, 1, 8, 0x040000, 0x80 };
            inBuffer[1] = code;
            inBuffer[5] = level | 0x80;
            bool result = false;
            int bytesReturned = 0;
            SafeFileHandle _hdev = new SafeFileHandle(CreateFile("\\\\.\\ATKACPI", 0xC0000000, 3, IntPtr.Zero, 3, 0, IntPtr.Zero), true);
            if (_hdev.IsClosed | _hdev.IsInvalid)
            {
                WarningMessage("Error opening device");
                return -1;
            }
            unsafe
            {
                fixed (byte* p1 = &outBuffer[0])
                {
                    fixed (int* p = &inBuffer[0])
                    {
                        result = DeviceIoControl(_hdev, 0x00222404, (IntPtr)p, 0x18, (IntPtr)p1, 0x300, out bytesReturned, IntPtr.Zero);
                    }
                }
            }
            if (result == false)
            {
                int error_code = Marshal.GetLastWin32Error();
                WarningMessage("error code: " + error_code);
                return -1;
            }
            if (code == 0x424B4C47)
            {
                return outBuffer[0x10];
            }
            return level;
        }
 Консольную утилиту для регулировки и мигания подсветки для Asus Nx6 можно скачать тут

 Но просто мигать подсветкой не интересно, по этому после непродолжительного изучения SkypeAPI была написана программа  которая мигает подсветкой при приходе сообщения или поступления звонка. Программа висит в трее и позволяет регулировать подсветку и мигает при событии от skype. Инсталляция убрана в связи с не актуальностью.
Программа работает на серии ноутбуков Asus Nx6  при установленном Skype.

Если у вас есть идеи как еще можно использовать подсветку клавиатуры, то пишите в комментариях.

14.04.3013 Добавлена возможность запускать свои приложения при нажатии fn+ 1, V, C


4 комментария:

  1. Ого! Раз вы в силах сделать такие чудеса, может сможете написать утилитку, которая бы изменяла действие горячих "Fn + стрелки" на свой проигрыватель, а не стандартный? Было когда-то решение http://asusfans.ru/659-multimediynye-goryachie-klavishi-fn-v-audio-video-prilozheniyah.html но оно не работает с данной линейкой ноутбуков :(

    ОтветитьУдалить
  2. ЧЕЛОВЕЧИЩЕ!!! ГЛЫБА!!! )))))))
    я мечтал о такой программе с того самого момента, как купил свой n56vz. меня ошарашили ~10 процессов, которые висели в памяти лишь для того, чтобы задействовать единственную нужную (лично мне) функцию - подсветку клавиатуры! поэтому я их снёс, в конце концов вычислил, что для работы подсветки нужны только hcontrol и atkwmiacpi64, и написал даже скрипт чтобы включать/выключать с ярлыка. но у hcontrol'a побочный эффект в том, что после тушения экрана по fn+F7 он начинает включаться при шевелении мышем.

    спасибо огромное за программку!))))

    ОтветитьУдалить
  3. Не запускается. Win 7 64. Пишет что прекращена работа.

    ОтветитьУдалить
    Ответы
    1. Должен быть запущен скайп
      вообще лучше использовать http://kulasov.blogspot.com/2013/05/asus-n46n56n76.html

      Удалить