Reakcja na naciśnięcie klawisza - problem

0

Hej,

Mam taki dziwny problem związany z obsługą klawiatury

Do obsługi naciśnięcia kursorem mam:

 private void button17_Click(object sender, EventArgs e)
        {
       loop(textBox2.Text + ".wav");
        }

Natomiast do obsługi klawiaturą

 

   private void button2_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.D2)
            {
                Klawisz(2);
            }
        }
      

Na numerację klawiszy nie patrzcie. Niby wszystko działa, ale użyć klawiatury mozna tylko w przypadku jeżeli wcześniej "podświetliłem klawisz myszą". Czyli naciskam kursorem i dopiero działa mi 1 z klawiatury.

Czemu tak jest ? Co zrobiłem źle ?

Mam nadzieję, że nie zamieszałem zbytnio ;:)

Pozdrawiam
Maciek

1

Namieszałeś.

loop(textBox2.Text + ".wav");

Co to za loop? Po nazwie można sądzić że jest tam jakaś pętla nieskończona czy coś.

Podpinasz się pod zdarzenia MouseEnter/MouseLeave przycisku?

Spróbuj wstawić breakpointa na linii (if (e.KeyCode == Keys.D2)) - F9 albo kliknięcie na pasku z boku w Visual Studio (pojawi się czerwona kropka). Przy uruchomieniu programu kiedy ta linia się będzie wykonywać wykonywanie zostanie zatrzymane. Sprawdź w ten sposób co dokładnie się dzieje (kiedy przycisk działa/nie działa).

Jeśli nic z tych rzeczy nie pomoże - podaj więcej kodu albo (lepiej) daj najmniejszy możliwy projekt w którym taki błąd występuje.

0

Loopem się nie przejmuj, to był tylko test, jest aktywowany przez naciśnięcie buttona.
A używam Eventu dla przycisku KeyDown, tak gdzieś wyczytałem, ale nie mam co do tego pewności .

Pozdrawiam

0

Bo dopóki nie dasz focusa na chcianą kontrolkę, to event KeyDown będzie wykonywany dla formy albo innej kontrolki, która ma focus. Skąd program ma wiedzieć, że akurat klikasz na ten przycisk? Możesz dać event dla formy i jeżeli jest dany klawisz kliknięty to dla odpowiedniego przycisku wykonujesz KeyDown.

0

No i niestety przy zastosowaniu dla Form1 też to nie działa. Próbowałem również to podpiąć pod CheckBox, ale niestety też nie chce ze mną współpracować ;)

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace BeatMachine
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        System.Media.SoundPlayer myPlayer = new System.Media.SoundPlayer();
        String text;


        public void wyswietlacz(string text)
       {
          
           textBox1.Text = text;
           
           
       }

 
  
        

        private void Form1_Load(object sender, EventArgs e)
        {
          wyswietlacz("W E L C O M E");
        }

        public void dzwiek(string nazwaPliku)
        {
            myPlayer.SoundLocation = System.Environment.CurrentDirectory.ToString() + "\\sounds\\" + nazwaPliku;
            myPlayer.Play();
        }

        public void loop(string nazwaPliku)
        { 
            myPlayer.SoundLocation = System.Environment.CurrentDirectory.ToString() + "\\sounds\\" + nazwaPliku;
            myPlayer.PlayLooping();
        }
        private void Klawisz(int numer)
        {
           textBox1.Text = "Klawisz" + numer;
            dzwiek(numer + ".wav");
        }


        
  private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
             if (e.KeyCode == Keys.D2)
             {
                Klawisz(10);
               }
         }
         }      
         }    
0

Aby zrobić to dla form, musisz w niej dać jeszcze KeyPreview = true;. Mówiłem ci, że dopóki kontrolka dla której chcesz przechwycić wciśnięcie klawisza nie będzie aktywowana, to nie wywoła się jej event. Żeby przechwycić wciśnięcie klawisza dla twojego przycisku, musisz dać button.Focus();, i wtedy możesz już przechwycać klawisze.

0

Faktycznie, działa ;) Dzięki za pomoc ;)

A moje pytanie jeszcze takiego typu.

Po naciśnięciu klawisza odtwarza mi dźwięk. Jak mogę zrobić, żeby dopóki trzymam klawisz, to dźwięk leci raz po razie? W tym momencie dopóki trzymam to odtwarza cały czas na nowo

0

Niestety SoundPlayer nie ma właściwości, która trzymała by długość wav'a ani eventu typu PlayingEnd. Należało by zadeklarować bool'a, który trzyma stan odtwarzania, false - stop, true - odtw. I odtwarzać dopiero, gdy jest na false. Tylko jak teraz wykryć kiedy odtwarza, a kiedy nie? Hmm.. wymyśliłem coś takiego: metoda PlaySync odtwarza synchronicznie, należałoby wywołanie tej metody wsadzić w oddzielny własny wątek. Po zakończeniu wątku wątek jest automatycznie opuszczany i tam ustawić playing = false. A w evencie sprawdzać czy playing true czy nie. Mniej więcej tak.

1

Jak mogę zrobić, żeby dopóki trzymam klawisz, to dźwięk leci raz po razie?

Chodzi o to żeby odtwarzało dźwięk w pętli?

http://msdn.microsoft.com/en-us/library/system.media.soundplayer.playlooping.aspx

1 użytkowników online, w tym zalogowanych: 0, gości: 1