2011-01-23 4 views
5

Я получил следующий код, чтобы имитировать volumemute нажатие:C# Simulate VolumeMute нажмите

[DllImport("coredll.dll", SetLastError = true)] 
    static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); 

    byte VK_VOLUME_MUTE = 0xAD; 
    const int KEYEVENTF_KEYUP = 0x2; 
    const int KEYEVENTF_KEYDOWN = 0x0; 
    private void button1_Click(object sender, EventArgs e) 
    { 
      keybd_event(VK_VOLUME_MUTE, 0, KEYEVENTF_KEYDOWN, 0); 
      keybd_event(VK_VOLUME_MUTE, 0, KEYEVENTF_KEYUP, 0); 
    } 

Этот код не работает. Я знаю, что есть другой способ отключить звук/включить звук с помощью SendMessageW, но я не хочу использовать SendMessageW, потому что я использую KeyState для обнаружения того, что мне нужно отключить звук или включить звук (если пользователь хочет включить звук и его уже отключен то мне не нужно переключаться - вот почему мне нужно имитировать нажатие VolumeMute)

Спасибо.

+0

Когда вы говорите, что это не сработает, вы получаете исключение из своего p-invoke доброты? – dexter

+0

Ошибка. он просто не заглушает звук. – Ron

+0

Являются ли эти окна мобильными? – fardjad

ответ

7

Первая причина, по которой он не работает, заключается в том, что вы используете неправильную DLL, coredll.dll - это Windows Mobile. В настольной версии Windows, keybd_event экспортируется user32.dll. Вторая причина, по которой это не работает, заключается в том, что отправка нажатия клавиши недостаточно. Не совсем понятно, почему это, похоже, перехватывается перед общим обработчиком ввода.

Вы можете использовать WM_APPCOMMAND, он поддерживает ряд команд, и APPCOMMAND_VOLUME_MUTE является одним из них. Он действует как переключатель, включающий и выключая звук. Сделайте ваш код выглядеть следующим образом:

private void button1_Click(object sender, EventArgs e) { 
     var msg = new Message(); 
     msg.HWnd = this.Handle; 
     msg.Msg = 0x319;    // WM_APPCOMMAND 
     msg.WParam = this.Handle; 
     msg.LParam = (IntPtr)0x80000; // APPCOMMAND_VOLUME_MUTE 
     this.DefWndProc(ref msg); 
    } 

Этот код должен быть внутри метода экземпляра формы, обратите внимание, как он использует DefWndProc(). Если вы хотите поместить его в другое место, вам нужно отступить в SendMessage(). Фактический дескриптор окна не имеет значения, если он действителен для верхнего уровня.

+1

Функция u дал мне НЕ имитировать нажатие клавиши. Он отключает звук, но не симулирует нажатие клавиши. Однако ваш ответ был полезен, я перехожу из coredll.dll в user32.dll и использовал свою функцию - он работал. Спасибо. – Ron

+0

Erm, он отключает звук. Разве это не все? Вы можете подумать, что на моей машине отправка нажатия клавиши не работает. Другие также заметили эту проблему, есть несколько вопросов об этом на форумах MSDN. Известно, что код, который я опубликовал, работает хорошо. –

+1

Это действительно работает, как я уже говорил. Но я хочу сказать, что у меня есть 2 кнопки 1 для отключения звука и 1 для включения звука - скажем, текущее состояние звука отключено. Я хочу включить звук, но с решением ура, независимо от того, на какую кнопку я буду нажимать - они оба делают то же самое ... так что основное, что мне нужно, это получить состояние мастер-тома .... – Ron

 Смежные вопросы

  • Нет связанных вопросов^_^