Как регистрировать ключевые события из нестандартных ключей под Windows 7 - PullRequest
9 голосов
/ 25 августа 2011

У меня двоякая проблема, и я не знаю ни одной ее ветви.

Справочная информация: Я купил новый ноутбук от MSI. В качестве функции, которую я никогда не видел, на дисководе нет механической кнопки извлечения, установленной на дисководе. Вместо этого кнопка цифрового извлечения является частью «умной панели» над функциональными клавишами. К сожалению, программное обеспечение, лежащее в основе смарт-бара, ужасно. Даже в пассивном режиме он занимает экранную область и , он занимает место на панели задач. * Я удалил это программное обеспечение.

Проект: Я хочу написать программу, которая запускается при запуске и незаметно лежит в фоновом режиме. Единственная функция программы - заставить эту кнопку извлечения извлечь дисковод компакт-дисков.

Шаг первый: я хочу выяснить, что происходит, когда я нажимаю эту кнопку. Я подозреваю, что мне не нужно ничего кодировать, но я могу использовать утилиту - один из моих коллег упомянул «регистратор событий», но Google не предоставляет ничего полезного.

Шаг второй: я хочу написать указанную программу, что означает, что мне нужно взаимодействовать либо с WIN32, либо, возможно, с платформой .net для выполнения тех же функций, которые используются окнами вызова функций, когда я щелкаю правой кнопкой мыши на компакт-диске в разделе «Мой компьютер». и нажмите «Извлечь».

Вопросы: Первый вопрос: знаете ли вы утилиту, которая скажет мне, что происходит при нажатии кнопки?

Второй вопрос: знаете ли вы, какую функцию мне нужно вызвать в этом событии для извлечения диска?

Третичный вопрос: я пропускаю какой-то очевидный другой путь?

Я открыт для любых ответов от «У меня была такая же проблема, вот исходный код решения, которое я написал» на «Думаю, может быть, это руководство поможет вам?»

Я бы предпочел работать на C / C ++ / C #, но я открыт для других предложений. Как видно из названия, я работаю под Windows 7.

* Для любопытных, программным обеспечением является MSI S-Bar, которая по некоторым причинам рекламируется как «особенность» этой линейки ноутбуков.

Ответы [ 6 ]

1 голос
/ 01 октября 2011

Я сам столкнулся с этой же проблемой. Я не знаю, знакомы ли вы с autohotkeys или нет, но использовал его, чтобы написать скрипт для замены s-bar.

AutoHotKey (AHK) - это язык с открытым исходным кодом для создания макросов и создания сценариев для Windows с множеством функций. Вы можете запускать сценарии через саму программу или компилировать их в исполняемые файлы, которые можно запускать на любом компьютере.

Вы можете заставить работать привод для извлечения компакт-дисков всего парой строк кода:

;CD eject button
SC142::
Drive, Eject
return

SC142 - это код ключа. Это может быть не одинаково на каждом ноутбуке MSI, но если вы поместите строку "#InstallKeybdHook" в верхней части вашего скрипта. Вы можете просматривать все события клавиатуры, которые AHK видит через графический интерфейс.

Мне удалось сопоставить большинство кнопок с различными функциями на моем ноутбуке MSI, хотя AHK не будет записывать события клавиатуры от одного из них.

Например:

;Star key (AHK only receives KeyUp event)
SC139 UP::
Run, Control
return

;CinemaPro Key
SC13B::
Run, "C:\Program Files\Media Player Classic\mpc-hc64.exe"
return
1 голос
/ 29 августа 2011

Извлечение дисковода компакт-дисков.Не требует прав администратора.

#include <windows.h>
#include <vfw.h>
#include <stdio.h>

