Przerwanie timer1 po wciśnięciu klawisza z klawiatury

0
 private void timer1_Tick(object sender, System.EventArgs e)
    {
 
    }

po wciśnięciu np spacji chce żeby mi to przerwało jak to zrobić ?

0

Musisz przechwytywać wszystkie naciśnięcia klawiszy w głównej formie i sprawdzać czy nie pojawi się gdzieś kliknięta spacja. A wtedy dać tylko timer1.Enabled = false. Z tym że to będzie działało tylko wtedy gdy forma będzie aktywna - w przeciwnym wypadku trzeba użyć czegoś do globalnego przechwytywania klawiszy:
<kryptoreklama>https://winhooksnet.codeplex.com</kryptoreklama>

0

No teoria super a praktycznie jak to zrobić ?

0

Windows Form

W sieci znalazłem coś takiego

 protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == Keys.K && this.AcceptButton == null)
    {
        MessageBox.Show("Key K pressed");
    }

    return base.ProcessCmdKey(ref msg, keyData);
}

Działa, ale tylko wtedy jeśli okno jest aktywne.

1

Właśnie o tym pisałem, że tradycyjne metody będą działać tylko przy aktywnym oknie - dlatego trzeba napisać własną obsługę haków (hooks) lub skorzystać z mojej biblioteki, której adres podałem wcześniej. Wtedy wyglądało by to mniej-więcej tak:

private WinHooksNET.KeyboardHook _keyboardHook = new WinHooksNET.KeyboardHook();

...(konstruktor)
_keyboardHook.OnKeyboardAction += _keyboardHook_OnKeyboardAction;

...(funkcja)
void _keyboardHook_OnKeyboardAction(object sender, WinHooksNET.Events.KeyboardHookEventArgs e)
{
    if(e.Key == Key.Space)
    {
    MessageBox.Show("Spacja!");
    }
}
0

Nie wiem czy dobrze dodałem bibliotekę WinHooks.NET 1.3\Bin Release.NET 4 ale dodało Odwołania w Exploratorze rozwiązań.

0

Bibliotekę dodajesz poprzez Solution Explorer -> References -> PPM -> Add reference -> Browse i wybierasz tutaj dll'kę biblioteki. I po tym dodajesz już tylko ten kod co podałem wyżej. Powinno działać aczkolwiek na WinFormsach nie testowałem. Jak by co to pisz, kod zawsze można poprawić.

0

Tak zrobiłem Explorator Rozwiązań -> dodaj odwołanie

Wkleiłem i nie podkreśla czyli jest good

private WinHooksNET.KeyboardHook _keyboardHook = new WinHooksNET.KeyboardHook(); 

Tylko nie wiem jak to dodać

 ...(konstruktor)
_keyboardHook.OnKeyboardAction += _keyboardHook_OnKeyboardAction;
0

To powinno wyglądać mniej-więcej tak oczywiście nazwa klasy może być inna niż u Ciebie):

public partial class Form1 : Form
{
    private WinHooksNET.KeyboardHook _keyboardHook = new WinHooksNET.KeyboardHook();

    public Form1()
    {
          _keyboardHook.OnKeyboardAction += _keyboardHook_OnKeyboardAction;
    }

    public void _keyboardHook_OnKeyboardAction(object sender, WinHooksNET.Events.KeyboardHookEventArgs e)
    {
          if(e.Key == Key.Space)
          {
                 //Kliknięto spację
          }
    }
}
0

Podkreśla tylko Key

  Key.Space)

Nazwa „Key” nie istnieje w bieżącym kontekście.

0

Ok, to dodaj jeszcze w sekcji using

using System.Windows.Input;

, a jak będzie krzyczał że nie istnieje to dodaj referencję do System.Windows.Input.dll. Chodzi o WindowsBase.dll oczywiście.

0

A ta biblioteka jest w 4.0 bo na MSDN pisze Przestrzeń nazw System.Windows.Input .NET Framework 4.5

0

System.Windows.Input jest od wersji 3 do 4.5 włącznie więc z jej dołączeniem nie powinieneś mieć najmniejszych problemów. Dodasz ją tak samo przez Add reference, tylko nie w zakładce Browser, a ".NET" (albo "Assemblies", zależy jaka wersja środowiska).

0

No mam visual studio 2010 sp1 i nie mam tego w zakładce .NET ani COM user image

0

Przepraszonka, trochę wprowadziłem w błąd, dołączyć trzeba oczywiście WindowsBase.dll - nie wiem skąd mi się wzięła tamta biblioteka która de facto nie istnieje.

0

Musiałem dodać ręcznie z C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\WindowsBase.dll bo też nie było.

Teraz działa miodzio.

0
private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if(e.KeyCode == Keys.Escape)
            {
                timer1.Stop();
            }
        }

KeyPreview = True;
0

@szybki8562 - nie, już było mówione wcześniej że autora interesuje przychwytywanie klawiszy nawet w sytuacji, gdy forma nie jest aktywna. Twoje rozwiązanie działa tylko wtedy gry okno jest sfocusowane.

0

Po paru nastu dniach napotkałem problem.
Jak przerwać pętlę np w

 
private void timer1_Tick(object sender, EventArgs e)

 int a = Convert.ToInt16(numericUpDown1.Text);

            for (int i = 0; i < a; i++)
            {
                 if (e.Keys == Key.F8) //podkreśla Keys
                      {
                           timer1.Enabled = false;
                      }

             }
                timer1.Enabled = false;
        }

Jest możliwość umieszczenia e.Keys tam ?

0
betoniara napisał(a):

Jest możliwość umieszczenia e.Keys tam ?

Nie. Użyj zdarzenia KeyPress albo KeyDown dla formatki, ustaw w nim wartość jakiegoś pola klasy (np. bool timerEnabled), a następnie w timer_Tick napisz np.:

this.timer.Enabled = timerEnabled;
0

@somekind - a tyle razy było mówione że autorowi nie chodzi o lokalne przechwytywanie klawiszy na formatce. Tyle razy... :)

Co do tematu. Żeby pobrać stan jakiegoś klawisza, musisz skorzystać z funkcji GetKeyState która znajduje się w klasie KeyboardHooks. Czyli przykładowo może to wglądać tak:

if (keyboardHooks.GetKetState(Key.F8) == WinHooksNET.Enums.KeyState.Pressed)
{
    timer1.Enabled = false;
}

keyboardHooks to oczywiście obiekt klasy KeyboardHooks.

0

I znowu problem. Nazwa „keyboardHoks” nie istnieje w bieżącym kontekście.

0

No bo ten obiekt musisz sobie gdzieś zadeklarować. Czyli np:

public partial class Form1 : Form
{
    private WinHooksNET.KeyboardHook keyboardHook = new WinHooksNET.KeyboardHook();
 
    public Form1()
    {

    }

    private void timer1_Tick(object sender, EventArgs e)
   {
     int a = Convert.ToInt16(numericUpDown1.Text);
 
            for (int i = 0; i < a; i++)
            {
                 if (keyboardHook.GetKetState(Key.F8) == WinHooksNET.Enums.KeyState.Pressed)
                      {
                           timer1.Enabled = false;
                      }
 
             }
                timer1.Enabled = false;
        }
}
0

Le mam już podawałeś na pierwszej stronie

 
private WinHooksNET.KeyboardHook _keyboardHook = new WinHooksNET.KeyboardHook();
        public Form1()
        {
            InitializeComponent();
            _keyboardHook.OnKeyboardAction += _keyboardHook_OnKeyboardAction;
        }

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