Skip to content

Commit 7652f05

Browse files
committed
Removed LowLevelMouseHook - introduced MouseHookWrapper and Nuget dependency on EventHook project.
1 parent 2b55a15 commit 7652f05

File tree

6 files changed

+78
-68
lines changed

6 files changed

+78
-68
lines changed

RetailCoder.VBE/App.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public App(VBE vbe, IMessageBox messageBox,
8383

8484
private void _hooks_MessageReceived(object sender, HookEventArgs e)
8585
{
86-
if (sender is LowLevelMouseHook)
86+
if (sender is MouseHookWrapper)
8787
{
8888
// right-click detected
8989
_appMenus.EvaluateCanExecute(_parser.State);
@@ -261,6 +261,15 @@ private void _stateBar_Refresh(object sender, EventArgs e)
261261

262262
private void Parser_StateChanged(object sender, EventArgs e)
263263
{
264+
if (_parser.State.Status != ParserState.Ready)
265+
{
266+
_hooks.Detach();
267+
}
268+
else
269+
{
270+
_hooks.Attach();
271+
}
272+
264273
Debug.WriteLine("App handles StateChanged ({0}), evaluating menu states...", _parser.State.Status);
265274
_appMenus.EvaluateCanExecute(_parser.State);
266275
}

RetailCoder.VBE/Common/LowLevelMouseHook.cs

Lines changed: 0 additions & 64 deletions
This file was deleted.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System;
2+
using EventHook;
3+
using EventHook.Hooks;
4+
5+
namespace Rubberduck.Common
6+
{
7+
public class MouseHookWrapper : IAttachable
8+
{
9+
public MouseHookWrapper()
10+
{
11+
MouseWatcher.OnMouseInput += MouseWatcher_OnMouseInput;
12+
}
13+
14+
private void MouseWatcher_OnMouseInput(object sender, MouseEventArgs e)
15+
{
16+
// only handle right-clicks
17+
if (e.Message != MouseMessages.WM_RBUTTONDOWN)
18+
{
19+
return;
20+
}
21+
22+
var handler = MessageReceived;
23+
if (handler != null)
24+
{
25+
handler.Invoke(this, HookEventArgs.Empty);
26+
}
27+
}
28+
29+
public bool IsAttached { get; private set; }
30+
public event EventHandler<HookEventArgs> MessageReceived;
31+
32+
public void Attach()
33+
{
34+
MouseWatcher.Start();
35+
IsAttached = true;
36+
}
37+
38+
public void Detach()
39+
{
40+
MouseWatcher.Stop();
41+
IsAttached = false;
42+
}
43+
}
44+
}

RetailCoder.VBE/Common/RubberduckHooks.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Diagnostics;
34
using System.Linq;
45
using System.Runtime.InteropServices;
56
using Microsoft.Vbe.Interop;
@@ -42,7 +43,7 @@ public void HookHotkeys()
4243
Detach();
4344
_hooks.Clear();
4445

45-
//AddHook(new LowLevelMouseHook()); // todo: understand how this line throws a NRE in COM reflection
46+
AddHook(new MouseHookWrapper());
4647

4748
var config = _config.LoadConfiguration();
4849
var settings = config.UserSettings.GeneralSettings.HotkeySettings;
@@ -98,9 +99,11 @@ private void hook_MessageReceived(object sender, HookEventArgs e)
9899
return;
99100
}
100101

101-
if (sender is LowLevelMouseHook)
102+
if (sender is MouseHookWrapper)
102103
{
104+
Debug.WriteLine("MouseHookWrapper message received");
103105
OnMessageReceived(sender, HookEventArgs.Empty);
106+
return;
104107
}
105108

106109
var hotkey = sender as IHotkey;

RetailCoder.VBE/Rubberduck.csproj

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,10 @@
229229
<Reference Include="Castle.Core">
230230
<HintPath>..\packages\Castle.Core.3.2.0\lib\net45\Castle.Core.dll</HintPath>
231231
</Reference>
232+
<Reference Include="EventHook, Version=1.4.26.0, Culture=neutral, processorArchitecture=MSIL">
233+
<HintPath>..\packages\EventHook.1.4.26\lib\net45\EventHook.dll</HintPath>
234+
<Private>True</Private>
235+
</Reference>
232236
<Reference Include="extensibility, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
233237
<EmbedInteropTypes>True</EmbedInteropTypes>
234238
</Reference>
@@ -244,6 +248,18 @@
244248
<Reference Include="Ninject.Extensions.NamedScope">
245249
<HintPath>..\packages\Ninject.Extensions.NamedScope.3.2.0.0\lib\net45-full\Ninject.Extensions.NamedScope.dll</HintPath>
246250
</Reference>
251+
<Reference Include="Nito.AsyncEx, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
252+
<HintPath>..\packages\Nito.AsyncEx.3.0.1\lib\net45\Nito.AsyncEx.dll</HintPath>
253+
<Private>True</Private>
254+
</Reference>
255+
<Reference Include="Nito.AsyncEx.Concurrent, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
256+
<HintPath>..\packages\Nito.AsyncEx.3.0.1\lib\net45\Nito.AsyncEx.Concurrent.dll</HintPath>
257+
<Private>True</Private>
258+
</Reference>
259+
<Reference Include="Nito.AsyncEx.Enlightenment, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
260+
<HintPath>..\packages\Nito.AsyncEx.3.0.1\lib\net45\Nito.AsyncEx.Enlightenment.dll</HintPath>
261+
<Private>True</Private>
262+
</Reference>
247263
<Reference Include="PresentationCore" />
248264
<Reference Include="PresentationFramework" />
249265
<Reference Include="PresentationFramework.Aero" />
@@ -298,8 +314,8 @@
298314
<Compile Include="Common\Hotkeys\IHotkey.cs" />
299315
<Compile Include="Common\ILowLevelKeyboardHook.cs" />
300316
<Compile Include="Common\IRubberduckHooks.cs" />
301-
<Compile Include="Common\LowLevelMouseHook.cs" />
302317
<Compile Include="Common\ModuleExporter.cs" />
318+
<Compile Include="Common\MouseHookWrapper.cs" />
303319
<Compile Include="Common\RubberduckHooks.cs" />
304320
<Compile Include="Common\TimerHook.cs" />
305321
<Compile Include="Common\WinAPI\KBDLLHOOKSTRUCT.cs" />

RetailCoder.VBE/packages.config

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
<package id="Antlr4" version="4.3.0" targetFramework="net45" />
44
<package id="Antlr4.Runtime" version="4.3.0" targetFramework="net45" />
55
<package id="Castle.Core" version="3.2.0" targetFramework="net45" />
6+
<package id="EventHook" version="1.4.26" targetFramework="net45" />
67
<package id="Ninject" version="3.2.2.0" targetFramework="net45" />
78
<package id="Ninject.Extensions.Conventions" version="3.2.0.0" targetFramework="net45" />
89
<package id="Ninject.Extensions.Factory" version="3.2.1.0" targetFramework="net45" />
910
<package id="Ninject.Extensions.NamedScope" version="3.2.0.0" targetFramework="net45" />
11+
<package id="Nito.AsyncEx" version="3.0.1" targetFramework="net45" />
1012
<package id="NLog" version="4.0.1" targetFramework="net45" />
1113
<package id="NLog.Schema" version="4.0.1" targetFramework="net45" />
1214
</packages>

0 commit comments

Comments
 (0)