#pragma comment(lib, "Vfw32.lib")

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{
  char msg[512];
  HANDLE h;
  DWORD bytesreturned;

  h = CreateFile("\\\\.\\cdrom0", MAXIMUM_ALLOWED, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

  if (h == INVALID_HANDLE_VALUE) 
  {
    sprintf(msg, "CreateFile: %u\n", GetLastError());
    MessageBox(NULL, msg, "ejectcd", MB_OK);
    return 1;
  }

  if (!DeviceIoControl(h, IOCTL_STORAGE_EJECT_MEDIA, NULL, 0, NULL, 0, &bytesreturned, NULL)) 
  {
    sprintf(msg, "DeviceIoControl: %u\n", GetLastError());
    MessageBox(NULL, msg, "ejectcd", MB_OK);
    return 1;
  }

  return 0;
}
1 голос
/ 25 августа 2011

Горячие клавиши

Если они являются частью клавиатуры (просто потому, что они выглядят так, как они есть, это не значит, что они есть на самом деле), у них будет скан-код. SetWindowsHookEx может использоваться, чтобы узнать код сканирования и отреагировать на него - следующий код должен помочь:

class Program
{
    static void Main(string[] args)
    {
        var myClass = new MyClass();
        myClass.Install();
        Application.Run(new Form()); // You need a form, not sure why.
        myClass.Uninstall();
    }
}

public class MyClass : CriticalFinalizerObject
{
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(HookType idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId); 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk); 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); 
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetModuleHandle(string lpModuleName);
    [DllImport("winmm.dll")]
    static extern Int32 mciSendString(String command, StringBuilder buffer, Int32 bufferSize, IntPtr hwndCallback);

    private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);

    private enum HookType : int
    {
        WH_KEYBOARD = 2,
        WH_KEYBOARD_LL = 13
    }
    private enum WindowsMessage : int
    {
        WM_KEYUP = 0x101
    }

    private HookProc _myCallbackDelegate;
    private IntPtr _hook;

    public MyClass()
    {
        _myCallbackDelegate = MyCallbackFunction;
    }

    public void Install()
    {
        Uninstall();

        using (Process process = Process.GetCurrentProcess())
        using (ProcessModule module = process.MainModule)
        {
            _hook = SetWindowsHookEx(HookType.WH_KEYBOARD_LL, _myCallbackDelegate, GetModuleHandle(module.ModuleName), 0);
        }
    }

    public void Uninstall()
    {
        var ptr = Interlocked.Exchange(ref _hook, IntPtr.Zero);
        if (ptr != IntPtr.Zero)
            UnhookWindowsHookEx(ptr);
    }

    private IntPtr MyCallbackFunction(int code, IntPtr wParam, IntPtr lParam)
    {
        if (code >= 0 && wParam == (IntPtr)WindowsMessage.WM_KEYUP)
        {
            var sk = Marshal.ReadInt32(lParam);
            // This can be used to find the scancode.
            // Press the key and watch the console to find out the scancode.
            Console.WriteLine("ScanCode: 0x{0:x4}", sk);

            if (sk == 0x0041) // 0x0041 is A
            {
                // We can't hold up the hook for too long; start the
                // tray open on another thread.
                new Action(OpenTray).BeginInvoke(null, null);
            }
        }
        return CallNextHookEx(IntPtr.Zero, code, wParam, lParam);
    }

    private void OpenTray()
    {
        mciSendString("set CDAudio door open", null, 0, IntPtr.Zero);
    }

    ~MyClass()
    {
        Uninstall();
    }
}

HID

С человеческим интерфейсным устройством будет намного сложнее взаимодействовать.Надеемся, Код проекта может помочь.

0 голосов
/ 25 августа 2011

Вы можете написать простую программу, которая просто опрашивает клавиатуру, пока вы нажимаете клавишу извлечения. Используйте GetKeyboardState () и проверьте, что было нажато. Или вы можете обработать сообщение WM_KEYDOWN и проверять коды клавиш при нажатии клавиши извлечения.

Вы пробовали смотреть в панель управления? Перейдите в Панель управления> Монитор> Настройки клавиш - оттуда вы сможете переназначить клавиши на клавиатуре.

0 голосов
/ 25 августа 2011

Вы должны использовать mciSendString API. смотрите здесь ТАКую ссылку для этого , если вы собираетесь сделать это программно.

0 голосов
/ 25 августа 2011

проверьте здесь:

с:

CDR

C #:

OpenCD

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...