private void timer1_Tick(object sender, System.EventArgs e)
{
}
po wciśnięciu np spacji chce żeby mi to przerwało jak to zrobić ?
private void timer1_Tick(object sender, System.EventArgs e)
{
}
po wciśnięciu np spacji chce żeby mi to przerwało jak to zrobić ?
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>
No teoria super a praktycznie jak to zrobić ?
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.
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!");
}
}
Nie wiem czy dobrze dodałem bibliotekę WinHooks.NET 1.3\Bin Release.NET 4 ale dodało Odwołania w Exploratorze rozwiązań.
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ć.
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;
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ę
}
}
}
Podkreśla tylko Key
Key.Space)
Nazwa „Key” nie istnieje w bieżącym kontekście.
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.
A ta biblioteka jest w 4.0 bo na MSDN pisze Przestrzeń nazw System.Windows.Input .NET Framework 4.5
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).
No mam visual studio 2010 sp1 i nie mam tego w zakładce .NET ani COM
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.
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.
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Escape)
{
timer1.Stop();
}
}
KeyPreview = True;
@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.
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 ?
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;
@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.
I znowu problem. Nazwa „keyboardHoks” nie istnieje w bieżącym kontekście.
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;
}
}
Le mam już podawałeś na pierwszej stronie
private WinHooksNET.KeyboardHook _keyboardHook = new WinHooksNET.KeyboardHook();
public Form1()
{
InitializeComponent();
_keyboardHook.OnKeyboardAction += _keyboardHook_OnKeyboardAction;
}