2011-01-23 18 views
5

Mam następujący kod do symulacji volumemute przyciśnięcie:C# Symulacja VolumeMute naciśnij

[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); 
    } 

Kod ten nie robi praca. Wiem, że istnieje inny sposób wyciszania/wyłączania dźwięku przez SendMessageW, ale nie chcę używać SendMessageW, ponieważ używam KeyState do wykrywania, czy muszę wyciszyć dźwięk lub wyłączyć dźwięk (jeśli użytkownik chce wyłączyć dźwięk i jego już nie jest wyciszony wtedy nie muszę przełączać - to dlatego potrzebuję symulować naciśnięcie klawisza VolumeMute)

Dzięki.

+0

Kiedy mówisz, że to nie działa, czy otrzymujesz wyjątek od swojej p-invoke dobroci? – dexter

+0

Brak błędu. po prostu nie wycisza dźwięku .. – Ron

+0

Czy to okno jest mobilne? – fardjad

Odpowiedz

7

Pierwszy powód, dla którego to nie działa, polega na tym, że używasz niewłaściwej biblioteki DLL, coredll.dll to Windows Mobile. W wersji komputerowej systemu Windows keybd_event jest eksportowany przez plik user32.dll. Drugim powodem, dla którego nie działa, jest to, że wysłanie naciśnięcia klawisza nie jest wystarczająco dobre. Nie do końca pewny dlaczego, wydaje się, że został przechwycony przed ogólnym wejściowym handler'em.

Możesz użyć WM_APPCOMMAND, obsługuje szereg poleceń, a APPCOMMAND_VOLUME_MUTE jest jednym z nich. Działa jak przełącznik, włącza i wyłącza wyciszanie. Sprawdź swój kod wyglądać tak:

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); 
    } 

Kod ten musi znajdować się wewnątrz metody instancji formularza, trzeba pamiętać, w jaki sposób wykorzystuje DefWndProc(). Jeśli chcesz umieścić to gdzie indziej, musisz wrócić do SendMessage(). Rzeczywisty uchwyt okna nie ma znaczenia, o ile jest prawidłowy.

+1

funkcja u mnie nie symuluje naciśnięcia klawisza. Wycisza dźwięk, ale nie symuluje naciśnięcia klawisza. Jednak twoja odpowiedź była przydatna, zmieniam z coredll.dll na user32.dll i użyłem mojej funkcji - zadziałało. Dziękuję Ci. – Ron

+0

Erm, wycisza dźwięk. Czy nie o to chodzi? Możesz uważać, że na moim komputerze wysłanie naciśnięcia klawisza nie działa. Inni również zauważyli ten problem, jest kilka pytań na ten temat na forach MSDN. Wysłany przeze mnie kod działa dobrze. –

+1

Działa, jak już wspomniałem wcześniej. Ale moim celem jest to, że mam 2 przyciski 1 dla wyciszenia i 1 dla wyciszenia - powiedzmy, że obecny stan dźwięku jest wyciszony. Chcę wyciszyć dźwięk, ale z rozwiązaniem, bez względu na to, który przycisk będę naciskał - oba robią to samo ... tak więc podstawowe jest to, czego potrzebuję, aby uzyskać stan głównej głośności .... – Ron