WingMan – Diff between revs 3 and 4

Subversion Repositories:
Rev:
Only display areas with differencesIgnore whitespace
Rev 3 Rev 4
1 using System; 1 using System;
-   2 using System.Collections.Concurrent;
2 using System.Collections.Generic; 3 using System.Collections.Generic;
3 using System.ComponentModel; 4 using System.ComponentModel;
4 using System.Data; 5 using System.Data;
5 using System.Drawing; 6 using System.Drawing;
6 using System.Globalization; 7 using System.Globalization;
7 using System.Linq; 8 using System.Linq;
8 using System.Net; 9 using System.Net;
-   10 using System.Resources;
9 using System.Text; 11 using System.Text;
10 using System.Threading; 12 using System.Threading;
11 using System.Threading.Tasks; 13 using System.Threading.Tasks;
12 using System.Windows.Forms; 14 using System.Windows.Forms;
-   15 using Gma.System.MouseKeyHook;
13 using WingMan.Communication; 16 using WingMan.Communication;
14 using WingMan.Host; 17 using WingMan.Host;
15   18  
16 namespace WingMan 19 namespace WingMan
17 { 20 {
18 public partial class WingManForm : Form 21 public partial class WingManForm : Form
19 { 22 {
20 private MQTTServer MQTTServer { get; set; } 23 private MQTTServer MQTTServer { get; set; }
21   24  
22 private MQTTClient MQTTClient { get; set; } 25 private MQTTClient MQTTClient { get; set; }
23   26  
24 private SemaphoreSlim MQTTServerSemaphore {get; set;} = new SemaphoreSlim(1, 1); 27 private SemaphoreSlim MQTTServerSemaphore {get; set;} = new SemaphoreSlim(1, 1);
25   28  
26 private SemaphoreSlim MQTTClientSemaphore { get; set; } = new SemaphoreSlim(1, 1); 29 private SemaphoreSlim MQTTClientSemaphore { get; set; } = new SemaphoreSlim(1, 1);
-   30  
-   31 private static IKeyboardMouseEvents MouseKeyApplicationHook { get; set; }
-   32  
-   33 private static IKeyboardMouseEvents MouseKeyGlobalHook { get; set; }
-   34  
-   35 private List<string> MouseKeyCombo { get; set; }
-   36  
-   37 private HelmBindings HelmBindings { get; set; }
-   38  
-   39 private BindingSource HelmBindingSource { get; set; }
-   40  
-   41 public ConcurrentDictionary<string, HelmBindings> WingBindings { get; set; }
27   42  
28 public WingManForm() 43 public WingManForm()
29 { 44 {
30 InitializeComponent(); 45 InitializeComponent();
-   46  
-   47 MouseKeyGlobalHook = Hook.GlobalEvents();
31   48  
32 MQTTClient = new MQTTClient(this); 49 MQTTClient = new MQTTClient(this);
-   50 MQTTServer = new MQTTServer(this);
-   51  
-   52 HelmBindings = new HelmBindings();
-   53 HelmBindings.Bindings = new List<HelmBinding>();
-   54  
-   55 HelmBindingSource = new BindingSource();
-   56 HelmBindingSource.DataSource = HelmBindings.Bindings;
-   57  
-   58 HelmBindingsListBox.DisplayMember = "DisplayName";
-   59 HelmBindingsListBox.ValueMember = "Keys";
-   60 HelmBindingsListBox.DataSource = HelmBindingSource;
-   61  
33 MQTTServer = new MQTTServer(this); 62 WingBindings = new ConcurrentDictionary<string, HelmBindings>();
34 } 63 }
35   64  
36 private void AddressTextBoxClick(object sender, EventArgs e) 65 private void AddressTextBoxClick(object sender, EventArgs e)
37 { 66 {
38 Address.BackColor = Color.Empty; 67 Address.BackColor = Color.Empty;
39 } 68 }
40   69  
41 private void PortTextBoxClick(object sender, EventArgs e) 70 private void PortTextBoxClick(object sender, EventArgs e)
42 { 71 {
43 Port.BackColor = Color.Empty; 72 Port.BackColor = Color.Empty;
44 } 73 }
45   74  
46 private async void HostButtonClickAsync(object sender, EventArgs e) 75 private async void HostButtonClickAsync(object sender, EventArgs e)
47 { 76 {
48 // Stop the MQTT server if it is running. 77 // Stop the MQTT server if it is running.
49 if (MQTTServer.ServerRunning) 78 if (MQTTServer.ServerRunning)
50 { 79 {
51 await StopServer(); 80 await StopServer();
52 toolStripStatusLabel.Text = Properties.Strings.Server_stopped; 81 toolStripStatusLabel.Text = Properties.Strings.Server_stopped;
53 HostButton.BackColor = Color.Empty; 82 HostButton.BackColor = Color.Empty;
54   83  
55 // Enable controls. 84 // Enable controls.
56 ConnectButton.Enabled = true; 85 ConnectButton.Enabled = true;
57 EnableConnectionControls(); 86 EnableConnectionControls();
58 return; 87 return;
59 } 88 }
60   89  
61 if (!ValidateAddressPort(out var ipAddress, out var port, out var nick)) 90 if (!ValidateAddressPort(out var ipAddress, out var port, out var nick))
62 return; 91 return;
63   92  
64 // Start the MQTT server. 93 // Start the MQTT server.
65 await StartServer(ipAddress, port, nick); 94 await StartServer(ipAddress, port, nick);
66 toolStripStatusLabel.Text = Properties.Strings.Server_started; 95 toolStripStatusLabel.Text = Properties.Strings.Server_started;
67 HostButton.BackColor = Color.Aquamarine; 96 HostButton.BackColor = Color.Aquamarine;
68   97  
69 // Disable controls 98 // Disable controls
70 ConnectButton.Enabled = false; 99 ConnectButton.Enabled = false;
71 DisableConnectionControls(); 100 DisableConnectionControls();
72 } 101 }
73   102  
74 private void DisableConnectionControls() 103 private void DisableConnectionControls()
75 { 104 {
76 Address.Enabled = false; 105 Address.Enabled = false;
77 Port.Enabled = false; 106 Port.Enabled = false;
78 Nick.Enabled = false; 107 Nick.Enabled = false;
79 } 108 }
80   109  
81 private void EnableConnectionControls() 110 private void EnableConnectionControls()
82 { 111 {
83 Address.Enabled = true; 112 Address.Enabled = true;
84 Port.Enabled = true; 113 Port.Enabled = true;
85 Nick.Enabled = true; 114 Nick.Enabled = true;
86 } 115 }
87   116  
88 private bool ValidateAddressPort(out IPAddress address, out int port, out string nick) 117 private bool ValidateAddressPort(out IPAddress address, out int port, out string nick)
89 { 118 {
90 address = IPAddress.Any; 119 address = IPAddress.Any;
91 port = 0; 120 port = 0;
92 nick = string.Empty; 121 nick = string.Empty;
93   122  
94 if (string.IsNullOrEmpty(Address.Text) && 123 if (string.IsNullOrEmpty(Address.Text) &&
95 string.IsNullOrEmpty(Port.Text) && 124 string.IsNullOrEmpty(Port.Text) &&
96 string.IsNullOrEmpty(Nick.Text)) 125 string.IsNullOrEmpty(Nick.Text))
97 { 126 {
98 Address.BackColor = Color.LightPink; 127 Address.BackColor = Color.LightPink;
99 Port.BackColor = Color.LightPink; 128 Port.BackColor = Color.LightPink;
100 Nick.BackColor = Color.LightPink; 129 Nick.BackColor = Color.LightPink;
101 return false; 130 return false;
102 } 131 }
103   132  
104 if (!IPAddress.TryParse(Address.Text, out address)) 133 if (!IPAddress.TryParse(Address.Text, out address))
105 { 134 {
106 Address.BackColor = Color.LightPink; 135 Address.BackColor = Color.LightPink;
107 return false; 136 return false;
108 } 137 }
109   138  
110 if (!uint.TryParse(Port.Text, out var uPort)) 139 if (!uint.TryParse(Port.Text, out var uPort))
111 { 140 {
112 Port.BackColor = Color.LightPink; 141 Port.BackColor = Color.LightPink;
113 return false; 142 return false;
114 } 143 }
115   144  
116 port = (int) uPort; 145 port = (int) uPort;
117   146  
118 if (string.IsNullOrEmpty(Nick.Text)) 147 if (string.IsNullOrEmpty(Nick.Text))
119 { 148 {
120 Nick.BackColor = Color.LightPink; 149 Nick.BackColor = Color.LightPink;
121 return false; 150 return false;
122 } 151 }
123   152  
124 nick = Nick.Text; 153 nick = Nick.Text;
125   154  
126 Address.BackColor = Color.Empty; 155 Address.BackColor = Color.Empty;
127 Port.BackColor = Color.Empty; 156 Port.BackColor = Color.Empty;
128 Nick.BackColor = Color.Empty; 157 Nick.BackColor = Color.Empty;
129   158  
130 return true; 159 return true;
131 } 160 }
132   161  
133 private async Task StartServer(IPAddress ipAddress, int port, string nick) 162 private async Task StartServer(IPAddress ipAddress, int port, string nick)
134 { 163 {
135 await MQTTServerSemaphore.WaitAsync(); 164 await MQTTServerSemaphore.WaitAsync();
136 try 165 try
137 { 166 {
138 await MQTTServer.Start(ipAddress, port, nick); 167 await MQTTServer.Start(ipAddress, port, nick);
139 } 168 }
140 finally 169 finally
141 { 170 {
142 MQTTServerSemaphore.Release(); 171 MQTTServerSemaphore.Release();
143 } 172 }
144 } 173 }
145   174  
146 private async Task StopServer() 175 private async Task StopServer()
147 { 176 {
148 await MQTTServerSemaphore.WaitAsync(); 177 await MQTTServerSemaphore.WaitAsync();
149 try 178 try
150 { 179 {
151 await MQTTServer.Stop(); 180 await MQTTServer.Stop();
152 } 181 }
153 finally 182 finally
154 { 183 {
155 MQTTServerSemaphore.Release(); 184 MQTTServerSemaphore.Release();
156 } 185 }
157 } 186 }
158   187  
159 private async void ConnectButtonClickAsync(object sender, EventArgs e) 188 private async void ConnectButtonClickAsync(object sender, EventArgs e)
160 { 189 {
161 if (MQTTClient.ClientRunning) 190 if (MQTTClient.ClientRunning)
162 { 191 {
163 await StopClient(); 192 await StopClient();
164 ConnectButton.Text = Properties.Strings.Connect; 193 ConnectButton.Text = Properties.Strings.Connect;
165 ConnectButton.BackColor = Color.Empty; 194 ConnectButton.BackColor = Color.Empty;
166   195  
167 EnableConnectionControls(); 196 EnableConnectionControls();
168 HostButton.Enabled = true; 197 HostButton.Enabled = true;
169 return; 198 return;
170 } 199 }
171   200  
172 if (!ValidateAddressPort(out var ipAddress, out var port, out var nick)) 201 if (!ValidateAddressPort(out var ipAddress, out var port, out var nick))
173 return; 202 return;
174   203  
175 await StartClient(ipAddress, port, nick); 204 await StartClient(ipAddress, port, nick);
176   205  
177 toolStripStatusLabel.Text = Properties.Strings.Client_started; 206 toolStripStatusLabel.Text = Properties.Strings.Client_started;
178 ConnectButton.Text = Properties.Strings.Disconnect; 207 ConnectButton.Text = Properties.Strings.Disconnect;
179 ConnectButton.BackColor = Color.Aquamarine; 208 ConnectButton.BackColor = Color.Aquamarine;
180   209  
181 HostButton.Enabled = false; 210 HostButton.Enabled = false;
182 DisableConnectionControls(); 211 DisableConnectionControls();
183 } 212 }
184   213  
185 private async Task StopClient() 214 private async Task StopClient()
186 { 215 {
187 await MQTTClientSemaphore.WaitAsync(); 216 await MQTTClientSemaphore.WaitAsync();
188 try 217 try
189 { 218 {
190 await MQTTClient.Stop(); 219 await MQTTClient.Stop();
191 } 220 }
192 finally 221 finally
193 { 222 {
194 MQTTClientSemaphore.Release(); 223 MQTTClientSemaphore.Release();
195 } 224 }
196 } 225 }
197   226  
198 private async Task StartClient(IPAddress ipAddress, int port, string nick) 227 private async Task StartClient(IPAddress ipAddress, int port, string nick)
199 { 228 {
200 await MQTTClientSemaphore.WaitAsync(); 229 await MQTTClientSemaphore.WaitAsync();
201 try 230 try
202 { 231 {
203 await MQTTClient.Start(ipAddress, port, nick); 232 await MQTTClient.Start(ipAddress, port, nick);
204 } 233 }
205 finally 234 finally
206 { 235 {
207 MQTTClientSemaphore.Release(); 236 MQTTClientSemaphore.Release();
208 } 237 }
209 } 238 }
210   239  
211 private async void LobbySayTextBoxKeyDown(object sender, KeyEventArgs e) 240 private async void LobbySayTextBoxKeyDown(object sender, KeyEventArgs e)
212 { 241 {
213 if (e.KeyCode != Keys.Enter) 242 if (e.KeyCode != Keys.Enter)
214 return; 243 return;
215   244  
216 if (MQTTServer.ServerRunning) 245 if (MQTTServer.ServerRunning)
217 { 246 {
218 await MQTTServer.BroadcastLobbyMessage(LobbySayTextBox.Text); 247 await MQTTServer.BroadcastLobbyMessage(LobbySayTextBox.Text);
219 } 248 }
220   249  
221 if (MQTTClient.ClientRunning) 250 if (MQTTClient.ClientRunning)
222 { 251 {
223 await MQTTClient.BroadcastLobbyMessage(LobbySayTextBox.Text); 252 await MQTTClient.BroadcastLobbyMessage(LobbySayTextBox.Text);
224 } 253 }
225   254  
226 } 255 }
-   256  
-   257 private void HelmAddButtonClick(object sender, EventArgs e)
-   258 {
-   259 if (string.IsNullOrEmpty(HelmNameTextBox.Text))
-   260 {
-   261 HelmNameTextBox.BackColor = Color.LightPink;
-   262 return;
-   263 }
-   264  
-   265 HelmAddButton.Enabled = false;
-   266  
-   267 MouseKeyCombo = new List<string>();
-   268  
-   269 MouseKeyApplicationHook = Hook.AppEvents();
-   270 MouseKeyApplicationHook.MouseDown += MouseKeyHookOnMouseDown;
-   271 MouseKeyApplicationHook.KeyUp += MouseKeyHookOnKeyUp;
-   272 MouseKeyApplicationHook.KeyDown += MouseKeyHookOnKeyDown;
-   273 MouseKeyApplicationHook.MouseUp += MouseKeyHookOnMouseUp;
-   274  
-   275 }
-   276  
-   277 private void MouseKeyHookOnKeyUp(object sender, KeyEventArgs e)
-   278 {
-   279 HelmBindings.Bindings.Add(new HelmBinding
-   280 {
-   281 Keys = MouseKeyCombo,
-   282 Name = HelmNameTextBox.Text
-   283 });
-   284  
-   285 HelmBindingSource.ResetBindings(false);
-   286  
-   287 MouseKeyApplicationHook.KeyDown -= MouseKeyHookOnKeyDown;
-   288 MouseKeyApplicationHook.KeyUp -= MouseKeyHookOnKeyUp;
-   289  
-   290 MouseKeyApplicationHook.Dispose();
-   291  
-   292 HelmNameTextBox.Text = string.Empty;
-   293 HelmAddButton.Enabled = true;
-   294 }
-   295  
-   296 private void MouseKeyHookOnMouseUp(object sender, MouseEventArgs e)
-   297 {
-   298 HelmBindings.Bindings.Add(new HelmBinding
-   299 {
-   300 Keys = MouseKeyCombo,
-   301 Name = HelmNameTextBox.Text
-   302 });
-   303  
-   304 HelmBindingSource.ResetBindings(false);
-   305  
-   306 MouseKeyApplicationHook.KeyDown -= MouseKeyHookOnKeyDown;
-   307 MouseKeyApplicationHook.KeyUp -= MouseKeyHookOnKeyUp;
-   308  
-   309 MouseKeyApplicationHook.Dispose();
-   310  
-   311 HelmNameTextBox.Text = string.Empty;
-   312 HelmAddButton.Enabled = true;
-   313 }
-   314  
-   315  
-   316 private void MouseKeyHookOnMouseDown(object sender, MouseEventArgs e)
-   317 {
-   318 MouseKeyCombo.Add(MouseButtonToName(e.Button));
-   319 }
-   320  
-   321 private void MouseKeyHookOnKeyDown(object sender, KeyEventArgs e)
-   322 {
-   323 e.SuppressKeyPress = true;
-   324  
-   325 MouseKeyCombo.Add(KeyCodeToName((int) e.KeyCode));
-   326 }
-   327  
-   328 private void HelmNameTextBoxClick(object sender, EventArgs e)
-   329 {
-   330 HelmNameTextBox.BackColor = Color.Empty;
-   331 }
-   332  
-   333 private string MouseButtonToName(MouseButtons button)
-   334 {
-   335 var mouseButton = string.Empty;
-   336 switch (button)
-   337 {
-   338 case MouseButtons.Left:
-   339 mouseButton = "Left Mouse Button";
-   340 break;
-   341 case MouseButtons.Middle:
-   342 mouseButton = "Middle Mouse Button";
-   343 break;
-   344 case MouseButtons.Right:
-   345 mouseButton = "Right Mouse Button";
-   346 break;
-   347 }
-   348  
-   349 return mouseButton;
-   350 }
-   351  
-   352 private string KeyCodeToName(int code)
-   353 {
-   354 var keyString = string.Empty;
-   355 switch (code)
-   356 {
-   357 case 0:
-   358 break;
-   359 case 1:
-   360 keyString = "Mouse Left";
-   361 break;
-   362 case 2:
-   363 keyString = "Mouse Right";
-   364 break;
-   365 case 3:
-   366 keyString = "Cancel";
-   367 break;
-   368 case 4:
-   369 keyString = "Mouse Middle";
-   370 break;
-   371 case 5:
-   372 keyString = "Special 1";
-   373 break;
-   374 case 6:
-   375 keyString = "Special 2";
-   376 break;
-   377 case 8:
-   378 keyString = "Back";
-   379 break;
-   380 case 9:
-   381 keyString = "TAB";
-   382 break;
-   383 case 12:
-   384 keyString = "Clear";
-   385 break;
-   386 case 13:
-   387 keyString = "Enter";
-   388 break;
-   389 case 16:
-   390 keyString = "Shift";
-   391 break;
-   392 case 17:
-   393 keyString = "Ctrl";
-   394 break;
-   395 case 18:
-   396 keyString = "Menu";
-   397 break;
-   398 case 19:
-   399 keyString = "Pause";
-   400 break;
-   401 case 20:
-   402 keyString = "Caps Lock";
-   403 break;
-   404 case 21:
-   405 keyString = "Kana/Hangul";
-   406 break;
-   407 case 23:
-   408 keyString = "Junja";
-   409 break;
-   410 case 24:
-   411 keyString = "Final";
-   412 break;
-   413 case 25:
-   414 keyString = "Hanja/Kanji";
-   415 break;
-   416 case 27:
-   417 keyString = "Esc";
-   418 break;
-   419 case 28:
-   420 keyString = "Convert";
-   421 break;
-   422 case 29:
-   423 keyString = "NonConvert";
-   424 break;
-   425 case 30:
-   426 keyString = "Accept";
-   427 break;
-   428 case 31:
-   429 keyString = "Mode";
-   430 break;
-   431 case 32:
-   432 keyString = "Space";
-   433 break;
-   434 case 33:
-   435 keyString = "Page Up";
-   436 break;
-   437 case 34:
-   438 keyString = "Page Down";
-   439 break;
-   440 case 35:
-   441 keyString = "End";
-   442 break;
-   443 case 36:
-   444 keyString = "Home";
-   445 break;
-   446 case 37:
-   447 keyString = "Left";
-   448 break;
-   449 case 38:
-   450 keyString = "Up";
-   451 break;
-   452 case 39:
-   453 keyString = "Right";
-   454 break;
-   455 case 40:
-   456 keyString = "Down";
-   457 break;
-   458 case 41:
-   459 keyString = "Select";
-   460 break;
-   461 case 42:
-   462 keyString = "Print";
-   463 break;
-   464 case 43:
-   465 keyString = "Execute";
-   466 break;
-   467 case 44:
-   468 keyString = "Snapshot";
-   469 break;
-   470 case 45:
-   471 keyString = "Insert";
-   472 break;
-   473 case 46:
-   474 keyString = "Delete";
-   475 break;
-   476 case 47:
-   477 keyString = "Help";
-   478 break;
-   479 case 48:
-   480 keyString = "Num 0";
-   481 break;
-   482 case 49:
-   483 keyString = "Num 1";
-   484 break;
-   485 case 50:
-   486 keyString = "Num 2";
-   487 break;
-   488 case 51:
-   489 keyString = "Num 3";
-   490 break;
-   491 case 52:
-   492 keyString = "Num 4";
-   493 break;
-   494 case 53:
-   495 keyString = "Num 5";
-   496 break;
-   497 case 54:
-   498 keyString = "Num 6";
-   499 break;
-   500 case 55:
-   501 keyString = "Num 7";
-   502 break;
-   503 case 56:
-   504 keyString = "Num 8";
-   505 break;
-   506 case 57:
-   507 keyString = "Num 9";
-   508 break;
-   509 case 65:
-   510 keyString = "A";
-   511 break;
-   512 case 66:
-   513 keyString = "B";
-   514 break;
-   515 case 67:
-   516 keyString = "C";
-   517 break;
-   518 case 68:
-   519 keyString = "D";
-   520 break;
-   521 case 69:
-   522 keyString = "E";
-   523 break;
-   524 case 70:
-   525 keyString = "F";
-   526 break;
-   527 case 71:
-   528 keyString = "G";
-   529 break;
-   530 case 72:
-   531 keyString = "H";
-   532 break;
-   533 case 73:
-   534 keyString = "I";
-   535 break;
-   536 case 74:
-   537 keyString = "J";
-   538 break;
-   539 case 75:
-   540 keyString = "K";
-   541 break;
-   542 case 76:
-   543 keyString = "L";
-   544 break;
-   545 case 77:
-   546 keyString = "M";
-   547 break;
-   548 case 78:
-   549 keyString = "N";
-   550 break;
-   551 case 79:
-   552 keyString = "O";
-   553 break;
-   554 case 80:
-   555 keyString = "P";
-   556 break;
-   557 case 81:
-   558 keyString = "Q";
-   559 break;
-   560 case 82:
-   561 keyString = "R";
-   562 break;
-   563 case 83:
-   564 keyString = "S";
-   565 break;
-   566 case 84:
-   567 keyString = "T";
-   568 break;
-   569 case 85:
-   570 keyString = "U";
-   571 break;
-   572 case 86:
-   573 keyString = "V";
-   574 break;
-   575 case 87:
-   576 keyString = "W";
-   577 break;
-   578 case 88:
-   579 keyString = "X";
-   580 break;
-   581 case 89:
-   582 keyString = "Y";
-   583 break;
-   584 case 90:
-   585 keyString = "Z";
-   586 break;
-   587 case 91:
-   588 keyString = "Windows Left";
-   589 break;
-   590 case 92:
-   591 keyString = "Windows Right";
-   592 break;
-   593 case 93:
-   594 keyString = "Application";
-   595 break;
-   596 case 95:
-   597 keyString = "Sleep";
-   598 break;
-   599 case 96:
-   600 keyString = "NumPad 0";
-   601 break;
-   602 case 97:
-   603 keyString = "NumPad 1";
-   604 break;
-   605 case 98:
-   606 keyString = "NumPad 2";
-   607 break;
-   608 case 99:
-   609 keyString = "NumPad 3";
-   610 break;
-   611 case 100:
-   612 keyString = "NumPad 4";
-   613 break;
-   614 case 101:
-   615 keyString = "NumPad 5";
-   616 break;
-   617 case 102:
-   618 keyString = "NumPad 6";
-   619 break;
-   620 case 103:
-   621 keyString = "NumPad 7";
-   622 break;
-   623 case 104:
-   624 keyString = "NumPad 8";
-   625 break;
-   626 case 105:
-   627 keyString = "NumPad 9";
-   628 break;
-   629 case 106:
-   630 keyString = "NumPad *";
-   631 break;
-   632 case 107:
-   633 keyString = "NumPad +";
-   634 break;
-   635 case 108:
-   636 keyString = "NumPad .";
-   637 break;
-   638 case 109:
-   639 keyString = "NumPad -";
-   640 break;
-   641 case 110:
-   642 keyString = "NumPad ,";
-   643 break;
-   644 case 111:
-   645 keyString = "NumPad /";
-   646 break;
-   647 case 112:
-   648 keyString = "F1";
-   649 break;
-   650 case 113:
-   651 keyString = "F2";
-   652 break;
-   653 case 114:
-   654 keyString = "F3";
-   655 break;
-   656 case 115:
-   657 keyString = "F4";
-   658 break;
-   659 case 116:
-   660 keyString = "F5";
-   661 break;
-   662 case 117:
-   663 keyString = "F6";
-   664 break;
-   665 case 118:
-   666 keyString = "F7";
-   667 break;
-   668 case 119:
-   669 keyString = "F8";
-   670 break;
-   671 case 120:
-   672 keyString = "F9";
-   673 break;
-   674 case 121:
-   675 keyString = "F10";
-   676 break;
-   677 case 122:
-   678 keyString = "F11";
-   679 break;
-   680 case 123:
-   681 keyString = "F12";
-   682 break;
-   683 case 124:
-   684 keyString = "F13";
-   685 break;
-   686 case 125:
-   687 keyString = "F14";
-   688 break;
-   689 case 126:
-   690 keyString = "F15";
-   691 break;
-   692 case 127:
-   693 keyString = "F16";
-   694 break;
-   695 case 128:
-   696 keyString = "F17";
-   697 break;
-   698 case 129:
-   699 keyString = "F18";
-   700 break;
-   701 case 130:
-   702 keyString = "F19";
-   703 break;
-   704 case 131:
-   705 keyString = "F20";
-   706 break;
-   707 case 132:
-   708 keyString = "F21";
-   709 break;
-   710 case 133:
-   711 keyString = "F22";
-   712 break;
-   713 case 134:
-   714 keyString = "F23";
-   715 break;
-   716 case 135:
-   717 keyString = "F24";
-   718 break;
-   719 case 144:
-   720 keyString = "Num lock";
-   721 break;
-   722 case 145:
-   723 keyString = "Scroll";
-   724 break;
-   725 case 160:
-   726 keyString = "Shift Left";
-   727 break;
-   728 case 161:
-   729 keyString = "Shift Right";
-   730 break;
-   731 case 162:
-   732 keyString = "Ctrl Left";
-   733 break;
-   734 case 163:
-   735 keyString = "Ctrl Right";
-   736 break;
-   737 case 164:
-   738 keyString = "Menu Left";
-   739 break;
-   740 case 165:
-   741 keyString = "Menu Right";
-   742 break;
-   743 default:
-   744 break;
-   745 }
-   746  
-   747 return keyString;
-   748 }
-   749  
-   750 private void HelmRemoveButtonClick(object sender, EventArgs e)
-   751 {
-   752 var helmBinding = (HelmBinding)HelmBindingsListBox.SelectedItem;
-   753 if (helmBinding == null)
-   754 return;
-   755  
-   756 HelmBindings.Bindings.Remove(helmBinding);
-   757 HelmBindingSource.ResetBindings(false);
-   758 }
227 } 759 }
228 } 760 }
229   761