mirror of
https://github.com/LorenzCK/OnTopReplica.git
synced 2024-06-03 11:04:32 +12:00
Working shell hook (via window) to receive active window handle.
This commit is contained in:
parent
12b80982fd
commit
86cf05ae3d
62
OnTopReplica/DualModeManager.cs
Normal file
62
OnTopReplica/DualModeManager.cs
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.IO;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace OnTopReplica {
|
||||||
|
|
||||||
|
class DualModeManager : IDisposable {
|
||||||
|
|
||||||
|
public DualModeManager(MainForm form) {
|
||||||
|
_form = form;
|
||||||
|
}
|
||||||
|
|
||||||
|
MainForm _form;
|
||||||
|
bool _active = false;
|
||||||
|
|
||||||
|
static uint _hookMsgId = NativeHooks.RegisterWindowMessage("SHELLHOOK");
|
||||||
|
|
||||||
|
public void EnableDualMode(IEnumerable<WindowHandle> handles) {
|
||||||
|
if (!NativeHooks.RegisterShellHookWindow(_form.Handle)) {
|
||||||
|
Console.WriteLine("Failed to register shell hook window.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ProcessHookMessages(Message msg) {
|
||||||
|
if (msg.Msg == _hookMsgId) {
|
||||||
|
int hookCode = msg.WParam.ToInt32();
|
||||||
|
if (hookCode == NativeHooks.HSHELL_WINDOWACTIVATED ||
|
||||||
|
hookCode == NativeHooks.HSHELL_RUDEAPPACTIVATED) {
|
||||||
|
IntPtr activeHandle = msg.LParam;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Disable() {
|
||||||
|
if (!_active)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!NativeHooks.DeregisterShellHookWindow(_form.Handle))
|
||||||
|
Console.WriteLine("Failed to deregister shell hook window.");
|
||||||
|
|
||||||
|
_active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region IDisposable Members
|
||||||
|
|
||||||
|
public void Dispose() {
|
||||||
|
Disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
42
OnTopReplica/MainForm.Designer.cs
generated
42
OnTopReplica/MainForm.Designer.cs
generated
|
@ -34,6 +34,7 @@
|
||||||
this.switchToWindowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.switchToWindowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.selectRegionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.selectRegionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.forwardClicksToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.forwardClicksToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.dualWindowModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.menuContextOpacity = new System.Windows.Forms.ToolStripMenuItem();
|
this.menuContextOpacity = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.menuOpacity = new System.Windows.Forms.ContextMenuStrip(this.components);
|
this.menuOpacity = new System.Windows.Forms.ContextMenuStrip(this.components);
|
||||||
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
|
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
@ -79,6 +80,7 @@
|
||||||
this.switchToWindowToolStripMenuItem,
|
this.switchToWindowToolStripMenuItem,
|
||||||
this.selectRegionToolStripMenuItem,
|
this.selectRegionToolStripMenuItem,
|
||||||
this.forwardClicksToolStripMenuItem,
|
this.forwardClicksToolStripMenuItem,
|
||||||
|
this.dualWindowModeToolStripMenuItem,
|
||||||
this.menuContextOpacity,
|
this.menuContextOpacity,
|
||||||
this.resizeToolStripMenuItem,
|
this.resizeToolStripMenuItem,
|
||||||
this.dockToolStripMenuItem,
|
this.dockToolStripMenuItem,
|
||||||
|
@ -89,7 +91,7 @@
|
||||||
this.aboutToolStripMenuItem,
|
this.aboutToolStripMenuItem,
|
||||||
this.menuContextClose});
|
this.menuContextClose});
|
||||||
this.menuContext.Name = "menuContext";
|
this.menuContext.Name = "menuContext";
|
||||||
this.menuContext.Size = new System.Drawing.Size(169, 296);
|
this.menuContext.Size = new System.Drawing.Size(178, 318);
|
||||||
this.menuContext.Opening += new System.ComponentModel.CancelEventHandler(this.Menu_opening);
|
this.menuContext.Opening += new System.ComponentModel.CancelEventHandler(this.Menu_opening);
|
||||||
//
|
//
|
||||||
// menuContextWindows
|
// menuContextWindows
|
||||||
|
@ -97,7 +99,7 @@
|
||||||
this.menuContextWindows.DropDown = this.menuWindows;
|
this.menuContextWindows.DropDown = this.menuWindows;
|
||||||
this.menuContextWindows.Image = global::OnTopReplica.Properties.Resources.window_multiple16;
|
this.menuContextWindows.Image = global::OnTopReplica.Properties.Resources.window_multiple16;
|
||||||
this.menuContextWindows.Name = "menuContextWindows";
|
this.menuContextWindows.Name = "menuContextWindows";
|
||||||
this.menuContextWindows.Size = new System.Drawing.Size(168, 22);
|
this.menuContextWindows.Size = new System.Drawing.Size(177, 22);
|
||||||
this.menuContextWindows.Text = global::OnTopReplica.Strings.MenuWindows;
|
this.menuContextWindows.Text = global::OnTopReplica.Strings.MenuWindows;
|
||||||
this.menuContextWindows.ToolTipText = global::OnTopReplica.Strings.MenuWindowsTT;
|
this.menuContextWindows.ToolTipText = global::OnTopReplica.Strings.MenuWindowsTT;
|
||||||
this.menuContextWindows.DropDownOpening += new System.EventHandler(this.Menu_Windows_opening);
|
this.menuContextWindows.DropDownOpening += new System.EventHandler(this.Menu_Windows_opening);
|
||||||
|
@ -120,7 +122,7 @@
|
||||||
//
|
//
|
||||||
this.switchToWindowToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.window_switch;
|
this.switchToWindowToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.window_switch;
|
||||||
this.switchToWindowToolStripMenuItem.Name = "switchToWindowToolStripMenuItem";
|
this.switchToWindowToolStripMenuItem.Name = "switchToWindowToolStripMenuItem";
|
||||||
this.switchToWindowToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
|
this.switchToWindowToolStripMenuItem.Size = new System.Drawing.Size(177, 22);
|
||||||
this.switchToWindowToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuSwitch;
|
this.switchToWindowToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuSwitch;
|
||||||
this.switchToWindowToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuSwitchTT;
|
this.switchToWindowToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuSwitchTT;
|
||||||
this.switchToWindowToolStripMenuItem.Click += new System.EventHandler(this.Menu_Switch_click);
|
this.switchToWindowToolStripMenuItem.Click += new System.EventHandler(this.Menu_Switch_click);
|
||||||
|
@ -130,7 +132,7 @@
|
||||||
this.selectRegionToolStripMenuItem.Enabled = false;
|
this.selectRegionToolStripMenuItem.Enabled = false;
|
||||||
this.selectRegionToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.regions;
|
this.selectRegionToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.regions;
|
||||||
this.selectRegionToolStripMenuItem.Name = "selectRegionToolStripMenuItem";
|
this.selectRegionToolStripMenuItem.Name = "selectRegionToolStripMenuItem";
|
||||||
this.selectRegionToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
|
this.selectRegionToolStripMenuItem.Size = new System.Drawing.Size(177, 22);
|
||||||
this.selectRegionToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuRegion;
|
this.selectRegionToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuRegion;
|
||||||
this.selectRegionToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuRegionTT;
|
this.selectRegionToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuRegionTT;
|
||||||
this.selectRegionToolStripMenuItem.Click += new System.EventHandler(this.Menu_Region_click);
|
this.selectRegionToolStripMenuItem.Click += new System.EventHandler(this.Menu_Region_click);
|
||||||
|
@ -138,17 +140,25 @@
|
||||||
// forwardClicksToolStripMenuItem
|
// forwardClicksToolStripMenuItem
|
||||||
//
|
//
|
||||||
this.forwardClicksToolStripMenuItem.Name = "forwardClicksToolStripMenuItem";
|
this.forwardClicksToolStripMenuItem.Name = "forwardClicksToolStripMenuItem";
|
||||||
this.forwardClicksToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
|
this.forwardClicksToolStripMenuItem.Size = new System.Drawing.Size(177, 22);
|
||||||
this.forwardClicksToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuClickForwarding;
|
this.forwardClicksToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuClickForwarding;
|
||||||
this.forwardClicksToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuClickForwardingTT;
|
this.forwardClicksToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuClickForwardingTT;
|
||||||
this.forwardClicksToolStripMenuItem.Click += new System.EventHandler(this.Menu_Forward_click);
|
this.forwardClicksToolStripMenuItem.Click += new System.EventHandler(this.Menu_Forward_click);
|
||||||
//
|
//
|
||||||
|
// dualWindowModeToolStripMenuItem
|
||||||
|
//
|
||||||
|
this.dualWindowModeToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.window_multiple16;
|
||||||
|
this.dualWindowModeToolStripMenuItem.Name = "dualWindowModeToolStripMenuItem";
|
||||||
|
this.dualWindowModeToolStripMenuItem.Size = new System.Drawing.Size(177, 22);
|
||||||
|
this.dualWindowModeToolStripMenuItem.Text = "Dual window mode";
|
||||||
|
this.dualWindowModeToolStripMenuItem.Click += new System.EventHandler(this.Menu_Dual_click);
|
||||||
|
//
|
||||||
// menuContextOpacity
|
// menuContextOpacity
|
||||||
//
|
//
|
||||||
this.menuContextOpacity.DropDown = this.menuOpacity;
|
this.menuContextOpacity.DropDown = this.menuOpacity;
|
||||||
this.menuContextOpacity.Image = global::OnTopReplica.Properties.Resources.window_opacity16;
|
this.menuContextOpacity.Image = global::OnTopReplica.Properties.Resources.window_opacity16;
|
||||||
this.menuContextOpacity.Name = "menuContextOpacity";
|
this.menuContextOpacity.Name = "menuContextOpacity";
|
||||||
this.menuContextOpacity.Size = new System.Drawing.Size(168, 22);
|
this.menuContextOpacity.Size = new System.Drawing.Size(177, 22);
|
||||||
this.menuContextOpacity.Text = global::OnTopReplica.Strings.MenuOpacity;
|
this.menuContextOpacity.Text = global::OnTopReplica.Strings.MenuOpacity;
|
||||||
//
|
//
|
||||||
// menuOpacity
|
// menuOpacity
|
||||||
|
@ -159,10 +169,9 @@
|
||||||
this.toolStripMenuItem3,
|
this.toolStripMenuItem3,
|
||||||
this.toolStripMenuItem4});
|
this.toolStripMenuItem4});
|
||||||
this.menuOpacity.Name = "menuOpacity";
|
this.menuOpacity.Name = "menuOpacity";
|
||||||
this.menuOpacity.OwnerItem = this.menuContextOpacity;
|
|
||||||
this.menuOpacity.ShowCheckMargin = true;
|
this.menuOpacity.ShowCheckMargin = true;
|
||||||
this.menuOpacity.ShowImageMargin = false;
|
this.menuOpacity.ShowImageMargin = false;
|
||||||
this.menuOpacity.Size = new System.Drawing.Size(154, 114);
|
this.menuOpacity.Size = new System.Drawing.Size(154, 92);
|
||||||
this.menuOpacity.Opening += new System.ComponentModel.CancelEventHandler(this.Menu_Opacity_opening);
|
this.menuOpacity.Opening += new System.ComponentModel.CancelEventHandler(this.Menu_Opacity_opening);
|
||||||
//
|
//
|
||||||
// toolStripMenuItem1
|
// toolStripMenuItem1
|
||||||
|
@ -208,7 +217,7 @@
|
||||||
this.resizeToolStripMenuItem.DropDown = this.menuResize;
|
this.resizeToolStripMenuItem.DropDown = this.menuResize;
|
||||||
this.resizeToolStripMenuItem.Enabled = false;
|
this.resizeToolStripMenuItem.Enabled = false;
|
||||||
this.resizeToolStripMenuItem.Name = "resizeToolStripMenuItem";
|
this.resizeToolStripMenuItem.Name = "resizeToolStripMenuItem";
|
||||||
this.resizeToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
|
this.resizeToolStripMenuItem.Size = new System.Drawing.Size(177, 22);
|
||||||
this.resizeToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuResize;
|
this.resizeToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuResize;
|
||||||
//
|
//
|
||||||
// menuResize
|
// menuResize
|
||||||
|
@ -274,7 +283,7 @@
|
||||||
this.bottomRightToolStripMenuItem});
|
this.bottomRightToolStripMenuItem});
|
||||||
this.dockToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_null;
|
this.dockToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_null;
|
||||||
this.dockToolStripMenuItem.Name = "dockToolStripMenuItem";
|
this.dockToolStripMenuItem.Name = "dockToolStripMenuItem";
|
||||||
this.dockToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
|
this.dockToolStripMenuItem.Size = new System.Drawing.Size(177, 22);
|
||||||
this.dockToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosition;
|
this.dockToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosition;
|
||||||
this.dockToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuPositionTT;
|
this.dockToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuPositionTT;
|
||||||
//
|
//
|
||||||
|
@ -313,7 +322,7 @@
|
||||||
// chromeToolStripMenuItem
|
// chromeToolStripMenuItem
|
||||||
//
|
//
|
||||||
this.chromeToolStripMenuItem.Name = "chromeToolStripMenuItem";
|
this.chromeToolStripMenuItem.Name = "chromeToolStripMenuItem";
|
||||||
this.chromeToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
|
this.chromeToolStripMenuItem.Size = new System.Drawing.Size(177, 22);
|
||||||
this.chromeToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuChrome;
|
this.chromeToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuChrome;
|
||||||
this.chromeToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuChromeTT;
|
this.chromeToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuChromeTT;
|
||||||
this.chromeToolStripMenuItem.Click += new System.EventHandler(this.Menu_Chrome_click);
|
this.chromeToolStripMenuItem.Click += new System.EventHandler(this.Menu_Chrome_click);
|
||||||
|
@ -322,7 +331,7 @@
|
||||||
//
|
//
|
||||||
this.reduceToIconToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.reduce;
|
this.reduceToIconToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.reduce;
|
||||||
this.reduceToIconToolStripMenuItem.Name = "reduceToIconToolStripMenuItem";
|
this.reduceToIconToolStripMenuItem.Name = "reduceToIconToolStripMenuItem";
|
||||||
this.reduceToIconToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
|
this.reduceToIconToolStripMenuItem.Size = new System.Drawing.Size(177, 22);
|
||||||
this.reduceToIconToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuReduce;
|
this.reduceToIconToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuReduce;
|
||||||
this.reduceToIconToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuReduceTT;
|
this.reduceToIconToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuReduceTT;
|
||||||
this.reduceToIconToolStripMenuItem.Click += new System.EventHandler(this.Menu_Reduce_click);
|
this.reduceToIconToolStripMenuItem.Click += new System.EventHandler(this.Menu_Reduce_click);
|
||||||
|
@ -330,13 +339,13 @@
|
||||||
// toolStripSeparator1
|
// toolStripSeparator1
|
||||||
//
|
//
|
||||||
this.toolStripSeparator1.Name = "toolStripSeparator1";
|
this.toolStripSeparator1.Name = "toolStripSeparator1";
|
||||||
this.toolStripSeparator1.Size = new System.Drawing.Size(165, 6);
|
this.toolStripSeparator1.Size = new System.Drawing.Size(174, 6);
|
||||||
//
|
//
|
||||||
// languageToolStripMenuItem
|
// languageToolStripMenuItem
|
||||||
//
|
//
|
||||||
this.languageToolStripMenuItem.DropDown = this.menuLanguages;
|
this.languageToolStripMenuItem.DropDown = this.menuLanguages;
|
||||||
this.languageToolStripMenuItem.Name = "languageToolStripMenuItem";
|
this.languageToolStripMenuItem.Name = "languageToolStripMenuItem";
|
||||||
this.languageToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
|
this.languageToolStripMenuItem.Size = new System.Drawing.Size(177, 22);
|
||||||
this.languageToolStripMenuItem.Text = global::OnTopReplica.Strings.Language;
|
this.languageToolStripMenuItem.Text = global::OnTopReplica.Strings.Language;
|
||||||
//
|
//
|
||||||
// menuLanguages
|
// menuLanguages
|
||||||
|
@ -390,7 +399,7 @@
|
||||||
// aboutToolStripMenuItem
|
// aboutToolStripMenuItem
|
||||||
//
|
//
|
||||||
this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
|
this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
|
||||||
this.aboutToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
|
this.aboutToolStripMenuItem.Size = new System.Drawing.Size(177, 22);
|
||||||
this.aboutToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuAbout;
|
this.aboutToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuAbout;
|
||||||
this.aboutToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuAboutTT;
|
this.aboutToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuAboutTT;
|
||||||
this.aboutToolStripMenuItem.Click += new System.EventHandler(this.Menu_About_click);
|
this.aboutToolStripMenuItem.Click += new System.EventHandler(this.Menu_About_click);
|
||||||
|
@ -399,7 +408,7 @@
|
||||||
//
|
//
|
||||||
this.menuContextClose.Image = global::OnTopReplica.Properties.Resources.close_new;
|
this.menuContextClose.Image = global::OnTopReplica.Properties.Resources.close_new;
|
||||||
this.menuContextClose.Name = "menuContextClose";
|
this.menuContextClose.Name = "menuContextClose";
|
||||||
this.menuContextClose.Size = new System.Drawing.Size(168, 22);
|
this.menuContextClose.Size = new System.Drawing.Size(177, 22);
|
||||||
this.menuContextClose.Text = global::OnTopReplica.Strings.MenuClose;
|
this.menuContextClose.Text = global::OnTopReplica.Strings.MenuClose;
|
||||||
this.menuContextClose.Click += new System.EventHandler(this.Menu_Close_click);
|
this.menuContextClose.Click += new System.EventHandler(this.Menu_Close_click);
|
||||||
//
|
//
|
||||||
|
@ -473,6 +482,7 @@
|
||||||
private System.Windows.Forms.ToolStripMenuItem danskToolStripMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem danskToolStripMenuItem;
|
||||||
private System.Windows.Forms.ToolStripMenuItem chromeToolStripMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem chromeToolStripMenuItem;
|
||||||
private System.Windows.Forms.ToolStripMenuItem danskToolStripMenuItem1;
|
private System.Windows.Forms.ToolStripMenuItem danskToolStripMenuItem1;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem dualWindowModeToolStripMenuItem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,8 @@ namespace OnTopReplica {
|
||||||
WindowManager _windowManager = new WindowManager();
|
WindowManager _windowManager = new WindowManager();
|
||||||
WindowHandle _lastWindowHandle = null;
|
WindowHandle _lastWindowHandle = null;
|
||||||
|
|
||||||
|
DualModeManager _dualModeManager;
|
||||||
|
|
||||||
public MainForm() {
|
public MainForm() {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
KeepAspectRatio = false;
|
KeepAspectRatio = false;
|
||||||
|
@ -59,6 +61,8 @@ namespace OnTopReplica {
|
||||||
_hotKeyManager = new HotKeyManager(this);
|
_hotKeyManager = new HotKeyManager(this);
|
||||||
_hotKeyManager.RegisterHotKey(HotKeyManager.HotKeyModifiers.Control | HotKeyManager.HotKeyModifiers.Shift,
|
_hotKeyManager.RegisterHotKey(HotKeyManager.HotKeyModifiers.Control | HotKeyManager.HotKeyModifiers.Shift,
|
||||||
Keys.O, new HotKeyManager.HotKeyHandler(HotKeyOpenHandler));
|
Keys.O, new HotKeyManager.HotKeyHandler(HotKeyOpenHandler));
|
||||||
|
|
||||||
|
_dualModeManager = new DualModeManager(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Child forms & controls events
|
#region Child forms & controls events
|
||||||
|
@ -170,6 +174,10 @@ namespace OnTopReplica {
|
||||||
_hotKeyManager.Dispose();
|
_hotKeyManager.Dispose();
|
||||||
_hotKeyManager = null;
|
_hotKeyManager = null;
|
||||||
|
|
||||||
|
//Destroy dual mode manager
|
||||||
|
_dualModeManager.Dispose();
|
||||||
|
_dualModeManager = null;
|
||||||
|
|
||||||
base.OnClosing(e);
|
base.OnClosing(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,6 +209,8 @@ namespace OnTopReplica {
|
||||||
protected override void WndProc(ref Message m) {
|
protected override void WndProc(ref Message m) {
|
||||||
if (_hotKeyManager != null)
|
if (_hotKeyManager != null)
|
||||||
_hotKeyManager.ProcessHotKeys(m);
|
_hotKeyManager.ProcessHotKeys(m);
|
||||||
|
if (_dualModeManager != null)
|
||||||
|
_dualModeManager.ProcessHookMessages(m);
|
||||||
|
|
||||||
switch(m.Msg){
|
switch(m.Msg){
|
||||||
case NativeMethods.WM_NCRBUTTONUP:
|
case NativeMethods.WM_NCRBUTTONUP:
|
||||||
|
@ -292,13 +302,13 @@ namespace OnTopReplica {
|
||||||
|
|
||||||
//Handle special "none" window
|
//Handle special "none" window
|
||||||
if (tsi.Tag == null) {
|
if (tsi.Tag == null) {
|
||||||
ThumbnailUnset();
|
UnsetThumbnail();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var selectionData = (WindowListHelper.WindowSelectionData)tsi.Tag;
|
var selectionData = (WindowListHelper.WindowSelectionData)tsi.Tag;
|
||||||
if (_windowManager != null) {
|
if (_windowManager != null) {
|
||||||
ThumbnailSet(selectionData.Handle, selectionData.Region);
|
SetThumbnail(selectionData.Handle, selectionData.Region);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -310,6 +320,10 @@ namespace OnTopReplica {
|
||||||
NativeMethods.SetForegroundWindow(_lastWindowHandle.Handle);
|
NativeMethods.SetForegroundWindow(_lastWindowHandle.Handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Menu_Dual_click(object sender, EventArgs e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private void Menu_Forward_click(object sender, EventArgs e) {
|
private void Menu_Forward_click(object sender, EventArgs e) {
|
||||||
if (Settings.Default.FirstTimeClickForwarding && !_thumbnailPanel.ReportThumbnailClicks) {
|
if (Settings.Default.FirstTimeClickForwarding && !_thumbnailPanel.ReportThumbnailClicks) {
|
||||||
TaskDialog dlg = new TaskDialog(Strings.InfoClickForwarding, Strings.InfoClickForwardingTitle, Strings.InfoClickForwardingContent) {
|
TaskDialog dlg = new TaskDialog(Strings.InfoClickForwarding, Strings.InfoClickForwardingTitle, Strings.InfoClickForwardingContent) {
|
||||||
|
@ -543,7 +557,12 @@ namespace OnTopReplica {
|
||||||
|
|
||||||
#region Thumbnail operation
|
#region Thumbnail operation
|
||||||
|
|
||||||
private void ThumbnailSet(WindowHandle handle, StoredRegion region) {
|
/// <summary>
|
||||||
|
/// Sets a new thumbnail.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="handle">Handle to the window to clone.</param>
|
||||||
|
/// <param name="region">Region of the window to clone.</param>
|
||||||
|
public void SetThumbnail(WindowHandle handle, StoredRegion region) {
|
||||||
try {
|
try {
|
||||||
_lastWindowHandle = handle;
|
_lastWindowHandle = handle;
|
||||||
|
|
||||||
|
@ -563,7 +582,10 @@ namespace OnTopReplica {
|
||||||
SetAspectRatio(_thumbnailPanel.ThumbnailOriginalSize);
|
SetAspectRatio(_thumbnailPanel.ThumbnailOriginalSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ThumbnailUnset(){
|
/// <summary>
|
||||||
|
/// Disables the cloned thumbnail.
|
||||||
|
/// </summary>
|
||||||
|
public void UnsetThumbnail(){
|
||||||
//Unset handle
|
//Unset handle
|
||||||
_lastWindowHandle = null;
|
_lastWindowHandle = null;
|
||||||
_thumbnailPanel.UnsetThumbnail();
|
_thumbnailPanel.UnsetThumbnail();
|
||||||
|
@ -580,7 +602,7 @@ namespace OnTopReplica {
|
||||||
ShowErrorDialog(title, Strings.ErrorGenericThumbnailHandleError, ex.Message);
|
ShowErrorDialog(title, Strings.ErrorGenericThumbnailHandleError, ex.Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
ThumbnailUnset();
|
UnsetThumbnail();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Automatically sizes the window in order to accomodate the thumbnail p times.</summary>
|
/// <summary>Automatically sizes the window in order to accomodate the thumbnail p times.</summary>
|
||||||
|
@ -695,7 +717,7 @@ namespace OnTopReplica {
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void ResetMainForm() {
|
public void ResetMainForm() {
|
||||||
//Reset form settings
|
//Reset form settings
|
||||||
ThumbnailUnset();
|
UnsetThumbnail();
|
||||||
RegionBoxShowing = false;
|
RegionBoxShowing = false;
|
||||||
|
|
||||||
//Reset location and size (edge of the screen, min size)
|
//Reset location and size (edge of the screen, min size)
|
||||||
|
|
37
OnTopReplica/NativeHooks.cs
Normal file
37
OnTopReplica/NativeHooks.cs
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace OnTopReplica {
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Helpers for interop with native Windows hooks.
|
||||||
|
/// </summary>
|
||||||
|
static class NativeHooks {
|
||||||
|
|
||||||
|
public const int HSHELL_WINDOWACTIVATED = 4;
|
||||||
|
public const int HSHELL_RUDEAPPACTIVATED = HSHELL_WINDOWACTIVATED | HSHELL_HIGHBIT;
|
||||||
|
const int HSHELL_HIGHBIT = 0x8000;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Registers the WM_ID for a window message.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="wndMessageName">Name of the window message.</param>
|
||||||
|
[DllImport("User32.dll")]
|
||||||
|
public static extern uint RegisterWindowMessage(string wndMessageName);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Registers a window as a shell hook window.
|
||||||
|
/// </summary>
|
||||||
|
[DllImport("User32.dll")]
|
||||||
|
public static extern bool RegisterShellHookWindow(IntPtr hwnd);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Deregisters a window as a shell hook window.
|
||||||
|
/// </summary>
|
||||||
|
[DllImport("User32.dll")]
|
||||||
|
public static extern bool DeregisterShellHookWindow(IntPtr hwnd);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -297,5 +297,16 @@ namespace OnTopReplica
|
||||||
[DllImport("user32.dll")]
|
[DllImport("user32.dll")]
|
||||||
public static extern short GetKeyState(VirtualKeyState nVirtKey);
|
public static extern short GetKeyState(VirtualKeyState nVirtKey);
|
||||||
|
|
||||||
|
[DllImport("kernel32.dll")]
|
||||||
|
static extern uint FormatMessage(uint dwFlags, IntPtr lpSource,
|
||||||
|
int dwMessageId, uint dwLanguageId, [Out] StringBuilder lpBuffer,
|
||||||
|
uint nSize, IntPtr Arguments);
|
||||||
|
|
||||||
|
public static string GetLastErrorMessage(int msgCode) {
|
||||||
|
var sb = new StringBuilder(300);
|
||||||
|
FormatMessage((uint)(0x00001000), IntPtr.Zero, msgCode, 0, sb, 299, IntPtr.Zero);
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,6 +86,28 @@
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<ApplicationManifest>OnTopReplica.exe.manifest</ApplicationManifest>
|
<ApplicationManifest>OnTopReplica.exe.manifest</ApplicationManifest>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<OutputPath>bin\x64\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
|
||||||
|
<CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<OutputPath>bin\x64\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
|
||||||
|
<CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Deployment" />
|
<Reference Include="System.Deployment" />
|
||||||
|
@ -109,6 +131,8 @@
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="CloneClickEventArgs.cs" />
|
<Compile Include="CloneClickEventArgs.cs" />
|
||||||
<Compile Include="CloseRequestEventArgs.cs" />
|
<Compile Include="CloseRequestEventArgs.cs" />
|
||||||
|
<Compile Include="DualModeManager.cs" />
|
||||||
|
<Compile Include="NativeHooks.cs" />
|
||||||
<Compile Include="WindowsSevenMethods.cs" />
|
<Compile Include="WindowsSevenMethods.cs" />
|
||||||
<None Include="CommonControls.cs" />
|
<None Include="CommonControls.cs" />
|
||||||
<Compile Include="EnumerationExtensions.cs" />
|
<Compile Include="EnumerationExtensions.cs" />
|
||||||
|
|
Loading…
Reference in a new issue