WingMan – Blame information for rev 4
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | using System; |
4 | office | 2 | using System.Collections.Concurrent; |
1 | office | 3 | using System.Collections.Generic; |
4 | using System.ComponentModel; |
||
5 | using System.Data; |
||
6 | using System.Drawing; |
||
7 | using System.Globalization; |
||
8 | using System.Linq; |
||
9 | using System.Net; |
||
4 | office | 10 | using System.Resources; |
1 | office | 11 | using System.Text; |
12 | using System.Threading; |
||
13 | using System.Threading.Tasks; |
||
14 | using System.Windows.Forms; |
||
4 | office | 15 | using Gma.System.MouseKeyHook; |
1 | office | 16 | using WingMan.Communication; |
17 | using WingMan.Host; |
||
18 | |||
19 | namespace WingMan |
||
20 | { |
||
2 | office | 21 | public partial class WingManForm : Form |
1 | office | 22 | { |
2 | office | 23 | private MQTTServer MQTTServer { get; set; } |
1 | office | 24 | |
2 | office | 25 | private MQTTClient MQTTClient { get; set; } |
1 | office | 26 | |
27 | private SemaphoreSlim MQTTServerSemaphore {get; set;} = new SemaphoreSlim(1, 1); |
||
28 | |||
29 | private SemaphoreSlim MQTTClientSemaphore { get; set; } = new SemaphoreSlim(1, 1); |
||
30 | |||
4 | office | 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; } |
||
42 | |||
2 | office | 43 | public WingManForm() |
1 | office | 44 | { |
45 | InitializeComponent(); |
||
2 | office | 46 | |
4 | office | 47 | MouseKeyGlobalHook = Hook.GlobalEvents(); |
48 | |||
2 | office | 49 | MQTTClient = new MQTTClient(this); |
50 | MQTTServer = new MQTTServer(this); |
||
4 | office | 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 | |||
62 | WingBindings = new ConcurrentDictionary<string, HelmBindings>(); |
||
1 | office | 63 | } |
64 | |||
65 | private void AddressTextBoxClick(object sender, EventArgs e) |
||
66 | { |
||
67 | Address.BackColor = Color.Empty; |
||
68 | } |
||
69 | |||
70 | private void PortTextBoxClick(object sender, EventArgs e) |
||
71 | { |
||
72 | Port.BackColor = Color.Empty; |
||
73 | } |
||
74 | |||
75 | private async void HostButtonClickAsync(object sender, EventArgs e) |
||
76 | { |
||
77 | // Stop the MQTT server if it is running. |
||
78 | if (MQTTServer.ServerRunning) |
||
79 | { |
||
80 | await StopServer(); |
||
81 | toolStripStatusLabel.Text = Properties.Strings.Server_stopped; |
||
82 | HostButton.BackColor = Color.Empty; |
||
83 | |||
3 | office | 84 | // Enable controls. |
1 | office | 85 | ConnectButton.Enabled = true; |
3 | office | 86 | EnableConnectionControls(); |
1 | office | 87 | return; |
88 | } |
||
89 | |||
2 | office | 90 | if (!ValidateAddressPort(out var ipAddress, out var port, out var nick)) |
1 | office | 91 | return; |
92 | |||
93 | // Start the MQTT server. |
||
2 | office | 94 | await StartServer(ipAddress, port, nick); |
1 | office | 95 | toolStripStatusLabel.Text = Properties.Strings.Server_started; |
96 | HostButton.BackColor = Color.Aquamarine; |
||
97 | |||
3 | office | 98 | // Disable controls |
1 | office | 99 | ConnectButton.Enabled = false; |
3 | office | 100 | DisableConnectionControls(); |
1 | office | 101 | } |
102 | |||
3 | office | 103 | private void DisableConnectionControls() |
104 | { |
||
105 | Address.Enabled = false; |
||
106 | Port.Enabled = false; |
||
107 | Nick.Enabled = false; |
||
108 | } |
||
109 | |||
110 | private void EnableConnectionControls() |
||
111 | { |
||
112 | Address.Enabled = true; |
||
113 | Port.Enabled = true; |
||
114 | Nick.Enabled = true; |
||
115 | } |
||
116 | |||
2 | office | 117 | private bool ValidateAddressPort(out IPAddress address, out int port, out string nick) |
1 | office | 118 | { |
119 | address = IPAddress.Any; |
||
120 | port = 0; |
||
2 | office | 121 | nick = string.Empty; |
1 | office | 122 | |
123 | if (string.IsNullOrEmpty(Address.Text) && |
||
2 | office | 124 | string.IsNullOrEmpty(Port.Text) && |
125 | string.IsNullOrEmpty(Nick.Text)) |
||
1 | office | 126 | { |
127 | Address.BackColor = Color.LightPink; |
||
128 | Port.BackColor = Color.LightPink; |
||
2 | office | 129 | Nick.BackColor = Color.LightPink; |
1 | office | 130 | return false; |
131 | } |
||
132 | |||
133 | if (!IPAddress.TryParse(Address.Text, out address)) |
||
134 | { |
||
135 | Address.BackColor = Color.LightPink; |
||
136 | return false; |
||
137 | } |
||
138 | |||
139 | if (!uint.TryParse(Port.Text, out var uPort)) |
||
140 | { |
||
141 | Port.BackColor = Color.LightPink; |
||
142 | return false; |
||
143 | } |
||
144 | |||
145 | port = (int) uPort; |
||
146 | |||
2 | office | 147 | if (string.IsNullOrEmpty(Nick.Text)) |
148 | { |
||
149 | Nick.BackColor = Color.LightPink; |
||
150 | return false; |
||
151 | } |
||
152 | |||
153 | nick = Nick.Text; |
||
154 | |||
1 | office | 155 | Address.BackColor = Color.Empty; |
156 | Port.BackColor = Color.Empty; |
||
2 | office | 157 | Nick.BackColor = Color.Empty; |
1 | office | 158 | |
159 | return true; |
||
160 | } |
||
161 | |||
2 | office | 162 | private async Task StartServer(IPAddress ipAddress, int port, string nick) |
1 | office | 163 | { |
164 | await MQTTServerSemaphore.WaitAsync(); |
||
165 | try |
||
166 | { |
||
2 | office | 167 | await MQTTServer.Start(ipAddress, port, nick); |
1 | office | 168 | } |
169 | finally |
||
170 | { |
||
171 | MQTTServerSemaphore.Release(); |
||
172 | } |
||
173 | } |
||
174 | |||
175 | private async Task StopServer() |
||
176 | { |
||
177 | await MQTTServerSemaphore.WaitAsync(); |
||
178 | try |
||
179 | { |
||
180 | await MQTTServer.Stop(); |
||
181 | } |
||
182 | finally |
||
183 | { |
||
184 | MQTTServerSemaphore.Release(); |
||
185 | } |
||
186 | } |
||
187 | |||
188 | private async void ConnectButtonClickAsync(object sender, EventArgs e) |
||
189 | { |
||
190 | if (MQTTClient.ClientRunning) |
||
191 | { |
||
192 | await StopClient(); |
||
193 | ConnectButton.Text = Properties.Strings.Connect; |
||
194 | ConnectButton.BackColor = Color.Empty; |
||
195 | |||
3 | office | 196 | EnableConnectionControls(); |
1 | office | 197 | HostButton.Enabled = true; |
198 | return; |
||
199 | } |
||
200 | |||
2 | office | 201 | if (!ValidateAddressPort(out var ipAddress, out var port, out var nick)) |
1 | office | 202 | return; |
203 | |||
2 | office | 204 | await StartClient(ipAddress, port, nick); |
1 | office | 205 | |
206 | toolStripStatusLabel.Text = Properties.Strings.Client_started; |
||
207 | ConnectButton.Text = Properties.Strings.Disconnect; |
||
208 | ConnectButton.BackColor = Color.Aquamarine; |
||
209 | |||
210 | HostButton.Enabled = false; |
||
3 | office | 211 | DisableConnectionControls(); |
1 | office | 212 | } |
213 | |||
214 | private async Task StopClient() |
||
215 | { |
||
216 | await MQTTClientSemaphore.WaitAsync(); |
||
217 | try |
||
218 | { |
||
219 | await MQTTClient.Stop(); |
||
220 | } |
||
221 | finally |
||
222 | { |
||
223 | MQTTClientSemaphore.Release(); |
||
224 | } |
||
225 | } |
||
226 | |||
2 | office | 227 | private async Task StartClient(IPAddress ipAddress, int port, string nick) |
1 | office | 228 | { |
229 | await MQTTClientSemaphore.WaitAsync(); |
||
230 | try |
||
231 | { |
||
2 | office | 232 | await MQTTClient.Start(ipAddress, port, nick); |
1 | office | 233 | } |
234 | finally |
||
235 | { |
||
236 | MQTTClientSemaphore.Release(); |
||
237 | } |
||
238 | } |
||
2 | office | 239 | |
240 | private async void LobbySayTextBoxKeyDown(object sender, KeyEventArgs e) |
||
241 | { |
||
242 | if (e.KeyCode != Keys.Enter) |
||
243 | return; |
||
244 | |||
245 | if (MQTTServer.ServerRunning) |
||
246 | { |
||
247 | await MQTTServer.BroadcastLobbyMessage(LobbySayTextBox.Text); |
||
248 | } |
||
249 | |||
250 | if (MQTTClient.ClientRunning) |
||
251 | { |
||
252 | await MQTTClient.BroadcastLobbyMessage(LobbySayTextBox.Text); |
||
253 | } |
||
254 | |||
255 | } |
||
4 | office | 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 | } |
||
1 | office | 759 | } |
760 | } |