WingMan – Blame information for rev 10

Subversion Repositories:
Rev:
Rev Author Line No. Line
10 office 1 using System;
2 using System.IO;
3 using System.Threading;
4 using System.Threading.Tasks;
5 using System.Windows.Forms;
6 using MQTTnet;
7 using SimWinInput;
8 using WingMan.Communication;
9  
10 namespace WingMan.MouseKey
11 {
12 public class KeySimulator : IDisposable
13 {
14 public delegate void MouseKeyBindingExecuting(object sender, KeyBindingExecutingEventArgs args);
15  
16 public KeySimulator(LocalKeyBindings localLocalKeyBindings, MqttCommunication mqttCommunication,
17 TaskScheduler formTaskScheduler, CancellationToken cancellationToken)
18 {
19 LocalLocalKeyBindings = localLocalKeyBindings;
20 MqttCommunication = mqttCommunication;
21 TaskScheduler = formTaskScheduler;
22 CancellationToken = cancellationToken;
23  
24 MqttCommunication.OnMessageReceived += OnMqttMessageReceived;
25 }
26  
27 private MqttCommunication MqttCommunication { get; }
28 private TaskScheduler TaskScheduler { get; }
29 private CancellationToken CancellationToken { get; }
30 private LocalKeyBindings LocalLocalKeyBindings { get; }
31  
32 public void Dispose()
33 {
34 MqttCommunication.OnMessageReceived -= OnMqttMessageReceived;
35 }
36  
37 public event MouseKeyBindingExecuting OnMouseKeyBindingExecuting;
38  
39 private async void OnMqttMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs e)
40 {
41 if (e.ApplicationMessage.Topic != "execute")
42 return;
43  
44 using (var memoryStream = new MemoryStream(e.ApplicationMessage.Payload))
45 {
46 var executeMouseKeyBinding =
47 (ExecuteKeyBinding) ExecuteKeyBinding.XmlSerializer.Deserialize(memoryStream);
48  
49 // Do not process own mouse key bindings.
50 if (!string.Equals(executeMouseKeyBinding.Nick, MqttCommunication.Nick, StringComparison.Ordinal))
51 return;
52  
53 await Task.Delay(0, CancellationToken)
54 .ContinueWith(
55 _ => OnMouseKeyBindingExecuting?.Invoke(sender,
56 new KeyBindingExecutingEventArgs(executeMouseKeyBinding.Nick,
57 executeMouseKeyBinding.Name)),
58 CancellationToken,
59 TaskContinuationOptions.None, TaskScheduler);
60  
61 Simulate(executeMouseKeyBinding);
62 }
63 }
64  
65 private void Simulate(ExecuteKeyBinding executeBinding)
66 {
67 foreach (var localBinding in LocalLocalKeyBindings.Bindings)
68 {
69 if (!string.Equals(localBinding.Name, executeBinding.Name, StringComparison.Ordinal))
70 continue;
71  
72 // Press
73 foreach (var key in localBinding.Keys)
74 {
75 if (KeyConversion.StringToKeys.TryGetValue(key, out var pressKey))
76 {
77 SimKeyboard.KeyDown(pressKey);
78 continue;
79 }
80  
81 if (KeyConversion.StringToMouseButtons.TryGetValue(key, out var pressMouse))
82 switch (pressMouse)
83 {
84 case MouseButtons.Left:
85 SimMouse.Act(SimMouse.Action.LeftButtonDown, Cursor.Position.X, Cursor.Position.Y);
86 break;
87 case MouseButtons.Middle:
88 SimMouse.Act(SimMouse.Action.MiddleButtonDown, Cursor.Position.X, Cursor.Position.Y);
89 break;
90 case MouseButtons.Right:
91 SimMouse.Act(SimMouse.Action.RightButtonDown, Cursor.Position.X, Cursor.Position.Y);
92 break;
93 }
94 }
95  
96 // Depress
97 foreach (var key in localBinding.Keys)
98 {
99 if (KeyConversion.StringToKeys.TryGetValue(key, out var pressKey))
100 {
101 SimKeyboard.KeyUp(pressKey);
102 continue;
103 }
104  
105 if (KeyConversion.StringToMouseButtons.TryGetValue(key, out var pressMouse))
106 switch (pressMouse)
107 {
108 case MouseButtons.Left:
109 SimMouse.Act(SimMouse.Action.LeftButtonUp, Cursor.Position.X, Cursor.Position.Y);
110 break;
111 case MouseButtons.Middle:
112 SimMouse.Act(SimMouse.Action.MiddleButtonUp, Cursor.Position.X, Cursor.Position.Y);
113 break;
114 case MouseButtons.Right:
115 SimMouse.Act(SimMouse.Action.RightButtonUp, Cursor.Position.X, Cursor.Position.Y);
116 break;
117 }
118 }
119 }
120 }
121 }
122 }