Необходимо сделать выбор клавиш для управления. Помните, был такой древний видеоплеер Light alloy
? Вот, надо сделать как там.
То есть, на второй форме лежит ListView
со списком Действие | Клавиша
. А в KeyDown
первой формы обращаемся к этому списку и ищем действие для нажатой клавиши.
На Delphi я уже такое писал. Сейчас переписал на C#
.
форма с ListView
:
using System;
using System.Windows.Forms;
using static WindowsFormsApp3.ListViewKeyboard;
namespace WindowsFormsApp3
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
colAction.AspectToStringConverter = val =>
{
KeyAction action = (KeyAction)val;
return action.ToString();
};
colKey.AspectToStringConverter = val =>
{
Keys k = (Keys)val;
return k.ToString();
};
}
}
}
Главная форма:
using System;
using System.Windows.Forms;
using static WindowsFormsApp3.ListViewKeyboard;
namespace WindowsFormsApp3
{
public partial class Form1 : Form
{
private Form2 form2;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
form2 = new Form2();
form2.Show();
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
KeyAction action = form2.listViewKeyboard1.FindAction(e.KeyCode);
System.Diagnostics.Debug.WriteLine(action.ToString());
}
}
}
И, собственно, сам компонент со списком:
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using BrightIdeasSoftware;
namespace WindowsFormsApp3
{
public class ListViewKeyboard : TreeListView
{
public enum KeyAction { Dummy, Action1, Action2 }
public class KeyboardItem
{
public Keys KeyId { get; private set; }
public KeyAction KeyAction { get; private set; }
public KeyboardItem(Keys key, KeyAction action)
{
KeyId = key;
KeyAction = action;
}
}
public ListViewKeyboard()
{
View = View.Details;
Roots = new List<KeyboardItem>();
List<KeyboardItem> roots = Roots.Cast<KeyboardItem>().ToList();
roots.Add(new KeyboardItem(Keys.A, KeyAction.Action1));
roots.Add(new KeyboardItem(Keys.Space, KeyAction.Action2));
UpdateObjects(roots);
}
public KeyAction FindAction(Keys key)
{
List<KeyboardItem> roots = Roots.Cast<KeyboardItem>().ToList();
foreach (KeyboardItem item in roots)
{
if (item.KeyId == key)
{
return item.KeyAction;
}
}
return KeyAction.Dummy;
}
}
}
Компонент еще не допилен. Это только концепция того, как я это вижу.
В результате, оно работает. При нажатии A
выдаётся Action1
. При нажатии Space
выдаётся Action2
. А при нажатии клавиш, которых нет в списке - выдаётся Dummy
. Как и задумано.
Но как это делается правильно?