diff --git a/.hgignore b/.hgignore index 104a7be..a80c023 100644 --- a/.hgignore +++ b/.hgignore @@ -2,6 +2,6 @@ glob:OnTopReplica.suo glob:bin/* glob:obj/* glob:publish/* -glob:OnTopReplica/Assets/Thumbs.db +glob:*Thumbs.db glob:*.psd glob:Installer/OnTopReplica-Setup.exe diff --git a/OnTopReplica/MainForm.cs b/OnTopReplica/MainForm.cs index 4f9a079..f0dd4c3 100644 --- a/OnTopReplica/MainForm.cs +++ b/OnTopReplica/MainForm.cs @@ -68,8 +68,7 @@ namespace OnTopReplica { hotKeyMgr.RegisterHotKey(Native.HotKeyModifiers.Control | Native.HotKeyModifiers.Shift, Keys.C, new Native.HotKeyMethods.HotKeyHandler(HotKeyCloneHandler)); - //Hook keyboard handler - this.KeyUp += new KeyEventHandler(Form_KeyUp); + //Set to Key event preview this.KeyPreview = true; } @@ -211,7 +210,7 @@ namespace OnTopReplica { case WM.NCHITTEST: //Make transparent to hit-testing if in click through mode - if (ClickThroughEnabled) { + if (ClickThroughEnabled && (ModifierKeys & Keys.Alt) != Keys.Alt) { m.Result = (IntPtr)HT.TRANSPARENT; return; } @@ -227,7 +226,9 @@ namespace OnTopReplica { #region Keyboard event handling - void Form_KeyUp(object sender, KeyEventArgs e) { + protected override void OnKeyUp(KeyEventArgs e) { + base.OnKeyUp(e); + //ALT if (e.Modifiers == Keys.Alt) { if (e.KeyCode == Keys.Enter) { diff --git a/OnTopReplica/Native/InputMethods.cs b/OnTopReplica/Native/InputMethods.cs new file mode 100644 index 0000000..fe8233e --- /dev/null +++ b/OnTopReplica/Native/InputMethods.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; + +namespace OnTopReplica.Native { + static class InputMethods { + + [DllImport("user32.dll")] + static extern short GetKeyState(VirtualKeyState nVirtKey); + + const int KeyToggled = 0x1; + + const int KeyPressed = 0x8000; + + public static bool IsKeyPressed(VirtualKeyState virtKey) { + return (GetKeyState(virtKey) & KeyPressed) != 0; + } + + public static bool IsKeyToggled(VirtualKeyState virtKey) { + return (GetKeyState(virtKey) & KeyToggled) != 0; + } + + } +} diff --git a/OnTopReplica/Native/VirtualKeyState.cs b/OnTopReplica/Native/VirtualKeyState.cs new file mode 100644 index 0000000..91e94a0 --- /dev/null +++ b/OnTopReplica/Native/VirtualKeyState.cs @@ -0,0 +1,193 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OnTopReplica.Native { + enum VirtualKeyState : int { + VK_LBUTTON = 0x01, + VK_RBUTTON = 0x02, + VK_CANCEL = 0x03, + VK_MBUTTON = 0x04, + // + VK_XBUTTON1 = 0x05, + VK_XBUTTON2 = 0x06, + // + VK_BACK = 0x08, + VK_TAB = 0x09, + // + VK_CLEAR = 0x0C, + VK_RETURN = 0x0D, + // + VK_SHIFT = 0x10, + VK_CONTROL = 0x11, + VK_MENU = 0x12, + VK_PAUSE = 0x13, + VK_CAPITAL = 0x14, + // + VK_KANA = 0x15, + VK_HANGEUL = 0x15, /* old name - should be here for compatibility */ + VK_HANGUL = 0x15, + VK_JUNJA = 0x17, + VK_FINAL = 0x18, + VK_HANJA = 0x19, + VK_KANJI = 0x19, + // + VK_ESCAPE = 0x1B, + // + VK_CONVERT = 0x1C, + VK_NONCONVERT = 0x1D, + VK_ACCEPT = 0x1E, + VK_MODECHANGE = 0x1F, + // + VK_SPACE = 0x20, + VK_PRIOR = 0x21, + VK_NEXT = 0x22, + VK_END = 0x23, + VK_HOME = 0x24, + VK_LEFT = 0x25, + VK_UP = 0x26, + VK_RIGHT = 0x27, + VK_DOWN = 0x28, + VK_SELECT = 0x29, + VK_PRINT = 0x2A, + VK_EXECUTE = 0x2B, + VK_SNAPSHOT = 0x2C, + VK_INSERT = 0x2D, + VK_DELETE = 0x2E, + VK_HELP = 0x2F, + // + VK_LWIN = 0x5B, + VK_RWIN = 0x5C, + VK_APPS = 0x5D, + // + VK_SLEEP = 0x5F, + // + VK_NUMPAD0 = 0x60, + VK_NUMPAD1 = 0x61, + VK_NUMPAD2 = 0x62, + VK_NUMPAD3 = 0x63, + VK_NUMPAD4 = 0x64, + VK_NUMPAD5 = 0x65, + VK_NUMPAD6 = 0x66, + VK_NUMPAD7 = 0x67, + VK_NUMPAD8 = 0x68, + VK_NUMPAD9 = 0x69, + VK_MULTIPLY = 0x6A, + VK_ADD = 0x6B, + VK_SEPARATOR = 0x6C, + VK_SUBTRACT = 0x6D, + VK_DECIMAL = 0x6E, + VK_DIVIDE = 0x6F, + VK_F1 = 0x70, + VK_F2 = 0x71, + VK_F3 = 0x72, + VK_F4 = 0x73, + VK_F5 = 0x74, + VK_F6 = 0x75, + VK_F7 = 0x76, + VK_F8 = 0x77, + VK_F9 = 0x78, + VK_F10 = 0x79, + VK_F11 = 0x7A, + VK_F12 = 0x7B, + VK_F13 = 0x7C, + VK_F14 = 0x7D, + VK_F15 = 0x7E, + VK_F16 = 0x7F, + VK_F17 = 0x80, + VK_F18 = 0x81, + VK_F19 = 0x82, + VK_F20 = 0x83, + VK_F21 = 0x84, + VK_F22 = 0x85, + VK_F23 = 0x86, + VK_F24 = 0x87, + // + VK_NUMLOCK = 0x90, + VK_SCROLL = 0x91, + // + VK_OEM_NEC_EQUAL = 0x92, // '=' key on numpad + // + VK_OEM_FJ_JISHO = 0x92, // 'Dictionary' key + VK_OEM_FJ_MASSHOU = 0x93, // 'Unregister word' key + VK_OEM_FJ_TOUROKU = 0x94, // 'Register word' key + VK_OEM_FJ_LOYA = 0x95, // 'Left OYAYUBI' key + VK_OEM_FJ_ROYA = 0x96, // 'Right OYAYUBI' key + // + VK_LSHIFT = 0xA0, + VK_RSHIFT = 0xA1, + VK_LCONTROL = 0xA2, + VK_RCONTROL = 0xA3, + VK_LMENU = 0xA4, + VK_RMENU = 0xA5, + // + VK_BROWSER_BACK = 0xA6, + VK_BROWSER_FORWARD = 0xA7, + VK_BROWSER_REFRESH = 0xA8, + VK_BROWSER_STOP = 0xA9, + VK_BROWSER_SEARCH = 0xAA, + VK_BROWSER_FAVORITES = 0xAB, + VK_BROWSER_HOME = 0xAC, + // + VK_VOLUME_MUTE = 0xAD, + VK_VOLUME_DOWN = 0xAE, + VK_VOLUME_UP = 0xAF, + VK_MEDIA_NEXT_TRACK = 0xB0, + VK_MEDIA_PREV_TRACK = 0xB1, + VK_MEDIA_STOP = 0xB2, + VK_MEDIA_PLAY_PAUSE = 0xB3, + VK_LAUNCH_MAIL = 0xB4, + VK_LAUNCH_MEDIA_SELECT = 0xB5, + VK_LAUNCH_APP1 = 0xB6, + VK_LAUNCH_APP2 = 0xB7, + // + VK_OEM_1 = 0xBA, // ';:' for US + VK_OEM_PLUS = 0xBB, // '+' any country + VK_OEM_COMMA = 0xBC, // ',' any country + VK_OEM_MINUS = 0xBD, // '-' any country + VK_OEM_PERIOD = 0xBE, // '.' any country + VK_OEM_2 = 0xBF, // '/?' for US + VK_OEM_3 = 0xC0, // '`~' for US + // + VK_OEM_4 = 0xDB, // '[{' for US + VK_OEM_5 = 0xDC, // '\|' for US + VK_OEM_6 = 0xDD, // ']}' for US + VK_OEM_7 = 0xDE, // ''"' for US + VK_OEM_8 = 0xDF, + // + VK_OEM_AX = 0xE1, // 'AX' key on Japanese AX kbd + VK_OEM_102 = 0xE2, // "<>" or "\|" on RT 102-key kbd. + VK_ICO_HELP = 0xE3, // Help key on ICO + VK_ICO_00 = 0xE4, // 00 key on ICO + // + VK_PROCESSKEY = 0xE5, + // + VK_ICO_CLEAR = 0xE6, + // + VK_PACKET = 0xE7, + // + VK_OEM_RESET = 0xE9, + VK_OEM_JUMP = 0xEA, + VK_OEM_PA1 = 0xEB, + VK_OEM_PA2 = 0xEC, + VK_OEM_PA3 = 0xED, + VK_OEM_WSCTRL = 0xEE, + VK_OEM_CUSEL = 0xEF, + VK_OEM_ATTN = 0xF0, + VK_OEM_FINISH = 0xF1, + VK_OEM_COPY = 0xF2, + VK_OEM_AUTO = 0xF3, + VK_OEM_ENLW = 0xF4, + VK_OEM_BACKTAB = 0xF5, + // + VK_ATTN = 0xF6, + VK_CRSEL = 0xF7, + VK_EXSEL = 0xF8, + VK_EREOF = 0xF9, + VK_PLAY = 0xFA, + VK_ZOOM = 0xFB, + VK_NONAME = 0xFC, + VK_PA1 = 0xFD, + VK_OEM_CLEAR = 0xFE + } +} diff --git a/OnTopReplica/OnTopReplica.csproj b/OnTopReplica/OnTopReplica.csproj index 6820fe6..a051510 100644 --- a/OnTopReplica/OnTopReplica.csproj +++ b/OnTopReplica/OnTopReplica.csproj @@ -131,10 +131,12 @@ + + diff --git a/OnTopReplica/ThumbnailPanel.cs b/OnTopReplica/ThumbnailPanel.cs index ab2fa23..44d3979 100644 --- a/OnTopReplica/ThumbnailPanel.cs +++ b/OnTopReplica/ThumbnailPanel.cs @@ -139,11 +139,12 @@ namespace OnTopReplica { protected override void WndProc(ref Message m) { base.WndProc(ref m); - //Make transparent to hit-testing if clicks must not be registered - if (m.Msg == WM.NCHITTEST && m.Result.ToInt32() == HT.CLIENT && - !DrawMouseRegions && !ReportThumbnailClicks) { - - m.Result = new IntPtr(HT.TRANSPARENT); + //Check whether this is a hit-test on "client" surface + if (m.Msg == WM.NCHITTEST && m.Result.ToInt32() == HT.CLIENT) { + //Check whether clicks must be reported + if(!DrawMouseRegions && !ReportThumbnailClicks /*&& !InputMethods.IsKeyPressed(VirtualKeyState.VK_SHIFT)*/){ + m.Result = new IntPtr(HT.TRANSPARENT); + } } } @@ -310,7 +311,7 @@ namespace OnTopReplica { } protected override void OnMouseUp(MouseEventArgs e) { - if (_drawMouseRegions && e.Button == MouseButtons.Left) { + if (DrawMouseRegions && e.Button == MouseButtons.Left) { //Region completed _drawingRegion = false; _drawingSuspended = false;