From 4e841215538bdcfae3566a30f26543737dfbdff5 Mon Sep 17 00:00:00 2001 From: antelle Date: Mon, 8 Mar 2021 22:29:59 +0100 Subject: [PATCH] cleaned up legacy auto-type --- Gruntfile.js | 27 - .../auto-type/auto-type-emitter-factory.js | 19 - .../auto-type/auto-type-helper-factory.js | 19 - app/scripts/auto-type/auto-type-runner.js | 7 +- .../emitter/auto-type-emitter-darwin.js | 133 --- .../emitter/auto-type-emitter-linux.js | 162 --- .../emitter/auto-type-emitter-win32.js | 135 --- .../helper/auto-type-helper-darwin.js | 92 -- .../helper/auto-type-helper-linux.js | 23 - .../helper/auto-type-helper-win32.js | 25 - .../helper/auto-type-native-helper.js | 21 - app/scripts/auto-type/index.js | 7 +- app/scripts/const/default-app-settings.js | 1 - app/scripts/locales/base.json | 1 - .../views/settings/settings-general-view.js | 8 - app/templates/settings/settings-general.hbs | 7 - grunt.entrypoints.js | 2 - grunt.tasks.js | 5 - helper/darwin/KeeWebHelper | Bin 217136 -> 0 bytes .../KeeWebHelper.xcodeproj/project.pbxproj | 308 ------ .../InputCommands/CopyPasteCommand.h | 11 - .../InputCommands/CopyPasteCommand.m | 29 - .../InputCommands/InputCommandBase.h | 5 - .../KeeWebHelper/InputCommands/NoOpCommand.h | 12 - .../KeeWebHelper/InputCommands/NoOpCommand.m | 24 - .../InputCommands/SendKeyCommand.h | 14 - .../InputCommands/SendKeyCommand.m | 25 - .../InputCommands/SendTextCommand.h | 13 - .../InputCommands/SendTextCommand.m | 112 --- .../InputCommands/UnknownCommand.h | 11 - .../InputCommands/UnknownCommand.m | 17 - .../KeeWebHelper/InputCommands/WaitCommand.h | 11 - .../KeeWebHelper/InputCommands/WaitCommand.m | 17 - helper/darwin/src/KeeWebHelper/InputParser.h | 9 - helper/darwin/src/KeeWebHelper/InputParser.m | 105 -- helper/darwin/src/KeeWebHelper/KeyRunner.h | 13 - helper/darwin/src/KeeWebHelper/KeyRunner.m | 65 -- helper/darwin/src/KeeWebHelper/main.m | 30 - helper/win32/KeeWebHelper.exe | Bin 35248 -> 0 bytes helper/win32/src/KeeWebHelper.sln | 22 - helper/win32/src/KeeWebHelper/App.config | 6 - .../InputCommands/CopyPasteCommand.cs | 25 - .../InputCommands/InputCommandBase.cs | 7 - .../InputCommands/ModifierKeys.cs | 13 - .../KeeWebHelper/InputCommands/NoOpCommand.cs | 9 - .../InputCommands/SendKeyCommand.cs | 49 - .../InputCommands/SendTextCommand.cs | 28 - .../InputCommands/UnknownCommand.cs | 19 - .../KeeWebHelper/InputCommands/WaitCommand.cs | 19 - helper/win32/src/KeeWebHelper/InputParser.cs | 76 -- .../src/KeeWebHelper/InputStateValidator.cs | 49 - .../src/KeeWebHelper/KeeWebHelper.csproj | 119 --- helper/win32/src/KeeWebHelper/Program.cs | 41 - .../KeeWebHelper/Properties/AssemblyInfo.cs | 36 - helper/win32/src/KeeWebHelper/WindowHelper.cs | 112 --- helper/win32/src/KeeWebHelper/WindowInfo.cs | 14 - .../WindowsInput/IInputDeviceStateAdaptor.cs | 55 - .../WindowsInput/IInputMessageDispatcher.cs | 20 - .../WindowsInput/IInputSimulator.cs | 26 - .../WindowsInput/IKeyboardSimulator.cs | 98 -- .../WindowsInput/IMouseSimulator.cs | 125 --- .../KeeWebHelper/WindowsInput/InputBuilder.cs | 486 --------- .../WindowsInput/InputSimulator.cs | 75 -- .../WindowsInput/KeyboardSimulator.cs | 228 ----- .../KeeWebHelper/WindowsInput/MouseButton.cs | 23 - .../WindowsInput/MouseSimulator.cs | 270 ----- .../WindowsInput/Native/HARDWAREINPUT.cs | 28 - .../KeeWebHelper/WindowsInput/Native/INPUT.cs | 30 - .../WindowsInput/Native/InputType.cs | 23 - .../WindowsInput/Native/KEYBDINPUT.cs | 46 - .../WindowsInput/Native/KeyboardFlag.cs | 31 - .../WindowsInput/Native/MOUSEINPUT.cs | 56 -- .../Native/MOUSEKEYBDHARDWAREINPUT.cs | 31 - .../WindowsInput/Native/MouseFlag.cs | 76 -- .../WindowsInput/Native/NativeMethods.cs | 101 -- .../WindowsInput/Native/VirtualKeyCode.cs | 939 ------------------ .../WindowsInput/Native/XButton.cs | 18 - .../src/KeeWebHelper/WindowsInput/README.md | 36 - .../WindowsInputDeviceStateAdaptor.cs | 157 --- .../WindowsInputMessageDispatcher.cs | 28 - package/win/sign.cmd | 1 - 81 files changed, 5 insertions(+), 5171 deletions(-) delete mode 100644 app/scripts/auto-type/auto-type-emitter-factory.js delete mode 100644 app/scripts/auto-type/auto-type-helper-factory.js delete mode 100644 app/scripts/auto-type/emitter/auto-type-emitter-darwin.js delete mode 100644 app/scripts/auto-type/emitter/auto-type-emitter-linux.js delete mode 100644 app/scripts/auto-type/emitter/auto-type-emitter-win32.js delete mode 100644 app/scripts/auto-type/helper/auto-type-helper-darwin.js delete mode 100644 app/scripts/auto-type/helper/auto-type-helper-linux.js delete mode 100644 app/scripts/auto-type/helper/auto-type-helper-win32.js delete mode 100644 app/scripts/auto-type/helper/auto-type-native-helper.js delete mode 100755 helper/darwin/KeeWebHelper delete mode 100644 helper/darwin/src/KeeWebHelper.xcodeproj/project.pbxproj delete mode 100644 helper/darwin/src/KeeWebHelper/InputCommands/CopyPasteCommand.h delete mode 100644 helper/darwin/src/KeeWebHelper/InputCommands/CopyPasteCommand.m delete mode 100644 helper/darwin/src/KeeWebHelper/InputCommands/InputCommandBase.h delete mode 100644 helper/darwin/src/KeeWebHelper/InputCommands/NoOpCommand.h delete mode 100644 helper/darwin/src/KeeWebHelper/InputCommands/NoOpCommand.m delete mode 100644 helper/darwin/src/KeeWebHelper/InputCommands/SendKeyCommand.h delete mode 100644 helper/darwin/src/KeeWebHelper/InputCommands/SendKeyCommand.m delete mode 100644 helper/darwin/src/KeeWebHelper/InputCommands/SendTextCommand.h delete mode 100644 helper/darwin/src/KeeWebHelper/InputCommands/SendTextCommand.m delete mode 100644 helper/darwin/src/KeeWebHelper/InputCommands/UnknownCommand.h delete mode 100644 helper/darwin/src/KeeWebHelper/InputCommands/UnknownCommand.m delete mode 100644 helper/darwin/src/KeeWebHelper/InputCommands/WaitCommand.h delete mode 100644 helper/darwin/src/KeeWebHelper/InputCommands/WaitCommand.m delete mode 100644 helper/darwin/src/KeeWebHelper/InputParser.h delete mode 100644 helper/darwin/src/KeeWebHelper/InputParser.m delete mode 100644 helper/darwin/src/KeeWebHelper/KeyRunner.h delete mode 100644 helper/darwin/src/KeeWebHelper/KeyRunner.m delete mode 100644 helper/darwin/src/KeeWebHelper/main.m delete mode 100755 helper/win32/KeeWebHelper.exe delete mode 100755 helper/win32/src/KeeWebHelper.sln delete mode 100755 helper/win32/src/KeeWebHelper/App.config delete mode 100755 helper/win32/src/KeeWebHelper/InputCommands/CopyPasteCommand.cs delete mode 100755 helper/win32/src/KeeWebHelper/InputCommands/InputCommandBase.cs delete mode 100755 helper/win32/src/KeeWebHelper/InputCommands/ModifierKeys.cs delete mode 100755 helper/win32/src/KeeWebHelper/InputCommands/NoOpCommand.cs delete mode 100755 helper/win32/src/KeeWebHelper/InputCommands/SendKeyCommand.cs delete mode 100755 helper/win32/src/KeeWebHelper/InputCommands/SendTextCommand.cs delete mode 100755 helper/win32/src/KeeWebHelper/InputCommands/UnknownCommand.cs delete mode 100755 helper/win32/src/KeeWebHelper/InputCommands/WaitCommand.cs delete mode 100755 helper/win32/src/KeeWebHelper/InputParser.cs delete mode 100755 helper/win32/src/KeeWebHelper/InputStateValidator.cs delete mode 100755 helper/win32/src/KeeWebHelper/KeeWebHelper.csproj delete mode 100755 helper/win32/src/KeeWebHelper/Program.cs delete mode 100755 helper/win32/src/KeeWebHelper/Properties/AssemblyInfo.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowHelper.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowInfo.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/IInputDeviceStateAdaptor.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/IInputMessageDispatcher.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/IInputSimulator.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/IKeyboardSimulator.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/IMouseSimulator.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/InputBuilder.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/InputSimulator.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/KeyboardSimulator.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/MouseButton.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/MouseSimulator.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/Native/HARDWAREINPUT.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/Native/INPUT.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/Native/InputType.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/Native/KEYBDINPUT.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/Native/KeyboardFlag.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/Native/MOUSEINPUT.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/Native/MOUSEKEYBDHARDWAREINPUT.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/Native/MouseFlag.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/Native/NativeMethods.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/Native/VirtualKeyCode.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/Native/XButton.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/README.md delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/WindowsInputDeviceStateAdaptor.cs delete mode 100755 helper/win32/src/KeeWebHelper/WindowsInput/WindowsInputMessageDispatcher.cs delete mode 100644 package/win/sign.cmd diff --git a/Gruntfile.js b/Gruntfile.js index 6f90bc7b..1b577789 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -144,18 +144,6 @@ module.exports = function (grunt) { expand: true, nonull: true }, - 'desktop-darwin-helper-x64': { - src: 'helper/darwin/KeeWebHelper', - dest: 'tmp/desktop/KeeWeb-darwin-x64/KeeWeb.app/Contents/Resources/', - nonull: true, - options: { mode: '0755' } - }, - 'desktop-darwin-helper-arm64': { - src: 'helper/darwin/KeeWebHelper', - dest: 'tmp/desktop/KeeWeb-darwin-arm64/KeeWeb.app/Contents/Resources/', - nonull: true, - options: { mode: '0755' } - }, 'desktop-darwin-installer-helper-x64': { cwd: 'tmp/desktop/KeeWeb Installer.app', src: '**', @@ -174,21 +162,6 @@ module.exports = function (grunt) { nonull: true, options: { mode: true } }, - 'desktop-windows-helper-x64': { - src: 'helper/win32/KeeWebHelper.exe', - dest: 'tmp/desktop/KeeWeb-win32-x64/Resources/', - nonull: true - }, - 'desktop-windows-helper-ia32': { - src: 'helper/win32/KeeWebHelper.exe', - dest: 'tmp/desktop/KeeWeb-win32-ia32/Resources/', - nonull: true - }, - 'desktop-windows-helper-arm64': { - src: 'helper/win32/KeeWebHelper.exe', - dest: 'tmp/desktop/KeeWeb-win32-arm64/Resources/', - nonull: true - }, 'desktop-win32-dist-x64': { src: 'tmp/desktop/KeeWeb.win.x64.exe', dest: `dist/desktop/KeeWeb-${pkg.version}.win.x64.exe`, diff --git a/app/scripts/auto-type/auto-type-emitter-factory.js b/app/scripts/auto-type/auto-type-emitter-factory.js deleted file mode 100644 index 656ac24a..00000000 --- a/app/scripts/auto-type/auto-type-emitter-factory.js +++ /dev/null @@ -1,19 +0,0 @@ -import { Launcher } from 'comp/launcher'; -import { AppSettingsModel } from 'models/app-settings-model'; -import { AutoTypeEmitter } from 'auto-type/auto-type-emitter'; - -const AutoTypeEmitterFactory = { - create(callback, windowId) { - if (Launcher && Launcher.autoTypeSupported) { - if (AppSettingsModel.useLegacyAutoType) { - const { AutoTypeEmitter } = require('./emitter/auto-type-emitter-' + - Launcher.platform()); - return new AutoTypeEmitter(callback, windowId); - } - return new AutoTypeEmitter(callback, windowId); - } - return null; - } -}; - -export { AutoTypeEmitterFactory }; diff --git a/app/scripts/auto-type/auto-type-helper-factory.js b/app/scripts/auto-type/auto-type-helper-factory.js deleted file mode 100644 index d47ba25d..00000000 --- a/app/scripts/auto-type/auto-type-helper-factory.js +++ /dev/null @@ -1,19 +0,0 @@ -import { Launcher } from 'comp/launcher'; -import { AppSettingsModel } from 'models/app-settings-model'; -import { AutoTypeHelper } from 'auto-type/auto-type-helper'; - -const AutoTypeHelperFactory = { - create() { - if (Launcher && Launcher.autoTypeSupported) { - if (AppSettingsModel.useLegacyAutoType) { - const { AutoTypeHelper } = require('./helper/auto-type-helper-' + - Launcher.platform()); - return new AutoTypeHelper(); - } - return new AutoTypeHelper(); - } - return null; - } -}; - -export { AutoTypeHelperFactory }; diff --git a/app/scripts/auto-type/auto-type-runner.js b/app/scripts/auto-type/auto-type-runner.js index 6180b233..8c848128 100644 --- a/app/scripts/auto-type/auto-type-runner.js +++ b/app/scripts/auto-type/auto-type-runner.js @@ -1,8 +1,7 @@ -import { AutoTypeEmitterFactory } from 'auto-type/auto-type-emitter-factory'; +import { AutoTypeEmitter } from 'auto-type/auto-type-emitter'; import { AutoTypeObfuscator } from 'auto-type/auto-type-obfuscator'; import { StringFormat } from 'util/formatting/string-format'; import { Logger } from 'util/logger'; -import { AppSettingsModel } from 'models/app-settings-model'; const emitterLogger = new Logger( 'auto-type-emitter', @@ -433,9 +432,7 @@ AutoTypeRunner.prototype.obfuscateOp = function (op) { }; AutoTypeRunner.prototype.run = function (callback, windowId) { - const emitterType = AppSettingsModel.useLegacyAutoType ? 'legacy' : 'native'; - emitterLogger.info(`Using ${emitterType} auto-type emitter`); - this.emitter = AutoTypeEmitterFactory.create(this.emitNext.bind(this), windowId); + this.emitter = new AutoTypeEmitter(this.emitNext.bind(this), windowId); this.emitterState = { callback, stack: [], diff --git a/app/scripts/auto-type/emitter/auto-type-emitter-darwin.js b/app/scripts/auto-type/emitter/auto-type-emitter-darwin.js deleted file mode 100644 index 1bece4ac..00000000 --- a/app/scripts/auto-type/emitter/auto-type-emitter-darwin.js +++ /dev/null @@ -1,133 +0,0 @@ -import { AutoTypeNativeHelper } from 'auto-type/helper/auto-type-native-helper'; -import { Launcher } from 'comp/launcher'; - -// http://eastmanreference.com/complete-list-of-applescript-key-codes/ -const KeyMap = { - tab: 48, - enter: 36, - space: 49, - up: 126, - down: 125, - left: 123, - right: 124, - home: 115, - end: 119, - pgup: 116, - pgdn: 121, - ins: 114, - del: 117, - bs: 51, - esc: 53, - win: 55, - rwin: 55, - f1: 122, - f2: 120, - f3: 99, - f4: 118, - f5: 96, - f6: 97, - f7: 98, - f8: 100, - f9: 101, - f10: 109, - f11: 103, - f12: 111, - f13: 105, - f14: 107, - f15: 113, - f16: 106, - add: 69, - subtract: 78, - multiply: 67, - divide: 75, - n0: 82, - n1: 83, - n2: 84, - n3: 85, - n4: 86, - n5: 87, - n6: 88, - n7: 89, - n8: 91, - n9: 92 -}; - -const ModMap = { - '^': '@', - '+': '+', - '%': '%', - '^^': '^' -}; - -const AutoTypeEmitter = function (callback) { - this.callback = callback; - this.mod = {}; - this.pendingScript = []; -}; - -AutoTypeEmitter.prototype.begin = function () { - this.callback(); -}; - -AutoTypeEmitter.prototype.setMod = function (mod, enabled) { - if (enabled) { - this.mod[ModMap[mod]] = true; - } else { - delete this.mod[ModMap[mod]]; - } -}; - -AutoTypeEmitter.prototype.text = function (text) { - this.pendingScript.push('text ' + this.modString() + ' ' + text); - this.callback(); -}; - -AutoTypeEmitter.prototype.key = function (key) { - if (typeof key !== 'number') { - if (!KeyMap[key]) { - return this.callback('Bad key: ' + key); - } - key = KeyMap[key]; - } - this.pendingScript.push('key ' + this.modString() + key); - this.callback(); -}; - -AutoTypeEmitter.prototype.copyPaste = function (text) { - this.pendingScript.push('copypaste ' + text); - this.callback(); -}; - -AutoTypeEmitter.prototype.wait = function (time) { - this.pendingScript.push('wait ' + time); - this.callback(); -}; - -AutoTypeEmitter.prototype.waitComplete = function () { - if (this.pendingScript.length) { - const script = this.pendingScript.join('\n'); - this.pendingScript.length = 0; - this.runScript(script); - } else { - this.callback(); - } -}; - -AutoTypeEmitter.prototype.setDelay = function (delay) { - this.delay = delay || 0; - this.callback('Not implemented'); -}; - -AutoTypeEmitter.prototype.modString = function () { - return Object.keys(this.mod).join(''); -}; - -AutoTypeEmitter.prototype.runScript = function (script) { - Launcher.spawn({ - cmd: AutoTypeNativeHelper.getHelperPath(), - data: script, - complete: this.callback - }); -}; - -export { AutoTypeEmitter }; diff --git a/app/scripts/auto-type/emitter/auto-type-emitter-linux.js b/app/scripts/auto-type/emitter/auto-type-emitter-linux.js deleted file mode 100644 index 30b35c2f..00000000 --- a/app/scripts/auto-type/emitter/auto-type-emitter-linux.js +++ /dev/null @@ -1,162 +0,0 @@ -import { Launcher } from 'comp/launcher'; -import { Locale } from 'util/locale'; - -// https://cgit.freedesktop.org/xorg/proto/x11proto/plain/keysymdef.h -const KeyMap = { - tab: 'Tab', - enter: 'KP_Enter', - space: 'KP_Space', - up: 'Up', - down: 'Down', - left: 'Left', - right: 'Right', - home: 'Home', - end: 'End', - pgup: 'Page_Up', - pgdn: 'Page_Down', - ins: 'Insert', - del: 'Delete', - bs: 'BackSpace', - esc: 'Escape', - win: 'Meta_L', - rwin: 'Meta_R', - f1: 'F1', - f2: 'F2', - f3: 'F3', - f4: 'F4', - f5: 'F5', - f6: 'F6', - f7: 'F7', - f8: 'F8', - f9: 'F9', - f10: 'F10', - f11: 'F11', - f12: 'F12', - f13: 'F13', - f14: 'F14', - f15: 'F15', - f16: 'F16', - add: 'KP_Add', - subtract: 'KP_Subtract', - multiply: 'KP_Multiply', - divide: 'KP_Divide', - n0: 'KP_0', - n1: 'KP_1', - n2: 'KP_2', - n3: 'KP_3', - n4: 'KP_4', - n5: 'KP_5', - n6: 'KP_6', - n7: 'KP_7', - n8: 'KP_8', - n9: 'KP_9' -}; - -const ModMap = { - '^': 'ctrl', - '+': 'shift', - '%': 'alt', - '^^': 'ctrl' -}; - -const AutoTypeEmitter = function (callback, windowId) { - this.callback = callback; - this.mod = {}; - this.pendingScript = []; - if (typeof windowId !== 'undefined' && windowId) { - this.pendingScript.push('windowactivate --sync ' + windowId); - } -}; - -AutoTypeEmitter.prototype.begin = function () { - this.callback(); -}; - -AutoTypeEmitter.prototype.setMod = function (mod, enabled) { - if (enabled) { - this.mod[ModMap[mod]] = true; - } else { - delete this.mod[ModMap[mod]]; - } -}; - -AutoTypeEmitter.prototype.text = function (text) { - this.pendingScript.push('keyup ctrl alt shift t'); - Object.keys(this.mod).forEach((mod) => { - this.pendingScript.push('keydown ' + ModMap[mod]); - }); - text.split('').forEach((char) => { - this.pendingScript.push('key ' + 'U' + char.charCodeAt(0).toString(16)); - }); - Object.keys(this.mod).forEach((mod) => { - this.pendingScript.push('keyup ' + ModMap[mod]); - }); - this.waitComplete(); -}; - -AutoTypeEmitter.prototype.key = function (key) { - const isSpecialKey = typeof key !== 'number'; - if (isSpecialKey) { - if (!KeyMap[key]) { - return this.callback('Bad key: ' + key); - } - key = KeyMap[key].toString(); - } - this.pendingScript.push('key --clearmodifiers ' + this.modString() + key); - if (isSpecialKey) { - this.waitComplete(); - } else { - this.callback(); - } -}; - -AutoTypeEmitter.prototype.copyPaste = function (text) { - this.pendingScript.push('sleep 0.5'); - Launcher.setClipboardText(text); - this.pendingScript.push('key --clearmodifiers ' + 'shift+Insert'); - this.pendingScript.push('sleep 0.5'); - this.waitComplete(); -}; - -AutoTypeEmitter.prototype.wait = function (time) { - this.pendingScript.push('sleep ' + time / 1000); - this.callback(); -}; - -AutoTypeEmitter.prototype.waitComplete = function (callback) { - if (this.pendingScript.length) { - const script = this.pendingScript.join(' '); - this.pendingScript.length = 0; - this.runScript(script, callback); - } else { - this.callback(); - } -}; - -AutoTypeEmitter.prototype.modString = function () { - let mod = ''; - Object.keys(this.mod).forEach((key) => { - mod += key + '+'; - }); - return mod; -}; - -AutoTypeEmitter.prototype.runScript = function (script, callback) { - // xdotool doesn't like it when stdin doesn't end with a linebreak - // see https://github.com/keeweb/keeweb/issues/1409 - const data = script + '\n'; - Launcher.spawn({ - cmd: 'xdotool', - args: ['-'], - data, - complete: (err, stdout, code) => { - if (err && err.code === 'ENOENT') { - err = Locale.autoTypeErrorNotInstalled.replace('{}', 'xdotool'); - } - const cb = callback || this.callback; - cb(err, stdout, code); - } - }); -}; - -export { AutoTypeEmitter }; diff --git a/app/scripts/auto-type/emitter/auto-type-emitter-win32.js b/app/scripts/auto-type/emitter/auto-type-emitter-win32.js deleted file mode 100644 index c4a65f48..00000000 --- a/app/scripts/auto-type/emitter/auto-type-emitter-win32.js +++ /dev/null @@ -1,135 +0,0 @@ -import { AutoTypeNativeHelper } from 'auto-type/helper/auto-type-native-helper'; -import { Launcher } from 'comp/launcher'; - -// https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx -const KeyMap = { - tab: 0x09, - enter: 0x0d, - space: 0x20, - up: 0x26, - down: 0x28, - left: 0x25, - right: 0x27, - home: 0x24, - end: 0x23, - pgup: 0x21, - pgdn: 0x22, - ins: 0x2d, - del: 0x2e, - bs: 0x08, - esc: 0x1b, - win: 0x5b, - rwin: 0x5c, - f1: 0x70, - f2: 0x71, - f3: 0x72, - f4: 0x73, - f5: 0x74, - f6: 0x75, - f7: 0x76, - f8: 0x77, - f9: 0x78, - f10: 0x79, - f11: 0x7a, - f12: 0x7b, - f13: 0x7c, - f14: 0x7d, - f15: 0x7e, - f16: 0x7f, - add: 0x6b, - subtract: 0x6d, - multiply: 0x6a, - divide: 0x6f, - n0: 0x30, - n1: 0x31, - n2: 0x32, - n3: 0x33, - n4: 0x34, - n5: 0x35, - n6: 0x36, - n7: 0x37, - n8: 0x38, - n9: 0x39 -}; - -const ModMap = { - '^': '^', - '+': '+', - '%': '%', - '^^': '^' -}; - -const AutoTypeEmitter = function (callback) { - this.callback = callback; - this.mod = {}; - this.pendingScript = []; -}; - -AutoTypeEmitter.prototype.begin = function () { - this.callback(); -}; - -AutoTypeEmitter.prototype.setMod = function (mod, enabled) { - if (enabled) { - this.mod[ModMap[mod]] = true; - } else { - delete this.mod[ModMap[mod]]; - } -}; - -AutoTypeEmitter.prototype.text = function (text) { - if (text) { - this.pendingScript.push('text ' + this.modStr() + ' ' + text); - } - this.callback(); -}; - -AutoTypeEmitter.prototype.key = function (key) { - if (typeof key !== 'number') { - if (!KeyMap[key]) { - return this.callback('Bad key: ' + key); - } - key = KeyMap[key]; - } - this.pendingScript.push('key ' + this.modStr() + key); - this.callback(); -}; - -AutoTypeEmitter.prototype.copyPaste = function (text) { - this.pendingScript.push('copypaste ' + text); - this.callback(); -}; - -AutoTypeEmitter.prototype.wait = function (time) { - this.pendingScript.push('wait ' + time); - this.callback(); -}; - -AutoTypeEmitter.prototype.waitComplete = function () { - if (this.pendingScript.length) { - const script = this.pendingScript.join('\n'); - this.pendingScript.length = 0; - this.runScript(script); - } else { - this.callback(); - } -}; - -AutoTypeEmitter.prototype.setDelay = function (delay) { - this.delay = delay || 0; - this.callback('Not implemented'); -}; - -AutoTypeEmitter.prototype.modStr = function () { - return Object.keys(this.mod).join(''); -}; - -AutoTypeEmitter.prototype.runScript = function (script) { - Launcher.spawn({ - cmd: AutoTypeNativeHelper.getHelperPath(), - data: script, - complete: this.callback - }); -}; - -export { AutoTypeEmitter }; diff --git a/app/scripts/auto-type/helper/auto-type-helper-darwin.js b/app/scripts/auto-type/helper/auto-type-helper-darwin.js deleted file mode 100644 index b74434fe..00000000 --- a/app/scripts/auto-type/helper/auto-type-helper-darwin.js +++ /dev/null @@ -1,92 +0,0 @@ -import { Launcher } from 'comp/launcher'; - -const ForeMostAppScript = - 'tell application "System Events"\n' + - ' set frontAppName to name of first process whose frontmost is true\n' + - ' set frontAppId to id of first process whose frontmost is true\n' + - 'end tell\n' + - '"" & frontAppId & " " & frontAppName'; -const ChromeScript = - 'tell application "{}" to set appUrl to URL of active tab of front window\n' + - 'tell application "{}" to set appTitle to title of active tab of front window\n' + - 'return appUrl & "\n" & appTitle'; -const SafariScript = - 'tell application "{}" to set appUrl to URL of front document\n' + - 'tell application "{}" to set appTitle to name of front document\n' + - 'return appUrl & "\n" & appTitle'; -const OtherAppsScript = - 'tell application "System Events"\n' + - ' tell process "{}"\n' + - ' tell (1st window whose value of attribute "AXMain" is true)\n' + - ' set windowTitle to value of attribute "AXTitle"\n' + - ' end tell\n' + - ' end tell\n' + - 'end tell'; - -const AutoTypeHelper = function () {}; - -AutoTypeHelper.prototype.getActiveWindowInfo = function (callback) { - AutoTypeHelper.exec(ForeMostAppScript, (err, out) => { - if (err) { - return callback(err); - } - const output = out.trim(); - const spaceIx = output.indexOf(' '); - let id = '', - appName = ''; - if (spaceIx >= 0) { - id = output.substr(0, spaceIx); - appName = output.substr(spaceIx + 1).trim(); - } - // getting urls and titles from Chrome or Safari: - // - will suit in 90% cases - // - does not require assistive access - // - allows to get url - if (['Google Chrome', 'Chromium', 'Google Chrome Canary'].indexOf(appName) >= 0) { - AutoTypeHelper.exec(ChromeScript.replace(/\{}/g, appName), (err, out) => { - if (err) { - return callback(err, { id }); - } - const parts = out.split('\n'); - return callback(null, { - id, - url: parts[0].trim(), - title: (parts[1] || '').trim() - }); - }); - } else if (['Safari', 'Webkit'].indexOf(appName) >= 0) { - AutoTypeHelper.exec(SafariScript.replace(/\{}/g, appName), (err, out) => { - if (err) { - return callback(err, { id }); - } - const parts = out.split('\n'); - return callback(null, { - id, - url: parts[0].trim(), - title: (parts[1] || '').trim() - }); - }); - } else { - // special cases are not available. this method may ask the user about assistive access - AutoTypeHelper.exec(OtherAppsScript.replace(/\{}/g, appName), (err, out) => { - if (err) { - return callback(err, { id }); - } - return callback(null, { - id, - title: out.trim() - }); - }); - } - }); -}; - -AutoTypeHelper.exec = function (script, callback) { - Launcher.spawn({ - cmd: 'osascript', - args: ['-e', script], - complete: callback - }); -}; - -export { AutoTypeHelper }; diff --git a/app/scripts/auto-type/helper/auto-type-helper-linux.js b/app/scripts/auto-type/helper/auto-type-helper-linux.js deleted file mode 100644 index 65919692..00000000 --- a/app/scripts/auto-type/helper/auto-type-helper-linux.js +++ /dev/null @@ -1,23 +0,0 @@ -import { Launcher } from 'comp/launcher'; - -const AutoTypeHelper = function () {}; - -AutoTypeHelper.prototype.getActiveWindowInfo = function (callback) { - Launcher.spawn({ - cmd: 'xdotool', - args: ['getactivewindow', 'getwindowname', 'getactivewindow'], - complete(err, out) { - let windowInfo; - if (out) { - const [title, id] = out.trim().split('\n'); - windowInfo = { - id, - title - }; - } - return callback(err, windowInfo); - } - }); -}; - -export { AutoTypeHelper }; diff --git a/app/scripts/auto-type/helper/auto-type-helper-win32.js b/app/scripts/auto-type/helper/auto-type-helper-win32.js deleted file mode 100644 index a59a5fcf..00000000 --- a/app/scripts/auto-type/helper/auto-type-helper-win32.js +++ /dev/null @@ -1,25 +0,0 @@ -import { AutoTypeNativeHelper } from 'auto-type/helper/auto-type-native-helper'; -import { Launcher } from 'comp/launcher'; - -const AutoTypeHelper = function () {}; - -AutoTypeHelper.prototype.getActiveWindowInfo = function (callback) { - Launcher.spawn({ - cmd: AutoTypeNativeHelper.getHelperPath(), - args: ['--window-info'], - complete(err, out) { - if (err) { - return callback(err); - } - const [id, title, url] = out.trim().split('\n'); - const windowInfo = { - id, - title, - url - }; - return callback(null, windowInfo); - } - }); -}; - -export { AutoTypeHelper }; diff --git a/app/scripts/auto-type/helper/auto-type-native-helper.js b/app/scripts/auto-type/helper/auto-type-native-helper.js deleted file mode 100644 index d8485029..00000000 --- a/app/scripts/auto-type/helper/auto-type-native-helper.js +++ /dev/null @@ -1,21 +0,0 @@ -import { Launcher } from 'comp/launcher'; -import { Logger } from 'util/logger'; - -const logger = new Logger('auto-type'); - -const AutoTypeNativeHelper = { - getHelperPath() { - if (this._helperPath) { - return this._helperPath; - } - const ext = process.platform === 'win32' ? '.exe' : ''; - const helperRelPath = `helper/${process.platform}/KeeWebHelper${ext}`; - const helperPath = Launcher.getAppPath(helperRelPath); - Launcher.ensureRunnable(helperPath); - logger.debug('Using auto-type helper', helperPath); - this._helperPath = helperPath; - return helperPath; - } -}; - -export { AutoTypeNativeHelper }; diff --git a/app/scripts/auto-type/index.js b/app/scripts/auto-type/index.js index cdba6b22..6db5b5ae 100644 --- a/app/scripts/auto-type/index.js +++ b/app/scripts/auto-type/index.js @@ -1,6 +1,6 @@ import { Events } from 'framework/events'; import { AutoTypeFilter } from 'auto-type/auto-type-filter'; -import { AutoTypeHelperFactory } from 'auto-type/auto-type-helper-factory'; +import { AutoTypeHelper } from 'auto-type/auto-type-helper'; import { AutoTypeParser } from 'auto-type/auto-type-parser'; import { Launcher } from 'comp/launcher'; import { Features } from 'util/features'; @@ -168,9 +168,8 @@ const AutoType = { }, getActiveWindowInfo(callback) { - const helperType = AppSettingsModel.useLegacyAutoType ? 'legacy' : 'native'; - logger.debug(`Getting window info using ${helperType} helper`); - const helper = AutoTypeHelperFactory.create(); + logger.debug('Getting window info'); + const helper = new AutoTypeHelper(); return helper.getActiveWindowInfo((err, windowInfo) => { if (err) { logger.error('Error getting window info', err); diff --git a/app/scripts/const/default-app-settings.js b/app/scripts/const/default-app-settings.js index 18aea9fb..f0cf345c 100644 --- a/app/scripts/const/default-app-settings.js +++ b/app/scripts/const/default-app-settings.js @@ -43,7 +43,6 @@ const DefaultAppSettings = { excludePinsFromAudit: true, // exclude PIN codes from audit checkPasswordsOnHIBP: false, // check passwords on Have I Been Pwned auditPasswordAge: 0, // show warnings about old passwords, number of years, 0 = disabled - useLegacyAutoType: false, // use legacy auto-type engine (will be removed in future versions) deviceOwnerAuth: null, // Touch ID: null / 'memory' / 'file' deviceOwnerAuthTimeoutMinutes: 0, // how often master password is required with Touch ID disableOfflineStorage: false, // don't cache loaded files in offline storage diff --git a/app/scripts/locales/base.json b/app/scripts/locales/base.json index 2f0234e9..2939387a 100644 --- a/app/scripts/locales/base.json +++ b/app/scripts/locales/base.json @@ -464,7 +464,6 @@ "setGenShowAppLogs": "Show app logs", "setGenReloadApp": "Reload the app", "setGenFieldLabelDblClickAutoType": "Auto-type on double-clicking field labels", - "setGenUseLegacyAutoType": "Use legacy auto-type (if you have issues)", "setGenTouchId": "Touch ID", "setGenTouchIdDisabled": "Don't use Touch ID", "setGenTouchIdMemory": "Unlock with Touch ID only while KeeWeb is running", diff --git a/app/scripts/views/settings/settings-general-view.js b/app/scripts/views/settings/settings-general-view.js index 48b09b75..6f412d0a 100644 --- a/app/scripts/views/settings/settings-general-view.js +++ b/app/scripts/views/settings/settings-general-view.js @@ -54,7 +54,6 @@ class SettingsGeneralView extends View { 'change .settings__general-direct-autotype': 'changeDirectAutotype', 'change .settings__general-field-label-dblclick-autotype': 'changeFieldLabelDblClickAutoType', - 'change .settings__general-use-legacy-autotype': 'changeUseLegacyAutoType', 'change .settings__general-device-owner-auth': 'changeDeviceOwnerAuth', 'change .settings__general-device-owner-auth-timeout': 'changeDeviceOwnerAuthTimeout', 'change .settings__general-titlebar-style': 'changeTitlebarStyle', @@ -135,7 +134,6 @@ class SettingsGeneralView extends View { useGroupIconForEntries: AppSettingsModel.useGroupIconForEntries, directAutotype: AppSettingsModel.directAutotype, fieldLabelDblClickAutoType: AppSettingsModel.fieldLabelDblClickAutoType, - useLegacyAutoType: AppSettingsModel.useLegacyAutoType, supportsTitleBarStyles: Features.supportsTitleBarStyles(), supportsCustomTitleBarAndDraggableWindow: Features.supportsCustomTitleBarAndDraggableWindow(), titlebarStyle: AppSettingsModel.titlebarStyle, @@ -435,12 +433,6 @@ class SettingsGeneralView extends View { Events.emit('refresh'); } - changeUseLegacyAutoType(e) { - const useLegacyAutoType = e.target.checked || false; - AppSettingsModel.useLegacyAutoType = useLegacyAutoType; - Events.emit('refresh'); - } - changeDeviceOwnerAuth(e) { const deviceOwnerAuth = e.target.value || null; diff --git a/app/templates/settings/settings-general.hbs b/app/templates/settings/settings-general.hbs index a8848f36..06568907 100644 --- a/app/templates/settings/settings-general.hbs +++ b/app/templates/settings/settings-general.hbs @@ -326,13 +326,6 @@

{{res 'advanced'}}

{{res 'setGenShowAdvanced'}}
- {{#if canAutoType}} -
- - -
- {{/if}} {{#if devTools}} diff --git a/grunt.entrypoints.js b/grunt.entrypoints.js index 6bbe3fe3..78fdff91 100644 --- a/grunt.entrypoints.js +++ b/grunt.entrypoints.js @@ -53,7 +53,6 @@ module.exports = function(grunt) { 'electron:darwin-x64', 'electron-patch:darwin-x64', 'build-darwin-installer', - 'copy:desktop-darwin-helper-x64', 'copy:desktop-darwin-installer-helper-x64', 'copy:native-modules-darwin-x64' ]); @@ -67,7 +66,6 @@ module.exports = function(grunt) { 'default', 'build-desktop-app-content', 'electron:win32-x64', - 'copy:desktop-windows-helper-x64', 'copy:native-modules-win32-x64' ]); diff --git a/grunt.tasks.js b/grunt.tasks.js index fc46d5c8..8ebdea3d 100644 --- a/grunt.tasks.js +++ b/grunt.tasks.js @@ -37,8 +37,6 @@ module.exports = function (grunt) { 'electron-patch:darwin-x64', 'electron-patch:darwin-arm64', 'build-darwin-installer', - 'copy:desktop-darwin-helper-x64', - 'copy:desktop-darwin-helper-arm64', 'copy:desktop-darwin-installer-helper-x64', 'copy:desktop-darwin-installer-helper-arm64', 'copy:native-modules-darwin-x64', @@ -65,9 +63,6 @@ module.exports = function (grunt) { sign ? 'sign-exe:win32-build-x64' : 'noop', sign ? 'sign-exe:win32-build-ia32' : 'noop', sign ? 'sign-exe:win32-build-arm64' : 'noop', - 'copy:desktop-windows-helper-x64', - 'copy:desktop-windows-helper-ia32', - 'copy:desktop-windows-helper-arm64', 'copy:native-modules-win32-x64', 'copy:native-modules-win32-ia32', 'copy:native-modules-win32-arm64' diff --git a/helper/darwin/KeeWebHelper b/helper/darwin/KeeWebHelper deleted file mode 100755 index 4e1892c1aa82899a2327693e6533e2aeedd5957d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217136 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⪙TZ^r3VXT@=4XNF*Nvnv#Q7bzkD<6zdD|M8&%724r~-~GzT`-4Q77>{aE(J^w%f( zAoaBfFh>0hbeFsSs3|2Ta=4e%eYyzx~~2)U*nm6H{>hXuSuzws^F~H?vo6b}!%g z{KuX^mM7Lea@F&FcMg`}T~sCqDZwXzwErtdIxI>QmYLVaFGr{L%aN&tto_JCxCW z`KlK_i}>}KF;_;-zNvM}XN`aC_m9hM#$dG3xKkd0y?AWeG>p9N1BVpl=9s7Bsy@DG zFetodkEn1nzFC0VT6r0R!pEl!jp!FXWN@Q_9pe+@=tjFaKPSuMHIE%1J8DFnIXogV z(wd*2AHGUS5C8Z;5!4J;@mV>PL{(??bX{?*Lz^3%J;xX zr8fpQ!dRi%?PAZlr=xBS>8Qo4r3VZKL)6HS_yBf+T3#pRQKk?>WK>Z|pl%NotQH!h z`h>L7s-q_?q`j73lOA<`Ha)7FpYyOg82YJ7L@us6cv|jRFpm|iEm$9|?BfsBwuIuR!B#SHk)b4}LD^hR&IQ5<*&n`Rn z;hz2ldfWd^dTFt_bj*5ZlY*i}_3kX&kThm$$&L@(u8z3ydEb{>$H{mPyzb@urt+8F zZ@>SvVfc)|3wd!vAWKHH9a~?ZBdg7Gc=g&1ictJWh>zDW! z#y{V);f>38?JhleYJ_z0wQ*#bb?W|5g14MBSrFpn?IxfM7r{AQ%t~2nGZLf&syRU_dY+ z7!V8y1_T3w0l|P^KrkQ}5DW+g1OtKr!GK^uFd!HZ3 - -#import "InputCommandBase.h" - -@interface CopyPasteCommand : NSObject { - NSString *text; -} - -- (id)initWithText:(NSString *)aText; - -@end diff --git a/helper/darwin/src/KeeWebHelper/InputCommands/CopyPasteCommand.m b/helper/darwin/src/KeeWebHelper/InputCommands/CopyPasteCommand.m deleted file mode 100644 index c4ae358a..00000000 --- a/helper/darwin/src/KeeWebHelper/InputCommands/CopyPasteCommand.m +++ /dev/null @@ -1,29 +0,0 @@ -#import -#import - -#import "CopyPasteCommand.h" -#import "../KeyRunner.h" - -@implementation CopyPasteCommand - -- (id)initWithText:(NSString *)aText { - self = [super init]; - if (self) { - text = aText; - } - return self; -} - -- (void)execute { - usleep(500000); - NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; - [pasteboard clearContents]; - [pasteboard setString:text forType:NSStringPboardType]; - usleep(500000); - [KeyRunner keyModUpDown:kCGEventFlagMaskCommand down:true]; - [KeyRunner keyPress:0 code:kVK_ANSI_V flags:kCGEventFlagMaskCommand]; - [KeyRunner keyModUpDown:kCGEventFlagMaskCommand down:false]; - usleep(500000); -} - -@end diff --git a/helper/darwin/src/KeeWebHelper/InputCommands/InputCommandBase.h b/helper/darwin/src/KeeWebHelper/InputCommands/InputCommandBase.h deleted file mode 100644 index 91c44176..00000000 --- a/helper/darwin/src/KeeWebHelper/InputCommands/InputCommandBase.h +++ /dev/null @@ -1,5 +0,0 @@ -@protocol InputCommandBase - -- (void)execute; - -@end diff --git a/helper/darwin/src/KeeWebHelper/InputCommands/NoOpCommand.h b/helper/darwin/src/KeeWebHelper/InputCommands/NoOpCommand.h deleted file mode 100644 index 86fe9fe2..00000000 --- a/helper/darwin/src/KeeWebHelper/InputCommands/NoOpCommand.h +++ /dev/null @@ -1,12 +0,0 @@ -#import - -#import "InputCommandBase.h" - -@interface NoOpCommand : NSObject { - NSString *message; -} - -- (id)init; -- (id)initWithMessage:(NSString *)aMessage; - -@end diff --git a/helper/darwin/src/KeeWebHelper/InputCommands/NoOpCommand.m b/helper/darwin/src/KeeWebHelper/InputCommands/NoOpCommand.m deleted file mode 100644 index 4aa01008..00000000 --- a/helper/darwin/src/KeeWebHelper/InputCommands/NoOpCommand.m +++ /dev/null @@ -1,24 +0,0 @@ -#import "NoOpCommand.h" - -@implementation NoOpCommand - -- (id)init { - self = [super init]; - return self; -} - -- (id)initWithMessage:(NSString *)aMessage { - self = [super init]; - if (self) { - message = aMessage; - } - return self; -} - -- (void)execute { - if (message) { - NSLog(@"Error: %@", message); - } -} - -@end diff --git a/helper/darwin/src/KeeWebHelper/InputCommands/SendKeyCommand.h b/helper/darwin/src/KeeWebHelper/InputCommands/SendKeyCommand.h deleted file mode 100644 index 1e9f6286..00000000 --- a/helper/darwin/src/KeeWebHelper/InputCommands/SendKeyCommand.h +++ /dev/null @@ -1,14 +0,0 @@ -#import -#import -#import - -#import "InputCommandBase.h" - -@interface SendKeyCommand : NSObject { - CGKeyCode key; - CGEventFlags modifier; -} - -- (id)initWithKey:(CGKeyCode)aKey andModifier:(CGEventFlags)aModifier; - -@end diff --git a/helper/darwin/src/KeeWebHelper/InputCommands/SendKeyCommand.m b/helper/darwin/src/KeeWebHelper/InputCommands/SendKeyCommand.m deleted file mode 100644 index 35a02275..00000000 --- a/helper/darwin/src/KeeWebHelper/InputCommands/SendKeyCommand.m +++ /dev/null @@ -1,25 +0,0 @@ -#import "SendKeyCommand.h" -#import "../KeyRunner.h" - -@implementation SendKeyCommand - -- (id)initWithKey:(CGKeyCode)aKey andModifier:(CGEventFlags)aModifier { - self = [super init]; - if (self) { - key = aKey; - modifier = aModifier; - } - return self; -} - -- (void)execute { - if (modifier) { - [KeyRunner keyModUpDown:modifier down:true]; - } - [KeyRunner keyPress:0 code:key flags:modifier]; - if (modifier) { - [KeyRunner keyModUpDown:modifier down:false]; - } -} - -@end diff --git a/helper/darwin/src/KeeWebHelper/InputCommands/SendTextCommand.h b/helper/darwin/src/KeeWebHelper/InputCommands/SendTextCommand.h deleted file mode 100644 index dc3db0a1..00000000 --- a/helper/darwin/src/KeeWebHelper/InputCommands/SendTextCommand.h +++ /dev/null @@ -1,13 +0,0 @@ -#import - -#import "InputCommandBase.h" - -@interface SendTextCommand : NSObject { - NSString *text; - CGEventFlags modifier; -} - -- (id)initWithText:(NSString *)aText andModifier:(CGEventFlags)aModifier; -+ (void)initialize; - -@end diff --git a/helper/darwin/src/KeeWebHelper/InputCommands/SendTextCommand.m b/helper/darwin/src/KeeWebHelper/InputCommands/SendTextCommand.m deleted file mode 100644 index 284dc333..00000000 --- a/helper/darwin/src/KeeWebHelper/InputCommands/SendTextCommand.m +++ /dev/null @@ -1,112 +0,0 @@ -#import "SendTextCommand.h" -#import "../KeyRunner.h" - -@implementation SendTextCommand - -NSDictionary *knownKeyCodes; - -- (id)initWithText:(NSString *)aText andModifier:(CGEventFlags)aModifier { - self = [super init]; - if (self) { - text = aText; - modifier = aModifier; - } - return self; -} - -- (void)execute { - if (modifier) { - [KeyRunner keyModUpDown:modifier down:true]; - } - NSString *textLower = [text lowercaseString]; - for (int i = 0; i < text.length; i++) { - unichar ch = [text characterAtIndex:i]; - unichar chLower = [textLower characterAtIndex:i]; - id knownKeyCode = [knownKeyCodes objectForKey:@(chLower)]; - CGKeyCode keyCode = knownKeyCode == nil ? 0 : (CGKeyCode)[knownKeyCode unsignedShortValue]; - if (modifier && modifier != kCGEventFlagMaskShift) { - ch = 0; - } - [KeyRunner keyPress:ch code:keyCode flags:modifier]; - } - if (modifier) { - [KeyRunner keyModUpDown:modifier down:false]; - } -} - -+ (void)initialize { - knownKeyCodes = @{ - @'0': @(kVK_ANSI_0), - @'1': @(kVK_ANSI_1), - @'2': @(kVK_ANSI_2), - @'3': @(kVK_ANSI_3), - @'4': @(kVK_ANSI_4), - @'5': @(kVK_ANSI_5), - @'6': @(kVK_ANSI_6), - @'7': @(kVK_ANSI_7), - @'8': @(kVK_ANSI_8), - @'9': @(kVK_ANSI_9), - @'0': @(kVK_ANSI_0), - @'a': @(kVK_ANSI_A), - @'b': @(kVK_ANSI_B), - @'c': @(kVK_ANSI_C), - @'d': @(kVK_ANSI_D), - @'e': @(kVK_ANSI_E), - @'f': @(kVK_ANSI_F), - @'g': @(kVK_ANSI_G), - @'h': @(kVK_ANSI_H), - @'i': @(kVK_ANSI_I), - @'j': @(kVK_ANSI_J), - @'k': @(kVK_ANSI_K), - @'l': @(kVK_ANSI_L), - @'m': @(kVK_ANSI_M), - @'n': @(kVK_ANSI_N), - @'o': @(kVK_ANSI_O), - @'p': @(kVK_ANSI_P), - @'q': @(kVK_ANSI_Q), - @'r': @(kVK_ANSI_R), - @'s': @(kVK_ANSI_S), - @'t': @(kVK_ANSI_T), - @'u': @(kVK_ANSI_U), - @'v': @(kVK_ANSI_V), - @'w': @(kVK_ANSI_W), - @'x': @(kVK_ANSI_X), - @'y': @(kVK_ANSI_Y), - @'z': @(kVK_ANSI_Z), - @'!': @(kVK_ANSI_1), - @'@': @(kVK_ANSI_2), - @'#': @(kVK_ANSI_3), - @'$': @(kVK_ANSI_4), - @'%': @(kVK_ANSI_5), - @'^': @(kVK_ANSI_6), - @'&': @(kVK_ANSI_7), - @'*': @(kVK_ANSI_8), - @'(': @(kVK_ANSI_9), - @')': @(kVK_ANSI_0), - @'-': @(kVK_ANSI_Minus), - @'_': @(kVK_ANSI_Minus), - @'=': @(kVK_ANSI_Equal), - @'+': @(kVK_ANSI_Equal), - @'`': @(kVK_ANSI_Grave), - @'~': @(kVK_ANSI_Grave), - @',': @(kVK_ANSI_Comma), - @'<': @(kVK_ANSI_Comma), - @'.': @(kVK_ANSI_Period), - @'>': @(kVK_ANSI_Period), - @'/': @(kVK_ANSI_Slash), - @'?': @(kVK_ANSI_Slash), - @'\\': @(kVK_ANSI_Backslash), - @'|': @(kVK_ANSI_Backslash), - @';': @(kVK_ANSI_Semicolon), - @':': @(kVK_ANSI_Semicolon), - @'\'': @(kVK_ANSI_Quote), - @'"': @(kVK_ANSI_Quote), - @'[': @(kVK_ANSI_LeftBracket), - @'{': @(kVK_ANSI_LeftBracket), - @']': @(kVK_ANSI_RightBracket), - @'}': @(kVK_ANSI_RightBracket), - @'\t': @(kVK_Tab) - }; -} - -@end diff --git a/helper/darwin/src/KeeWebHelper/InputCommands/UnknownCommand.h b/helper/darwin/src/KeeWebHelper/InputCommands/UnknownCommand.h deleted file mode 100644 index dc666751..00000000 --- a/helper/darwin/src/KeeWebHelper/InputCommands/UnknownCommand.h +++ /dev/null @@ -1,11 +0,0 @@ -#import - -#import "InputCommandBase.h" - -@interface UnknownCommand : NSObject { - NSString *name; -} - -- (id)initWithName:(NSString *)aName; - -@end diff --git a/helper/darwin/src/KeeWebHelper/InputCommands/UnknownCommand.m b/helper/darwin/src/KeeWebHelper/InputCommands/UnknownCommand.m deleted file mode 100644 index 7938b717..00000000 --- a/helper/darwin/src/KeeWebHelper/InputCommands/UnknownCommand.m +++ /dev/null @@ -1,17 +0,0 @@ -#import "UnknownCommand.h" - -@implementation UnknownCommand - -- (id)initWithName:(NSString *)aName { - self = [super init]; - if (self) { - name = aName; - } - return self; -} - -- (void)execute { - NSLog(@"Unknown command: %@", name); -} - -@end diff --git a/helper/darwin/src/KeeWebHelper/InputCommands/WaitCommand.h b/helper/darwin/src/KeeWebHelper/InputCommands/WaitCommand.h deleted file mode 100644 index 98ee3798..00000000 --- a/helper/darwin/src/KeeWebHelper/InputCommands/WaitCommand.h +++ /dev/null @@ -1,11 +0,0 @@ -#import - -#import "InputCommandBase.h" - -@interface WaitCommand : NSObject { - NSInteger time; -} - -- (id)initWithTime:(NSInteger)aTime; - -@end diff --git a/helper/darwin/src/KeeWebHelper/InputCommands/WaitCommand.m b/helper/darwin/src/KeeWebHelper/InputCommands/WaitCommand.m deleted file mode 100644 index 015ac99f..00000000 --- a/helper/darwin/src/KeeWebHelper/InputCommands/WaitCommand.m +++ /dev/null @@ -1,17 +0,0 @@ -#import "WaitCommand.h" - -@implementation WaitCommand - -- (id)initWithTime:(NSInteger)aTime { - self = [super init]; - if (self) { - time = aTime; - } - return self; -} - -- (void)execute { - usleep((unsigned)(time * 1000)); -} - -@end diff --git a/helper/darwin/src/KeeWebHelper/InputParser.h b/helper/darwin/src/KeeWebHelper/InputParser.h deleted file mode 100644 index 69af1162..00000000 --- a/helper/darwin/src/KeeWebHelper/InputParser.h +++ /dev/null @@ -1,9 +0,0 @@ -#import - -#import "InputCommands/InputCommandBase.h" - -@interface InputParser : NSObject - -- (id)next; - -@end diff --git a/helper/darwin/src/KeeWebHelper/InputParser.m b/helper/darwin/src/KeeWebHelper/InputParser.m deleted file mode 100644 index af33c5e5..00000000 --- a/helper/darwin/src/KeeWebHelper/InputParser.m +++ /dev/null @@ -1,105 +0,0 @@ -#import -#import - -#import "InputParser.h" -#import "InputCommands/CopyPasteCommand.h" -#import "InputCommands/NoOpCommand.h" -#import "InputCommands/SendKeyCommand.h" -#import "InputCommands/SendTextCommand.h" -#import "InputCommands/UnknownCommand.h" -#import "InputCommands/WaitCommand.h" - -@implementation InputParser - -- (id)next { - const char *chars = readline(NULL); - if (chars) { - NSString *line = [NSString stringWithUTF8String:chars]; - NSString *command = line; - NSRange range = [line rangeOfString:@" "]; - if (range.location != NSNotFound) { - command = [line substringToIndex:range.location]; - line = [line substringFromIndex:range.location + 1]; - } - if (!command.length) { - return [[NoOpCommand alloc] init]; - } - if ([command isEqualToString:@"exit"]) { - return nil; - } else if ([command isEqualToString:@"key"]) { - return [self parseSendCommand:line text:false]; - } else if ([command isEqualToString:@"text"]) { - return [self parseSendCommand:line text:true]; - } else if ([command isEqualToString:@"copypaste"]) { - if (line.length) { - return [[CopyPasteCommand alloc] initWithText:line]; - } else { - return [[NoOpCommand alloc] init]; - } - } else if ([command isEqualToString:@"wait"]) { - NSInteger time = [line integerValue]; - if (time > 0) { - return [[WaitCommand alloc] initWithTime:time]; - } else { - return [[NoOpCommand alloc] initWithMessage:@"Bad time"]; - } - } - return [[UnknownCommand alloc] initWithName:command]; - } else { - return nil; - } -} - -- (id)parseSendCommand:(NSString*)args text:(bool)text { - if (!args.length) { - return [[NoOpCommand alloc] init]; - } - CGEventFlags modifier = 0; - NSMutableCharacterSet *stopChars = [[NSMutableCharacterSet alloc] init]; - [stopChars formUnionWithCharacterSet:[NSCharacterSet decimalDigitCharacterSet]]; - [stopChars formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]]; - NSInteger index = 0; - while (index < args.length) { - unichar firstChar = [args characterAtIndex:index]; - if ([stopChars characterIsMember:firstChar]) { - break; - } - switch (firstChar) { - case '^': - modifier |= kCGEventFlagMaskControl; - break; - case '+': - modifier |= kCGEventFlagMaskShift; - break; - case '%': - modifier |= kCGEventFlagMaskAlternate; - break; - case '@': - modifier |= kCGEventFlagMaskCommand; - break; - default: - return [[NoOpCommand alloc] initWithMessage:@"Bad key modifier"]; - } - index++; - } - if (text) { - index++; - } - if (index > 0) { - if (index >= args.length) { - return [[NoOpCommand alloc] initWithMessage:@"No key code"]; - } - args = [args substringFromIndex:index]; - } - if (text) { - return [[SendTextCommand alloc] initWithText:args andModifier:modifier]; - } else { - NSInteger key = [args integerValue]; - if (key <= 0) { - return [[NoOpCommand alloc] initWithMessage:@"Bad key code"]; - } - return [[SendKeyCommand alloc] initWithKey:(CGKeyCode)key andModifier:modifier]; - } -} - -@end diff --git a/helper/darwin/src/KeeWebHelper/KeyRunner.h b/helper/darwin/src/KeeWebHelper/KeyRunner.h deleted file mode 100644 index f487b012..00000000 --- a/helper/darwin/src/KeeWebHelper/KeyRunner.h +++ /dev/null @@ -1,13 +0,0 @@ -#import -#import -#import - -@interface KeyRunner : NSObject - -+ (void)initialize; -+ (void)keyPress:(unichar)ch code:(CGKeyCode)code flags:(CGEventFlags)flags; -+ (void)keyUpDown:(unichar)ch code:(CGKeyCode)code flags:(CGEventFlags)flags down:(bool)down; -+ (void)keyModUpDown:(CGEventFlags)flags down:(bool)down; -+ (void)validateSystemState; - -@end diff --git a/helper/darwin/src/KeeWebHelper/KeyRunner.m b/helper/darwin/src/KeeWebHelper/KeyRunner.m deleted file mode 100644 index 5ee29c19..00000000 --- a/helper/darwin/src/KeeWebHelper/KeyRunner.m +++ /dev/null @@ -1,65 +0,0 @@ -#import "KeyRunner.h" - -@implementation KeyRunner - -CGEventSourceRef eventSource = nil; -bool keyboardStateIsValid = false; - -+ (void)initialize { - eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); -} - -+ (void)keyPress:(unichar)ch code:(CGKeyCode)code flags:(CGEventFlags)flags { - [self keyUpDown:ch code:code flags:flags down:true]; - [self keyUpDown:ch code:code flags:flags down:false]; -} - -+ (void)keyModUpDown:(CGEventFlags)modifier down:(bool)down { - if (modifier & kCGEventFlagMaskCommand) { - [self keyUpDown:0 code:kVK_Command flags:0 down:down]; - } - if (modifier & kCGEventFlagMaskAlternate) { - [self keyUpDown:0 code:kVK_Option flags:0 down:down]; - } - if (modifier & kCGEventFlagMaskControl) { - [self keyUpDown:0 code:kVK_Control flags:0 down:down]; - } - if (modifier & kCGEventFlagMaskShift) { - [self keyUpDown:0 code:kVK_Shift flags:0 down:down]; - } -} - -+ (void)keyUpDown:(unichar)ch code:(CGKeyCode)code flags:(CGEventFlags)flags down:(bool)down { - [KeyRunner validateSystemState]; - CGEventRef keyEvent = CGEventCreateKeyboardEvent(eventSource, code, down); - if (ch) { - CGEventKeyboardSetUnicodeString(keyEvent, 1, &ch); - } - if (flags) { - CGEventSetFlags(keyEvent, flags); - } - CGEventPost(kCGHIDEventTap, keyEvent); - CFRelease(keyEvent); -} - -+ (void)validateSystemState { - if (keyboardStateIsValid) { - return; - } - int totalWaitTime = 10 * 1000 * 1000; - int loopWaitTime = 10000; - while (totalWaitTime > 0) { - CGEventFlags flags = CGEventSourceFlagsState(kCGEventSourceStateHIDSystemState); - if ((flags & (kCGEventFlagMaskCommand | kCGEventFlagMaskShift | kCGEventFlagMaskAlternate | kCGEventFlagMaskControl)) == 0) { - keyboardStateIsValid = true; - break; - } - usleep(loopWaitTime); - totalWaitTime -= loopWaitTime; - } - if (!keyboardStateIsValid) { - exit(8); - } -} - -@end diff --git a/helper/darwin/src/KeeWebHelper/main.m b/helper/darwin/src/KeeWebHelper/main.m deleted file mode 100644 index e71d4e21..00000000 --- a/helper/darwin/src/KeeWebHelper/main.m +++ /dev/null @@ -1,30 +0,0 @@ -#import -#import -#import - -#import "InputParser.h" - -int main(int argc, const char * argv[]) { - @autoreleasepool { - NSArray *arguments = [[NSProcessInfo processInfo] arguments]; - BOOL printTime = [arguments containsObject:@"--print-time"]; - CFTimeInterval startTime = CACurrentMediaTime(); - InputParser *parser = [[InputParser alloc] init]; - while (true) { - id cmd = [parser next]; - if (cmd) { - [cmd execute]; - if (printTime) { - int elapsed = (CACurrentMediaTime() - startTime) * 1000; - NSString *name = NSStringFromClass([cmd class]); - NSLog(@"%@: %dms", name, elapsed); - } - } else { - break; - } - } - } - // TODO: ugly way to wait for all keystrokes to be sent. is there a better way? - usleep(100000); - return 0; -} diff --git a/helper/win32/KeeWebHelper.exe b/helper/win32/KeeWebHelper.exe deleted file mode 100755 index d13d074bedc001754f565bc9cd9321d0e9d63050..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35248 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 QuFa3+rEa}RdNlFB01*-LS^xk5 diff --git a/helper/win32/src/KeeWebHelper.sln b/helper/win32/src/KeeWebHelper.sln deleted file mode 100755 index 5ab81069..00000000 --- a/helper/win32/src/KeeWebHelper.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeeWebHelper", "KeeWebHelper\KeeWebHelper.csproj", "{B2BD93BD-87D8-4070-9218-2C5AF47611B5}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B2BD93BD-87D8-4070-9218-2C5AF47611B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B2BD93BD-87D8-4070-9218-2C5AF47611B5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B2BD93BD-87D8-4070-9218-2C5AF47611B5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B2BD93BD-87D8-4070-9218-2C5AF47611B5}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/helper/win32/src/KeeWebHelper/App.config b/helper/win32/src/KeeWebHelper/App.config deleted file mode 100755 index b0827b2a..00000000 --- a/helper/win32/src/KeeWebHelper/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/helper/win32/src/KeeWebHelper/InputCommands/CopyPasteCommand.cs b/helper/win32/src/KeeWebHelper/InputCommands/CopyPasteCommand.cs deleted file mode 100755 index 29c4cdbc..00000000 --- a/helper/win32/src/KeeWebHelper/InputCommands/CopyPasteCommand.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Threading; -using System.Windows.Forms; - -namespace KeeWebHelper.InputCommands -{ - class CopyPasteCommand : InputCommandBase - { - public string Text { get; set; } - - public CopyPasteCommand(string text) - { - Text = text; - } - - public override void Execute() - { - InputStateValidator.EnsureNoKeyIsPressed(); - Thread.Sleep(500); - Clipboard.SetText(Text); - Thread.Sleep(500); - SendKeys.SendWait("+{ins}"); - Thread.Sleep(500); - } - } -} diff --git a/helper/win32/src/KeeWebHelper/InputCommands/InputCommandBase.cs b/helper/win32/src/KeeWebHelper/InputCommands/InputCommandBase.cs deleted file mode 100755 index 112788d5..00000000 --- a/helper/win32/src/KeeWebHelper/InputCommands/InputCommandBase.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace KeeWebHelper.InputCommands -{ - abstract class InputCommandBase - { - public abstract void Execute(); - } -} diff --git a/helper/win32/src/KeeWebHelper/InputCommands/ModifierKeys.cs b/helper/win32/src/KeeWebHelper/InputCommands/ModifierKeys.cs deleted file mode 100755 index 0ca85490..00000000 --- a/helper/win32/src/KeeWebHelper/InputCommands/ModifierKeys.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace KeeWebHelper.InputCommands -{ - [Flags] - enum ModifierKeys : byte - { - None = 0, - Ctrl = 1, - Alt = 2, - Shift = 4 - } -} diff --git a/helper/win32/src/KeeWebHelper/InputCommands/NoOpCommand.cs b/helper/win32/src/KeeWebHelper/InputCommands/NoOpCommand.cs deleted file mode 100755 index ee6744f8..00000000 --- a/helper/win32/src/KeeWebHelper/InputCommands/NoOpCommand.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace KeeWebHelper.InputCommands -{ - class NoOpCommand : InputCommandBase - { - public override void Execute() - { - } - } -} diff --git a/helper/win32/src/KeeWebHelper/InputCommands/SendKeyCommand.cs b/helper/win32/src/KeeWebHelper/InputCommands/SendKeyCommand.cs deleted file mode 100755 index d148a314..00000000 --- a/helper/win32/src/KeeWebHelper/InputCommands/SendKeyCommand.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using System.Windows.Forms; - -namespace KeeWebHelper.InputCommands -{ - class SendKeyCommand : InputCommandBase - { - public byte Key { get; set; } - public ModifierKeys Modifiers { get; set; } - - public SendKeyCommand(byte key, ModifierKeys modifiers) - { - Key = key; - Modifiers = modifiers; - } - - public override void Execute() - { - InputStateValidator.EnsureNoKeyIsPressed(); - if ((Modifiers & ModifierKeys.Ctrl) != 0) { Down((byte)Keys.ControlKey); } - if ((Modifiers & ModifierKeys.Shift) != 0) { Down((byte)Keys.ShiftKey); } - if ((Modifiers & ModifierKeys.Alt) != 0) { Down((byte)Keys.Menu); } - Press(Key); - if ((Modifiers & ModifierKeys.Alt) != 0) { Up((byte)Keys.Menu); } - if ((Modifiers & ModifierKeys.Shift) != 0) { Up((byte)Keys.ShiftKey); } - if ((Modifiers & ModifierKeys.Ctrl) != 0) { Up((byte)Keys.ControlKey); } - } - - [DllImport("user32.dll")] - static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo); - - public static void Down(byte code) - { - keybd_event(code, 0, 1, UIntPtr.Zero); - } - - public static void Up(byte code) - { - keybd_event(code, 0, 3, UIntPtr.Zero); - } - - public static void Press(byte code) - { - Down(code); - Up(code); - } - } -} diff --git a/helper/win32/src/KeeWebHelper/InputCommands/SendTextCommand.cs b/helper/win32/src/KeeWebHelper/InputCommands/SendTextCommand.cs deleted file mode 100755 index baacb51d..00000000 --- a/helper/win32/src/KeeWebHelper/InputCommands/SendTextCommand.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace KeeWebHelper.InputCommands -{ - class SendTextCommand : InputCommandBase - { - private static WindowsInput.IKeyboardSimulator _simulator = new WindowsInput.InputSimulator().Keyboard; - - public string Text { get; set; } - public ModifierKeys Modifiers { get; set; } - - public SendTextCommand(string text, ModifierKeys modifiers) - { - Text = text; - Modifiers = modifiers; - } - - public override void Execute() - { - InputStateValidator.EnsureNoKeyIsPressed(); - if ((Modifiers & ModifierKeys.Ctrl) != 0) { _simulator.KeyDown(WindowsInput.Native.VirtualKeyCode.CONTROL); } - if ((Modifiers & ModifierKeys.Shift) != 0) { _simulator.KeyDown(WindowsInput.Native.VirtualKeyCode.SHIFT); } - if ((Modifiers & ModifierKeys.Alt) != 0) { _simulator.KeyDown(WindowsInput.Native.VirtualKeyCode.MENU); } - _simulator.TextEntry(Text); - if ((Modifiers & ModifierKeys.Ctrl) != 0) { _simulator.KeyUp(WindowsInput.Native.VirtualKeyCode.CONTROL); } - if ((Modifiers & ModifierKeys.Shift) != 0) { _simulator.KeyUp(WindowsInput.Native.VirtualKeyCode.SHIFT); } - if ((Modifiers & ModifierKeys.Alt) != 0) { _simulator.KeyUp(WindowsInput.Native.VirtualKeyCode.MENU); } - } - } -} diff --git a/helper/win32/src/KeeWebHelper/InputCommands/UnknownCommand.cs b/helper/win32/src/KeeWebHelper/InputCommands/UnknownCommand.cs deleted file mode 100755 index 88f774af..00000000 --- a/helper/win32/src/KeeWebHelper/InputCommands/UnknownCommand.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; - -namespace KeeWebHelper.InputCommands -{ - class UnknownCommand : InputCommandBase - { - public string Name { get; set; } - - public UnknownCommand(string name) - { - Name = name; - } - - public override void Execute() - { - Console.Error.WriteLine("Unknown command: {0}", Name); - } - } -} diff --git a/helper/win32/src/KeeWebHelper/InputCommands/WaitCommand.cs b/helper/win32/src/KeeWebHelper/InputCommands/WaitCommand.cs deleted file mode 100755 index 039190c9..00000000 --- a/helper/win32/src/KeeWebHelper/InputCommands/WaitCommand.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Threading; - -namespace KeeWebHelper.InputCommands -{ - class WaitCommand : InputCommandBase - { - public int Interval { get; set; } - - public WaitCommand(int interval) - { - Interval = interval; - } - - public override void Execute() - { - Thread.Sleep(Interval); - } - } -} diff --git a/helper/win32/src/KeeWebHelper/InputParser.cs b/helper/win32/src/KeeWebHelper/InputParser.cs deleted file mode 100755 index af70aac8..00000000 --- a/helper/win32/src/KeeWebHelper/InputParser.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using KeeWebHelper.InputCommands; - -namespace KeeWebHelper -{ - class InputParser - { - public static InputCommandBase Next() - { - var line = Console.ReadLine(); - if (line == null) - { - return null; - } - if (line.Length == 0) - { - return new NoOpCommand(); - } - var parts = line.Split(new[] { ' ' }, 2); - switch (parts[0]) - { - case "exit": - return null; - case "key": - return ParseSendCommand(parts[1], false); - case "text": - return ParseSendCommand(parts[1], true); - case "copypaste": - return new CopyPasteCommand(parts[1]); - case "wait": - return new WaitCommand(int.Parse(parts[1])); - default: - return new UnknownCommand(parts[0]); - } - } - - static InputCommandBase ParseSendCommand(string arg, bool text) - { - ModifierKeys modifiers = ModifierKeys.None; - var index = 0; - while (index < arg.Length && !Char.IsDigit(arg[index]) && !Char.IsWhiteSpace(arg[index])) - { - switch (arg[index]) - { - case '^': - modifiers |= ModifierKeys.Ctrl; - break; - case '+': - modifiers |= ModifierKeys.Shift; - break; - case '%': - modifiers |= ModifierKeys.Alt; - break; - } - index++; - } - if (text) - { - index++; - } - if (index >= arg.Length) - { - return new NoOpCommand(); - } - if (text) - { - return new SendTextCommand(arg.Substring(index), modifiers); - } - else - { - var key = byte.Parse(arg.Substring(index)); - return new SendKeyCommand(key, modifiers); - } - } - } -} diff --git a/helper/win32/src/KeeWebHelper/InputStateValidator.cs b/helper/win32/src/KeeWebHelper/InputStateValidator.cs deleted file mode 100755 index 50102883..00000000 --- a/helper/win32/src/KeeWebHelper/InputStateValidator.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Linq; - -namespace KeeWebHelper -{ - static class InputStateValidator - { - const int MaxWaitTime = 1000 * 10; - const int LoopWaitTime = 100; - - static readonly WindowsInput.Native.VirtualKeyCode[] SupportedKeys = new [] { - WindowsInput.Native.VirtualKeyCode.SHIFT, - WindowsInput.Native.VirtualKeyCode.MENU, - WindowsInput.Native.VirtualKeyCode.CONTROL, - WindowsInput.Native.VirtualKeyCode.LWIN, - WindowsInput.Native.VirtualKeyCode.RWIN - }; - - static bool _isValid = false; - - public static void EnsureNoKeyIsPressed() - { - if (_isValid) - { - return; - } - var waitTime = MaxWaitTime; - var adapter = new WindowsInput.WindowsInputDeviceStateAdaptor(); - while (waitTime > 0) - { - var isPressed = SupportedKeys.Any(key => adapter.IsHardwareKeyDown(key)); - if (isPressed) - { - waitTime -= LoopWaitTime; - System.Threading.Thread.Sleep(LoopWaitTime); - } - else - { - _isValid = true; - break; - } - } - if (!_isValid) - { - throw new Exception("Failed to wait for modifier keys unpress"); - } - } - } -} diff --git a/helper/win32/src/KeeWebHelper/KeeWebHelper.csproj b/helper/win32/src/KeeWebHelper/KeeWebHelper.csproj deleted file mode 100755 index ce93d5f4..00000000 --- a/helper/win32/src/KeeWebHelper/KeeWebHelper.csproj +++ /dev/null @@ -1,119 +0,0 @@ - - - - - Debug - AnyCPU - {B2BD93BD-87D8-4070-9218-2C5AF47611B5} - Exe - Properties - KeeWebHelper - KeeWebHelper - v4.0 - 512 - true - Client - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - KeeWebHelper.Program - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 - true - - - - - \ No newline at end of file diff --git a/helper/win32/src/KeeWebHelper/Program.cs b/helper/win32/src/KeeWebHelper/Program.cs deleted file mode 100755 index cc23a048..00000000 --- a/helper/win32/src/KeeWebHelper/Program.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Text; - -namespace KeeWebHelper -{ - class Program - { - [STAThread] - static void Main(string[] args) - { - var sw = System.Diagnostics.Stopwatch.StartNew(); - Console.InputEncoding = Encoding.UTF8; - Console.OutputEncoding = Encoding.UTF8; - if (args.Length > 0 && args[0] == "--window-info") - { - GetWindowInfo(); - return; - } - var printTime = args.Length > 0 && args[0] == "--print-time"; - while (true) - { - var cmd = InputParser.Next(); - if (cmd == null) - { - return; - } - cmd.Execute(); - if (printTime) - { - Console.WriteLine("{0}: {1}ms", cmd.GetType().Name, sw.ElapsedMilliseconds); - } - } - } - - static void GetWindowInfo() - { - var windowInfo = WindowHelper.GetActiveWindowInfo(); - Console.WriteLine("{0}\n{1}\n{2}", windowInfo.Id, windowInfo.Title, windowInfo.Url); - } - } -} diff --git a/helper/win32/src/KeeWebHelper/Properties/AssemblyInfo.cs b/helper/win32/src/KeeWebHelper/Properties/AssemblyInfo.cs deleted file mode 100755 index 66cda1ea..00000000 --- a/helper/win32/src/KeeWebHelper/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("KeeWebHelper")] -[assembly: AssemblyDescription("KeeWeb helper library")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Antelle.Net")] -[assembly: AssemblyProduct("KeeWebHelper")] -[assembly: AssemblyCopyright("Copyright © Antelle 2019")] -[assembly: AssemblyTrademark("KeeWeb")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("b2bd93bd-87d8-4070-9218-2c5af47611b5")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/helper/win32/src/KeeWebHelper/WindowHelper.cs b/helper/win32/src/KeeWebHelper/WindowHelper.cs deleted file mode 100755 index 67e3f93f..00000000 --- a/helper/win32/src/KeeWebHelper/WindowHelper.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System; -using System.Text; -using System.Runtime.InteropServices; -using System.Diagnostics; -using System.Windows.Automation; - -namespace KeeWebHelper -{ - class WindowHelper - { - static readonly string[] BrowserProcessNames = new[] { "chrome", "firefox", "opera", "browser", - "applicationframehost", "iexplore", "edge" }; - static readonly string[] BrowserWindowClasses = new[] { "Chrome_WidgetWin_1" }; - - [DllImport("user32.dll")] - static extern IntPtr GetForegroundWindow(); - - [DllImport("user32.dll")] - static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); - - [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] - static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); - - [DllImport("user32.dll", SetLastError = true)] - static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId); - - public static WindowInfo GetActiveWindowInfo() - { - const int nChars = 2048; - var buff = new StringBuilder(nChars); - IntPtr hwnd = GetForegroundWindow(); - - var result = new WindowInfo(); - - result.Id = hwnd.ToString(); - - if (GetWindowText(hwnd, buff, nChars) > 0) - { - result.Title = buff.ToString(); - } - - try - { - result.Url = GetUrl(hwnd); - } - catch { } - - return result; - } - - static string GetUrl(IntPtr hwnd) - { - uint pid = 0; - GetWindowThreadProcessId(hwnd, out pid); - if (pid <= 0) - { - return null; - } - var process = Process.GetProcessById((int)pid); - - if (!IsBrowser(process.ProcessName)) - { - const int maxChars = 64; - var cls = new StringBuilder(maxChars); - var clsId = GetClassName(hwnd, cls, maxChars); - if (Array.IndexOf(BrowserWindowClasses, cls.ToString()) < 0) { - return null; - } - } - - var el = AutomationElement.FromHandle(process.MainWindowHandle); - if (el == null) - { - return null; - } - - if (process.ProcessName.IndexOf("chrome", StringComparison.OrdinalIgnoreCase) >= 0) - { - var elChr = el.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "Google Chrome")); - if (elChr != null) - { - el = elChr; - } - } - - var controlCondition = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit); - var valueCondition = new PropertyCondition(AutomationElement.IsValuePatternAvailableProperty, true); - var condition = new AndCondition(controlCondition, valueCondition); - AutomationElement urlEl = el.FindFirst(TreeScope.Descendants, condition); - if (urlEl == null) - { - return null; - } - - var val = (ValuePattern)urlEl.GetCurrentPattern(ValuePattern.Pattern); - return val.Current.Value; - } - - static bool IsBrowser(string processName) - { - processName = processName.ToLower(); - foreach (var br in BrowserProcessNames) - { - if (processName.IndexOf(br) >= 0) - { - return true; - } - } - return false; - } - } -} diff --git a/helper/win32/src/KeeWebHelper/WindowInfo.cs b/helper/win32/src/KeeWebHelper/WindowInfo.cs deleted file mode 100755 index b235ca2c..00000000 --- a/helper/win32/src/KeeWebHelper/WindowInfo.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace KeeWebHelper -{ - class WindowInfo - { - public string Id { get; set; } - public string Title { get; set; } - public string Url { get; set; } - } -} diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/IInputDeviceStateAdaptor.cs b/helper/win32/src/KeeWebHelper/WindowsInput/IInputDeviceStateAdaptor.cs deleted file mode 100755 index 55123574..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/IInputDeviceStateAdaptor.cs +++ /dev/null @@ -1,55 +0,0 @@ -using WindowsInput.Native; - -namespace WindowsInput -{ - /// - /// The contract for a service that interprets the state of input devices. - /// - public interface IInputDeviceStateAdaptor - { - /// - /// Determines whether the specified key is up or down. - /// - /// The for the key. - /// - /// true if the key is down; otherwise, false. - /// - bool IsKeyDown(VirtualKeyCode keyCode); - - /// - /// Determines whether the specified key is up or down. - /// - /// The for the key. - /// - /// true if the key is up; otherwise, false. - /// - bool IsKeyUp(VirtualKeyCode keyCode); - - /// - /// Determines whether the physical key is up or down at the time the function is called regardless of whether the application thread has read the keyboard event from the message pump. - /// - /// The for the key. - /// - /// true if the key is down; otherwise, false. - /// - bool IsHardwareKeyDown(VirtualKeyCode keyCode); - - /// - /// Determines whether the physical key is up or down at the time the function is called regardless of whether the application thread has read the keyboard event from the message pump. - /// - /// The for the key. - /// - /// true if the key is up; otherwise, false. - /// - bool IsHardwareKeyUp(VirtualKeyCode keyCode); - - /// - /// Determines whether the toggling key is toggled on (in-effect) or not. - /// - /// The for the key. - /// - /// true if the toggling key is toggled on (in-effect); otherwise, false. - /// - bool IsTogglingKeyInEffect(VirtualKeyCode keyCode); - } -} \ No newline at end of file diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/IInputMessageDispatcher.cs b/helper/win32/src/KeeWebHelper/WindowsInput/IInputMessageDispatcher.cs deleted file mode 100755 index e8db959b..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/IInputMessageDispatcher.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using WindowsInput.Native; - -namespace WindowsInput -{ - /// - /// The contract for a service that dispatches messages to the appropriate destination. - /// - internal interface IInputMessageDispatcher - { - /// - /// Dispatches the specified list of messages in their specified order. - /// - /// The list of messages to be dispatched. - /// If the array is empty. - /// If the array is null. - /// If the any of the commands in the array could not be sent successfully. - void DispatchInput(INPUT[] inputs); - } -} diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/IInputSimulator.cs b/helper/win32/src/KeeWebHelper/WindowsInput/IInputSimulator.cs deleted file mode 100755 index e8540a22..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/IInputSimulator.cs +++ /dev/null @@ -1,26 +0,0 @@ -namespace WindowsInput -{ - /// - /// The contract for a service that simulates Keyboard and Mouse input and Hardware Input Device state detection for the Windows Platform. - /// - public interface IInputSimulator - { - /// - /// Gets the instance for simulating Keyboard input. - /// - /// The instance. - IKeyboardSimulator Keyboard { get; } - - /// - /// Gets the instance for simulating Mouse input. - /// - /// The instance. - IMouseSimulator Mouse { get; } - - /// - /// Gets the instance for determining the state of the various input devices. - /// - /// The instance. - IInputDeviceStateAdaptor InputDeviceState { get; } - } -} \ No newline at end of file diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/IKeyboardSimulator.cs b/helper/win32/src/KeeWebHelper/WindowsInput/IKeyboardSimulator.cs deleted file mode 100755 index ce20e4a3..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/IKeyboardSimulator.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; -using System.Collections.Generic; -using WindowsInput.Native; - -namespace WindowsInput -{ - /// - /// The service contract for a keyboard simulator for the Windows platform. - /// - public interface IKeyboardSimulator - { - /// - /// Gets the instance for simulating Mouse input. - /// - /// The instance. - IMouseSimulator Mouse { get; } - - /// - /// Simulates the key down gesture for the specified key. - /// - /// The for the key. - IKeyboardSimulator KeyDown(VirtualKeyCode keyCode); - - /// - /// Simulates the key press gesture for the specified key. - /// - /// The for the key. - IKeyboardSimulator KeyPress(VirtualKeyCode keyCode); - - /// - /// Simulates a key press for each of the specified key codes in the order they are specified. - /// - /// - IKeyboardSimulator KeyPress(params VirtualKeyCode[] keyCodes); - - /// - /// Simulates the key up gesture for the specified key. - /// - /// The for the key. - IKeyboardSimulator KeyUp(VirtualKeyCode keyCode); - - /// - /// Simulates a modified keystroke where there are multiple modifiers and multiple keys like CTRL-ALT-K-C where CTRL and ALT are the modifierKeys and K and C are the keys. - /// The flow is Modifiers KeyDown in order, Keys Press in order, Modifiers KeyUp in reverse order. - /// - /// The list of s for the modifier keys. - /// The list of s for the keys to simulate. - IKeyboardSimulator ModifiedKeyStroke(IEnumerable modifierKeyCodes, IEnumerable keyCodes); - - /// - /// Simulates a modified keystroke where there are multiple modifiers and one key like CTRL-ALT-C where CTRL and ALT are the modifierKeys and C is the key. - /// The flow is Modifiers KeyDown in order, Key Press, Modifiers KeyUp in reverse order. - /// - /// The list of s for the modifier keys. - /// The for the key. - IKeyboardSimulator ModifiedKeyStroke(IEnumerable modifierKeyCodes, VirtualKeyCode keyCode); - - /// - /// Simulates a modified keystroke where there is one modifier and multiple keys like CTRL-K-C where CTRL is the modifierKey and K and C are the keys. - /// The flow is Modifier KeyDown, Keys Press in order, Modifier KeyUp. - /// - /// The for the modifier key. - /// The list of s for the keys to simulate. - IKeyboardSimulator ModifiedKeyStroke(VirtualKeyCode modifierKey, IEnumerable keyCodes); - - /// - /// Simulates a simple modified keystroke like CTRL-C where CTRL is the modifierKey and C is the key. - /// The flow is Modifier KeyDown, Key Press, Modifier KeyUp. - /// - /// The for the modifier key. - /// The for the key. - IKeyboardSimulator ModifiedKeyStroke(VirtualKeyCode modifierKeyCode, VirtualKeyCode keyCode); - - /// - /// Simulates uninterrupted text entry via the keyboard. - /// - /// The text to be simulated. - IKeyboardSimulator TextEntry(string text); - - /// - /// Simulates a single character text entry via the keyboard. - /// - /// The unicode character to be simulated. - IKeyboardSimulator TextEntry(char character); - - /// - /// Sleeps the executing thread to create a pause between simulated inputs. - /// - /// The number of milliseconds to wait. - IKeyboardSimulator Sleep(int millsecondsTimeout); - - /// - /// Sleeps the executing thread to create a pause between simulated inputs. - /// - /// The time to wait. - IKeyboardSimulator Sleep(TimeSpan timeout); - } -} diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/IMouseSimulator.cs b/helper/win32/src/KeeWebHelper/WindowsInput/IMouseSimulator.cs deleted file mode 100755 index 452e5ddb..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/IMouseSimulator.cs +++ /dev/null @@ -1,125 +0,0 @@ -using System; - -namespace WindowsInput -{ - /// - /// The service contract for a mouse simulator for the Windows platform. - /// - public interface IMouseSimulator - { - /// - /// Gets the instance for simulating Keyboard input. - /// - /// The instance. - IKeyboardSimulator Keyboard { get; } - - /// - /// Simulates mouse movement by the specified distance measured as a delta from the current mouse location in pixels. - /// - /// The distance in pixels to move the mouse horizontally. - /// The distance in pixels to move the mouse vertically. - IMouseSimulator MoveMouseBy(int pixelDeltaX, int pixelDeltaY); - - /// - /// Simulates mouse movement to the specified location on the primary display device. - /// - /// The destination's absolute X-coordinate on the primary display device where 0 is the extreme left hand side of the display device and 65535 is the extreme right hand side of the display device. - /// The destination's absolute Y-coordinate on the primary display device where 0 is the top of the display device and 65535 is the bottom of the display device. - IMouseSimulator MoveMouseTo(double absoluteX, double absoluteY); - - /// - /// Simulates mouse movement to the specified location on the Virtual Desktop which includes all active displays. - /// - /// The destination's absolute X-coordinate on the virtual desktop where 0 is the left hand side of the virtual desktop and 65535 is the extreme right hand side of the virtual desktop. - /// The destination's absolute Y-coordinate on the virtual desktop where 0 is the top of the virtual desktop and 65535 is the bottom of the virtual desktop. - IMouseSimulator MoveMouseToPositionOnVirtualDesktop(double absoluteX, double absoluteY); - - /// - /// Simulates a mouse left button down gesture. - /// - IMouseSimulator LeftButtonDown(); - - /// - /// Simulates a mouse left button up gesture. - /// - IMouseSimulator LeftButtonUp(); - - /// - /// Simulates a mouse left button click gesture. - /// - IMouseSimulator LeftButtonClick(); - - /// - /// Simulates a mouse left button double-click gesture. - /// - IMouseSimulator LeftButtonDoubleClick(); - - /// - /// Simulates a mouse right button down gesture. - /// - IMouseSimulator RightButtonDown(); - - /// - /// Simulates a mouse right button up gesture. - /// - IMouseSimulator RightButtonUp(); - - /// - /// Simulates a mouse right button click gesture. - /// - IMouseSimulator RightButtonClick(); - - /// - /// Simulates a mouse right button double-click gesture. - /// - IMouseSimulator RightButtonDoubleClick(); - - /// - /// Simulates a mouse X button down gesture. - /// - /// The button id. - IMouseSimulator XButtonDown(int buttonId); - - /// - /// Simulates a mouse X button up gesture. - /// - /// The button id. - IMouseSimulator XButtonUp(int buttonId); - - /// - /// Simulates a mouse X button click gesture. - /// - /// The button id. - IMouseSimulator XButtonClick(int buttonId); - - /// - /// Simulates a mouse X button double-click gesture. - /// - /// The button id. - IMouseSimulator XButtonDoubleClick(int buttonId); - - /// - /// Simulates mouse vertical wheel scroll gesture. - /// - /// The amount to scroll in clicks. A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, toward the user. - IMouseSimulator VerticalScroll(int scrollAmountInClicks); - - /// - /// Simulates a mouse horizontal wheel scroll gesture. Supported by Windows Vista and later. - /// - /// The amount to scroll in clicks. A positive value indicates that the wheel was rotated to the right; a negative value indicates that the wheel was rotated to the left. - IMouseSimulator HorizontalScroll(int scrollAmountInClicks); - - /// - /// Sleeps the executing thread to create a pause between simulated inputs. - /// - /// The number of milliseconds to wait. - IMouseSimulator Sleep(int millsecondsTimeout); - - /// - /// Sleeps the executing thread to create a pause between simulated inputs. - /// - /// The time to wait. - IMouseSimulator Sleep(TimeSpan timeout); - } -} \ No newline at end of file diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/InputBuilder.cs b/helper/win32/src/KeeWebHelper/WindowsInput/InputBuilder.cs deleted file mode 100755 index 92dbfd4a..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/InputBuilder.cs +++ /dev/null @@ -1,486 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using WindowsInput.Native; - -namespace WindowsInput -{ - /// - /// A helper class for building a list of messages ready to be sent to the native Windows API. - /// - internal class InputBuilder : IEnumerable - { - /// - /// The public list of messages being built by this instance. - /// - private readonly List _inputList; - - /// - /// Initializes a new instance of the class. - /// - public InputBuilder() - { - _inputList = new List(); - } - - /// - /// Returns the list of messages as a of messages. - /// - /// The of messages. - public INPUT[] ToArray() - { - return _inputList.ToArray(); - } - - /// - /// Returns an enumerator that iterates through the list of messages. - /// - /// - /// A that can be used to iterate through the list of messages. - /// - /// 1 - public IEnumerator GetEnumerator() - { - return _inputList.GetEnumerator(); - } - - /// - /// Returns an enumerator that iterates through the list of messages. - /// - /// - /// An object that can be used to iterate through the list of messages. - /// - /// 2 - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - /// - /// Gets the at the specified position. - /// - /// The message at the specified position. - public INPUT this[int position] - { - get - { - return _inputList[position]; - } - } - - /// - /// Determines if the is an ExtendedKey - /// - /// The key code. - /// true if the key code is an extended key; otherwise, false. - /// - /// The extended keys consist of the ALT and CTRL keys on the right-hand side of the keyboard; the INS, DEL, HOME, END, PAGE UP, PAGE DOWN, and arrow keys in the clusters to the left of the numeric keypad; the NUM LOCK key; the BREAK (CTRL+PAUSE) key; the PRINT SCRN key; and the divide (/) and ENTER keys in the numeric keypad. - /// - /// See http://msdn.microsoft.com/en-us/library/ms646267(v=vs.85).aspx Section "Extended-Key Flag" - /// - public static bool IsExtendedKey(VirtualKeyCode keyCode) - { - if (keyCode == VirtualKeyCode.MENU || - keyCode == VirtualKeyCode.LMENU || - keyCode == VirtualKeyCode.RMENU || - keyCode == VirtualKeyCode.CONTROL || - keyCode == VirtualKeyCode.RCONTROL || - keyCode == VirtualKeyCode.INSERT || - keyCode == VirtualKeyCode.DELETE || - keyCode == VirtualKeyCode.HOME || - keyCode == VirtualKeyCode.END || - keyCode == VirtualKeyCode.PRIOR || - keyCode == VirtualKeyCode.NEXT || - keyCode == VirtualKeyCode.RIGHT || - keyCode == VirtualKeyCode.UP || - keyCode == VirtualKeyCode.LEFT || - keyCode == VirtualKeyCode.DOWN || - keyCode == VirtualKeyCode.NUMLOCK || - keyCode == VirtualKeyCode.CANCEL || - keyCode == VirtualKeyCode.SNAPSHOT || - keyCode == VirtualKeyCode.DIVIDE) - { - return true; - } - else - { - return false; - } - } - - /// - /// Adds a key down to the list of messages. - /// - /// The . - /// This instance. - public InputBuilder AddKeyDown(VirtualKeyCode keyCode) - { - var down = - new INPUT - { - Type = (UInt32) InputType.Keyboard, - Data = - { - Keyboard = - new KEYBDINPUT - { - KeyCode = (UInt16) keyCode, - Scan = 0, - Flags = IsExtendedKey(keyCode) ? (UInt32) KeyboardFlag.ExtendedKey : 0, - Time = 0, - ExtraInfo = IntPtr.Zero - } - } - }; - - _inputList.Add(down); - return this; - } - - /// - /// Adds a key up to the list of messages. - /// - /// The . - /// This instance. - public InputBuilder AddKeyUp(VirtualKeyCode keyCode) - { - var up = - new INPUT - { - Type = (UInt32) InputType.Keyboard, - Data = - { - Keyboard = - new KEYBDINPUT - { - KeyCode = (UInt16) keyCode, - Scan = 0, - Flags = (UInt32) (IsExtendedKey(keyCode) - ? KeyboardFlag.KeyUp | KeyboardFlag.ExtendedKey - : KeyboardFlag.KeyUp), - Time = 0, - ExtraInfo = IntPtr.Zero - } - } - }; - - _inputList.Add(up); - return this; - } - - /// - /// Adds a key press to the list of messages which is equivalent to a key down followed by a key up. - /// - /// The . - /// This instance. - public InputBuilder AddKeyPress(VirtualKeyCode keyCode) - { - AddKeyDown(keyCode); - AddKeyUp(keyCode); - return this; - } - - /// - /// Adds the character to the list of messages. - /// - /// The to be added to the list of messages. - /// This instance. - public InputBuilder AddCharacter(char character) - { - UInt16 scanCode = character; - - var down = new INPUT - { - Type = (UInt32)InputType.Keyboard, - Data = - { - Keyboard = - new KEYBDINPUT - { - KeyCode = 0, - Scan = scanCode, - Flags = (UInt32)KeyboardFlag.Unicode, - Time = 0, - ExtraInfo = IntPtr.Zero - } - } - }; - - var up = new INPUT - { - Type = (UInt32)InputType.Keyboard, - Data = - { - Keyboard = - new KEYBDINPUT - { - KeyCode = 0, - Scan = scanCode, - Flags = - (UInt32)(KeyboardFlag.KeyUp | KeyboardFlag.Unicode), - Time = 0, - ExtraInfo = IntPtr.Zero - } - } - }; - - // Handle extended keys: - // If the scan code is preceded by a prefix byte that has the value 0xE0 (224), - // we need to include the KEYEVENTF_EXTENDEDKEY flag in the Flags property. - if ((scanCode & 0xFF00) == 0xE000) - { - down.Data.Keyboard.Flags |= (UInt32)KeyboardFlag.ExtendedKey; - up.Data.Keyboard.Flags |= (UInt32)KeyboardFlag.ExtendedKey; - } - - _inputList.Add(down); - _inputList.Add(up); - return this; - } - - /// - /// Adds all of the characters in the specified of . - /// - /// The characters to add. - /// This instance. - public InputBuilder AddCharacters(IEnumerable characters) - { - foreach (var character in characters) - { - AddCharacter(character); - } - return this; - } - - /// - /// Adds the characters in the specified . - /// - /// The string of to add. - /// This instance. - public InputBuilder AddCharacters(string characters) - { - return AddCharacters(characters.ToCharArray()); - } - - /// - /// Moves the mouse relative to its current position. - /// - /// - /// - /// This instance. - public InputBuilder AddRelativeMouseMovement(int x, int y) - { - var movement = new INPUT { Type = (UInt32)InputType.Mouse }; - movement.Data.Mouse.Flags = (UInt32)MouseFlag.Move; - movement.Data.Mouse.X = x; - movement.Data.Mouse.Y = y; - - _inputList.Add(movement); - - return this; - } - - /// - /// Move the mouse to an absolute position. - /// - /// - /// - /// This instance. - public InputBuilder AddAbsoluteMouseMovement(int absoluteX, int absoluteY) - { - var movement = new INPUT { Type = (UInt32)InputType.Mouse }; - movement.Data.Mouse.Flags = (UInt32)(MouseFlag.Move | MouseFlag.Absolute); - movement.Data.Mouse.X = absoluteX; - movement.Data.Mouse.Y = absoluteY; - - _inputList.Add(movement); - - return this; - } - - /// - /// Move the mouse to the absolute position on the virtual desktop. - /// - /// - /// - /// This instance. - public InputBuilder AddAbsoluteMouseMovementOnVirtualDesktop(int absoluteX, int absoluteY) - { - var movement = new INPUT { Type = (UInt32)InputType.Mouse }; - movement.Data.Mouse.Flags = (UInt32)(MouseFlag.Move | MouseFlag.Absolute | MouseFlag.VirtualDesk); - movement.Data.Mouse.X = absoluteX; - movement.Data.Mouse.Y = absoluteY; - - _inputList.Add(movement); - - return this; - } - - /// - /// Adds a mouse button down for the specified button. - /// - /// - /// This instance. - public InputBuilder AddMouseButtonDown(MouseButton button) - { - var buttonDown = new INPUT { Type = (UInt32)InputType.Mouse }; - buttonDown.Data.Mouse.Flags = (UInt32)ToMouseButtonDownFlag(button); - - _inputList.Add(buttonDown); - - return this; - } - - /// - /// Adds a mouse button down for the specified button. - /// - /// - /// This instance. - public InputBuilder AddMouseXButtonDown(int xButtonId) - { - var buttonDown = new INPUT { Type = (UInt32)InputType.Mouse }; - buttonDown.Data.Mouse.Flags = (UInt32)MouseFlag.XDown; - buttonDown.Data.Mouse.MouseData = (UInt32)xButtonId; - _inputList.Add(buttonDown); - - return this; - } - - /// - /// Adds a mouse button up for the specified button. - /// - /// - /// This instance. - public InputBuilder AddMouseButtonUp(MouseButton button) - { - var buttonUp = new INPUT { Type = (UInt32)InputType.Mouse }; - buttonUp.Data.Mouse.Flags = (UInt32)ToMouseButtonUpFlag(button); - _inputList.Add(buttonUp); - - return this; - } - - /// - /// Adds a mouse button up for the specified button. - /// - /// - /// This instance. - public InputBuilder AddMouseXButtonUp(int xButtonId) - { - var buttonUp = new INPUT { Type = (UInt32)InputType.Mouse }; - buttonUp.Data.Mouse.Flags = (UInt32)MouseFlag.XUp; - buttonUp.Data.Mouse.MouseData = (UInt32)xButtonId; - _inputList.Add(buttonUp); - - return this; - } - - /// - /// Adds a single click of the specified button. - /// - /// - /// This instance. - public InputBuilder AddMouseButtonClick(MouseButton button) - { - return AddMouseButtonDown(button).AddMouseButtonUp(button); - } - - /// - /// Adds a single click of the specified button. - /// - /// - /// This instance. - public InputBuilder AddMouseXButtonClick(int xButtonId) - { - return AddMouseXButtonDown(xButtonId).AddMouseXButtonUp(xButtonId); - } - - /// - /// Adds a double click of the specified button. - /// - /// - /// This instance. - public InputBuilder AddMouseButtonDoubleClick(MouseButton button) - { - return AddMouseButtonClick(button).AddMouseButtonClick(button); - } - - /// - /// Adds a double click of the specified button. - /// - /// - /// This instance. - public InputBuilder AddMouseXButtonDoubleClick(int xButtonId) - { - return AddMouseXButtonClick(xButtonId).AddMouseXButtonClick(xButtonId); - } - - /// - /// Scroll the vertical mouse wheel by the specified amount. - /// - /// - /// This instance. - public InputBuilder AddMouseVerticalWheelScroll(int scrollAmount) - { - var scroll = new INPUT { Type = (UInt32)InputType.Mouse }; - scroll.Data.Mouse.Flags = (UInt32)MouseFlag.VerticalWheel; - scroll.Data.Mouse.MouseData = (UInt32)scrollAmount; - - _inputList.Add(scroll); - - return this; - } - - /// - /// Scroll the horizontal mouse wheel by the specified amount. - /// - /// - /// This instance. - public InputBuilder AddMouseHorizontalWheelScroll(int scrollAmount) - { - var scroll = new INPUT { Type = (UInt32)InputType.Mouse }; - scroll.Data.Mouse.Flags = (UInt32)MouseFlag.HorizontalWheel; - scroll.Data.Mouse.MouseData = (UInt32)scrollAmount; - - _inputList.Add(scroll); - - return this; - } - - private static MouseFlag ToMouseButtonDownFlag(MouseButton button) - { - switch (button) - { - case MouseButton.LeftButton: - return MouseFlag.LeftDown; - - case MouseButton.MiddleButton: - return MouseFlag.MiddleDown; - - case MouseButton.RightButton: - return MouseFlag.RightDown; - - default: - return MouseFlag.LeftDown; - } - } - - private static MouseFlag ToMouseButtonUpFlag(MouseButton button) - { - switch (button) - { - case MouseButton.LeftButton: - return MouseFlag.LeftUp; - - case MouseButton.MiddleButton: - return MouseFlag.MiddleUp; - - case MouseButton.RightButton: - return MouseFlag.RightUp; - - default: - return MouseFlag.LeftUp; - } - } - } -} \ No newline at end of file diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/InputSimulator.cs b/helper/win32/src/KeeWebHelper/WindowsInput/InputSimulator.cs deleted file mode 100755 index ca051d8e..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/InputSimulator.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; - -namespace WindowsInput -{ - /// - /// Implements the interface to simulate Keyboard and Mouse input and provide the state of those input devices. - /// - public class InputSimulator : IInputSimulator - { - /// - /// The instance to use for simulating keyboard input. - /// - private readonly IKeyboardSimulator _keyboardSimulator; - - /// - /// The instance to use for simulating mouse input. - /// - private readonly IMouseSimulator _mouseSimulator; - - /// - /// The instance to use for interpreting the state of the input devices. - /// - private readonly IInputDeviceStateAdaptor _inputDeviceState; - - /// - /// Initializes a new instance of the class using the specified , and instances. - /// - /// The instance to use for simulating keyboard input. - /// The instance to use for simulating mouse input. - /// The instance to use for interpreting the state of input devices. - public InputSimulator(IKeyboardSimulator keyboardSimulator, IMouseSimulator mouseSimulator, IInputDeviceStateAdaptor inputDeviceStateAdaptor) - { - _keyboardSimulator = keyboardSimulator; - _mouseSimulator = mouseSimulator; - _inputDeviceState = inputDeviceStateAdaptor; - } - - /// - /// Initializes a new instance of the class using the default , and instances. - /// - public InputSimulator() - { - _keyboardSimulator = new KeyboardSimulator(this); - _mouseSimulator = new MouseSimulator(this); - _inputDeviceState = new WindowsInputDeviceStateAdaptor(); - } - - /// - /// Gets the instance for simulating Keyboard input. - /// - /// The instance. - public IKeyboardSimulator Keyboard - { - get { return _keyboardSimulator; } - } - - /// - /// Gets the instance for simulating Mouse input. - /// - /// The instance. - public IMouseSimulator Mouse - { - get { return _mouseSimulator; } - } - - /// - /// Gets the instance for determining the state of the various input devices. - /// - /// The instance. - public IInputDeviceStateAdaptor InputDeviceState - { - get { return _inputDeviceState; } - } - } -} \ No newline at end of file diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/KeyboardSimulator.cs b/helper/win32/src/KeeWebHelper/WindowsInput/KeyboardSimulator.cs deleted file mode 100755 index d4618d29..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/KeyboardSimulator.cs +++ /dev/null @@ -1,228 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using WindowsInput.Native; - -namespace WindowsInput -{ - /// - /// Implements the interface by calling the an to simulate Keyboard gestures. - /// - public class KeyboardSimulator : IKeyboardSimulator - { - private readonly IInputSimulator _inputSimulator; - - /// - /// The instance of the to use for dispatching messages. - /// - private readonly IInputMessageDispatcher _messageDispatcher; - - /// - /// Initializes a new instance of the class using an instance of a for dispatching messages. - /// - /// The that owns this instance. - public KeyboardSimulator(IInputSimulator inputSimulator) - { - if (inputSimulator == null) throw new ArgumentNullException("inputSimulator"); - - _inputSimulator = inputSimulator; - _messageDispatcher = new WindowsInputMessageDispatcher(); - } - - /// - /// Initializes a new instance of the class using the specified for dispatching messages. - /// - /// The that owns this instance. - /// The to use for dispatching messages. - /// If null is passed as the . - internal KeyboardSimulator(IInputSimulator inputSimulator, IInputMessageDispatcher messageDispatcher) - { - if (inputSimulator == null) throw new ArgumentNullException("inputSimulator"); - - if (messageDispatcher == null) - throw new InvalidOperationException( - string.Format("The {0} cannot operate with a null {1}. Please provide a valid {1} instance to use for dispatching {2} messages.", - typeof(KeyboardSimulator).Name, typeof(IInputMessageDispatcher).Name, typeof(INPUT).Name)); - - _inputSimulator = inputSimulator; - _messageDispatcher = messageDispatcher; - } - - /// - /// Gets the instance for simulating Mouse input. - /// - /// The instance. - public IMouseSimulator Mouse { get { return _inputSimulator.Mouse; } } - - private void ModifiersDown(InputBuilder builder, IEnumerable modifierKeyCodes) - { - if (modifierKeyCodes == null) return; - foreach (var key in modifierKeyCodes) builder.AddKeyDown(key); - } - - private void ModifiersUp(InputBuilder builder, IEnumerable modifierKeyCodes) - { - if (modifierKeyCodes == null) return; - - // Key up in reverse (I miss LINQ) - var stack = new Stack(modifierKeyCodes); - while (stack.Count > 0) builder.AddKeyUp(stack.Pop()); - } - - private void KeysPress(InputBuilder builder, IEnumerable keyCodes) - { - if (keyCodes == null) return; - foreach (var key in keyCodes) builder.AddKeyPress(key); - } - - /// - /// Sends the list of messages using the instance. - /// - /// The of messages to send. - private void SendSimulatedInput(INPUT[] inputList) - { - _messageDispatcher.DispatchInput(inputList); - } - - /// - /// Calls the Win32 SendInput method to simulate a KeyDown. - /// - /// The to press - public IKeyboardSimulator KeyDown(VirtualKeyCode keyCode) - { - var inputList = new InputBuilder().AddKeyDown(keyCode).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Calls the Win32 SendInput method to simulate a KeyUp. - /// - /// The to lift up - public IKeyboardSimulator KeyUp(VirtualKeyCode keyCode) - { - var inputList = new InputBuilder().AddKeyUp(keyCode).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Calls the Win32 SendInput method with a KeyDown and KeyUp message in the same input sequence in order to simulate a Key PRESS. - /// - /// The to press - public IKeyboardSimulator KeyPress(VirtualKeyCode keyCode) - { - var inputList = new InputBuilder().AddKeyPress(keyCode).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Simulates a key press for each of the specified key codes in the order they are specified. - /// - /// - public IKeyboardSimulator KeyPress(params VirtualKeyCode[] keyCodes) - { - var builder = new InputBuilder(); - KeysPress(builder, keyCodes); - SendSimulatedInput(builder.ToArray()); - return this; - } - - /// - /// Simulates a simple modified keystroke like CTRL-C where CTRL is the modifierKey and C is the key. - /// The flow is Modifier KeyDown, Key Press, Modifier KeyUp. - /// - /// The modifier key - /// The key to simulate - public IKeyboardSimulator ModifiedKeyStroke(VirtualKeyCode modifierKeyCode, VirtualKeyCode keyCode) - { - ModifiedKeyStroke(new[] { modifierKeyCode }, new[] { keyCode }); - return this; - } - - /// - /// Simulates a modified keystroke where there are multiple modifiers and one key like CTRL-ALT-C where CTRL and ALT are the modifierKeys and C is the key. - /// The flow is Modifiers KeyDown in order, Key Press, Modifiers KeyUp in reverse order. - /// - /// The list of modifier keys - /// The key to simulate - public IKeyboardSimulator ModifiedKeyStroke(IEnumerable modifierKeyCodes, VirtualKeyCode keyCode) - { - ModifiedKeyStroke(modifierKeyCodes, new[] {keyCode}); - return this; - } - - /// - /// Simulates a modified keystroke where there is one modifier and multiple keys like CTRL-K-C where CTRL is the modifierKey and K and C are the keys. - /// The flow is Modifier KeyDown, Keys Press in order, Modifier KeyUp. - /// - /// The modifier key - /// The list of keys to simulate - public IKeyboardSimulator ModifiedKeyStroke(VirtualKeyCode modifierKey, IEnumerable keyCodes) - { - ModifiedKeyStroke(new [] {modifierKey}, keyCodes); - return this; - } - - /// - /// Simulates a modified keystroke where there are multiple modifiers and multiple keys like CTRL-ALT-K-C where CTRL and ALT are the modifierKeys and K and C are the keys. - /// The flow is Modifiers KeyDown in order, Keys Press in order, Modifiers KeyUp in reverse order. - /// - /// The list of modifier keys - /// The list of keys to simulate - public IKeyboardSimulator ModifiedKeyStroke(IEnumerable modifierKeyCodes, IEnumerable keyCodes) - { - var builder = new InputBuilder(); - ModifiersDown(builder, modifierKeyCodes); - KeysPress(builder, keyCodes); - ModifiersUp(builder, modifierKeyCodes); - - SendSimulatedInput(builder.ToArray()); - return this; - } - - /// - /// Calls the Win32 SendInput method with a stream of KeyDown and KeyUp messages in order to simulate uninterrupted text entry via the keyboard. - /// - /// The text to be simulated. - public IKeyboardSimulator TextEntry(string text) - { - if (text.Length > UInt32.MaxValue / 2) throw new ArgumentException(string.Format("The text parameter is too long. It must be less than {0} characters.", UInt32.MaxValue / 2), "text"); - var inputList = new InputBuilder().AddCharacters(text).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Simulates a single character text entry via the keyboard. - /// - /// The unicode character to be simulated. - public IKeyboardSimulator TextEntry(char character) - { - var inputList = new InputBuilder().AddCharacter(character).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Sleeps the executing thread to create a pause between simulated inputs. - /// - /// The number of milliseconds to wait. - public IKeyboardSimulator Sleep(int millsecondsTimeout) - { - Thread.Sleep(millsecondsTimeout); - return this; - } - - /// - /// Sleeps the executing thread to create a pause between simulated inputs. - /// - /// The time to wait. - public IKeyboardSimulator Sleep(TimeSpan timeout) - { - Thread.Sleep(timeout); - return this; - } - } -} \ No newline at end of file diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/MouseButton.cs b/helper/win32/src/KeeWebHelper/WindowsInput/MouseButton.cs deleted file mode 100755 index b96ddabf..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/MouseButton.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace WindowsInput -{ - /// - /// The mouse button - /// - public enum MouseButton - { - /// - /// Left mouse button - /// - LeftButton, - - /// - /// Middle mouse button - /// - MiddleButton, - - /// - /// Right moust button - /// - RightButton, - } -} \ No newline at end of file diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/MouseSimulator.cs b/helper/win32/src/KeeWebHelper/WindowsInput/MouseSimulator.cs deleted file mode 100755 index 3ef40a01..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/MouseSimulator.cs +++ /dev/null @@ -1,270 +0,0 @@ -using System; -using System.Threading; -using WindowsInput.Native; - -namespace WindowsInput -{ - /// - /// Implements the interface by calling the an to simulate Mouse gestures. - /// - public class MouseSimulator : IMouseSimulator - { - private const int MouseWheelClickSize = 120; - - private readonly IInputSimulator _inputSimulator; - - /// - /// The instance of the to use for dispatching messages. - /// - private readonly IInputMessageDispatcher _messageDispatcher; - - /// - /// Initializes a new instance of the class using an instance of a for dispatching messages. - /// - /// The that owns this instance. - public MouseSimulator(IInputSimulator inputSimulator) - { - if (inputSimulator == null) throw new ArgumentNullException("inputSimulator"); - - _inputSimulator = inputSimulator; - _messageDispatcher = new WindowsInputMessageDispatcher(); - } - - /// - /// Initializes a new instance of the class using the specified for dispatching messages. - /// - /// The that owns this instance. - /// The to use for dispatching messages. - /// If null is passed as the . - internal MouseSimulator(IInputSimulator inputSimulator, IInputMessageDispatcher messageDispatcher) - { - if (inputSimulator == null) - throw new ArgumentNullException("inputSimulator"); - - if (messageDispatcher == null) - throw new InvalidOperationException( - string.Format("The {0} cannot operate with a null {1}. Please provide a valid {1} instance to use for dispatching {2} messages.", - typeof(MouseSimulator).Name, typeof(IInputMessageDispatcher).Name, typeof(INPUT).Name)); - - _inputSimulator = inputSimulator; - _messageDispatcher = messageDispatcher; - } - - /// - /// Gets the instance for simulating Keyboard input. - /// - /// The instance. - public IKeyboardSimulator Keyboard { get { return _inputSimulator.Keyboard; } } - - /// - /// Sends the list of messages using the instance. - /// - /// The of messages to send. - private void SendSimulatedInput(INPUT[] inputList) - { - _messageDispatcher.DispatchInput(inputList); - } - - /// - /// Simulates mouse movement by the specified distance measured as a delta from the current mouse location in pixels. - /// - /// The distance in pixels to move the mouse horizontally. - /// The distance in pixels to move the mouse vertically. - public IMouseSimulator MoveMouseBy(int pixelDeltaX, int pixelDeltaY) - { - var inputList = new InputBuilder().AddRelativeMouseMovement(pixelDeltaX, pixelDeltaY).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Simulates mouse movement to the specified location on the primary display device. - /// - /// The destination's absolute X-coordinate on the primary display device where 0 is the extreme left hand side of the display device and 65535 is the extreme right hand side of the display device. - /// The destination's absolute Y-coordinate on the primary display device where 0 is the top of the display device and 65535 is the bottom of the display device. - public IMouseSimulator MoveMouseTo(double absoluteX, double absoluteY) - { - var inputList = new InputBuilder().AddAbsoluteMouseMovement((int)Math.Truncate(absoluteX), (int)Math.Truncate(absoluteY)).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Simulates mouse movement to the specified location on the Virtual Desktop which includes all active displays. - /// - /// The destination's absolute X-coordinate on the virtual desktop where 0 is the left hand side of the virtual desktop and 65535 is the extreme right hand side of the virtual desktop. - /// The destination's absolute Y-coordinate on the virtual desktop where 0 is the top of the virtual desktop and 65535 is the bottom of the virtual desktop. - public IMouseSimulator MoveMouseToPositionOnVirtualDesktop(double absoluteX, double absoluteY) - { - var inputList = new InputBuilder().AddAbsoluteMouseMovementOnVirtualDesktop((int)Math.Truncate(absoluteX), (int)Math.Truncate(absoluteY)).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Simulates a mouse left button down gesture. - /// - public IMouseSimulator LeftButtonDown() - { - var inputList = new InputBuilder().AddMouseButtonDown(MouseButton.LeftButton).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Simulates a mouse left button up gesture. - /// - public IMouseSimulator LeftButtonUp() - { - var inputList = new InputBuilder().AddMouseButtonUp(MouseButton.LeftButton).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Simulates a mouse left-click gesture. - /// - public IMouseSimulator LeftButtonClick() - { - var inputList = new InputBuilder().AddMouseButtonClick(MouseButton.LeftButton).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Simulates a mouse left button double-click gesture. - /// - public IMouseSimulator LeftButtonDoubleClick() - { - var inputList = new InputBuilder().AddMouseButtonDoubleClick(MouseButton.LeftButton).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Simulates a mouse right button down gesture. - /// - public IMouseSimulator RightButtonDown() - { - var inputList = new InputBuilder().AddMouseButtonDown(MouseButton.RightButton).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Simulates a mouse right button up gesture. - /// - public IMouseSimulator RightButtonUp() - { - var inputList = new InputBuilder().AddMouseButtonUp(MouseButton.RightButton).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Simulates a mouse right button click gesture. - /// - public IMouseSimulator RightButtonClick() - { - var inputList = new InputBuilder().AddMouseButtonClick(MouseButton.RightButton).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Simulates a mouse right button double-click gesture. - /// - public IMouseSimulator RightButtonDoubleClick() - { - var inputList = new InputBuilder().AddMouseButtonDoubleClick(MouseButton.RightButton).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Simulates a mouse X button down gesture. - /// - /// The button id. - public IMouseSimulator XButtonDown(int buttonId) - { - var inputList = new InputBuilder().AddMouseXButtonDown(buttonId).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Simulates a mouse X button up gesture. - /// - /// The button id. - public IMouseSimulator XButtonUp(int buttonId) - { - var inputList = new InputBuilder().AddMouseXButtonUp(buttonId).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Simulates a mouse X button click gesture. - /// - /// The button id. - public IMouseSimulator XButtonClick(int buttonId) - { - var inputList = new InputBuilder().AddMouseXButtonClick(buttonId).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Simulates a mouse X button double-click gesture. - /// - /// The button id. - public IMouseSimulator XButtonDoubleClick(int buttonId) - { - var inputList = new InputBuilder().AddMouseXButtonDoubleClick(buttonId).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Simulates mouse vertical wheel scroll gesture. - /// - /// The amount to scroll in clicks. A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, toward the user. - public IMouseSimulator VerticalScroll(int scrollAmountInClicks) - { - var inputList = new InputBuilder().AddMouseVerticalWheelScroll(scrollAmountInClicks * MouseWheelClickSize).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Simulates a mouse horizontal wheel scroll gesture. Supported by Windows Vista and later. - /// - /// The amount to scroll in clicks. A positive value indicates that the wheel was rotated to the right; a negative value indicates that the wheel was rotated to the left. - public IMouseSimulator HorizontalScroll(int scrollAmountInClicks) - { - var inputList = new InputBuilder().AddMouseHorizontalWheelScroll(scrollAmountInClicks * MouseWheelClickSize).ToArray(); - SendSimulatedInput(inputList); - return this; - } - - /// - /// Sleeps the executing thread to create a pause between simulated inputs. - /// - /// The number of milliseconds to wait. - public IMouseSimulator Sleep(int millsecondsTimeout) - { - Thread.Sleep(millsecondsTimeout); - return this; - } - - /// - /// Sleeps the executing thread to create a pause between simulated inputs. - /// - /// The time to wait. - public IMouseSimulator Sleep(TimeSpan timeout) - { - Thread.Sleep(timeout); - return this; - } - } -} \ No newline at end of file diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/Native/HARDWAREINPUT.cs b/helper/win32/src/KeeWebHelper/WindowsInput/Native/HARDWAREINPUT.cs deleted file mode 100755 index de621d5b..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/Native/HARDWAREINPUT.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -namespace WindowsInput.Native -{ -#pragma warning disable 649 - /// - /// The HARDWAREINPUT structure contains information about a simulated message generated by an input device other than a keyboard or mouse. (see: http://msdn.microsoft.com/en-us/library/ms646269(VS.85).aspx) - /// Declared in Winuser.h, include Windows.h - /// - internal struct HARDWAREINPUT - { - /// - /// Value specifying the message generated by the input hardware. - /// - public UInt32 Msg; - - /// - /// Specifies the low-order word of the lParam parameter for uMsg. - /// - public UInt16 ParamL; - - /// - /// Specifies the high-order word of the lParam parameter for uMsg. - /// - public UInt16 ParamH; - } -#pragma warning restore 649 -} diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/Native/INPUT.cs b/helper/win32/src/KeeWebHelper/WindowsInput/Native/INPUT.cs deleted file mode 100755 index 10ef88ae..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/Native/INPUT.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; - -namespace WindowsInput.Native -{ -#pragma warning disable 649 - /// - /// The INPUT structure is used by SendInput to store information for synthesizing input events such as keystrokes, mouse movement, and mouse clicks. (see: http://msdn.microsoft.com/en-us/library/ms646270(VS.85).aspx) - /// Declared in Winuser.h, include Windows.h - /// - /// - /// This structure contains information identical to that used in the parameter list of the keybd_event or mouse_event function. - /// Windows 2000/XP: INPUT_KEYBOARD supports nonkeyboard input methods, such as handwriting recognition or voice recognition, as if it were text input by using the KEYEVENTF_UNICODE flag. For more information, see the remarks section of KEYBDINPUT. - /// - internal struct INPUT - { - /// - /// Specifies the type of the input event. This member can be one of the following values. - /// - The event is a mouse event. Use the mi structure of the union. - /// - The event is a keyboard event. Use the ki structure of the union. - /// - Windows 95/98/Me: The event is from input hardware other than a keyboard or mouse. Use the hi structure of the union. - /// - public UInt32 Type; - - /// - /// The data structure that contains information about the simulated Mouse, Keyboard or Hardware event. - /// - public MOUSEKEYBDHARDWAREINPUT Data; - } -#pragma warning restore 649 -} diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/Native/InputType.cs b/helper/win32/src/KeeWebHelper/WindowsInput/Native/InputType.cs deleted file mode 100755 index 231b3626..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/Native/InputType.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace WindowsInput.Native -{ - /// - /// Specifies the type of the input event. This member can be one of the following values. - /// - internal enum InputType : uint // UInt32 - { - /// - /// INPUT_MOUSE = 0x00 (The event is a mouse event. Use the mi structure of the union.) - /// - Mouse = 0, - - /// - /// INPUT_KEYBOARD = 0x01 (The event is a keyboard event. Use the ki structure of the union.) - /// - Keyboard = 1, - - /// - /// INPUT_HARDWARE = 0x02 (Windows 95/98/Me: The event is from input hardware other than a keyboard or mouse. Use the hi structure of the union.) - /// - Hardware = 2, - } -} diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/Native/KEYBDINPUT.cs b/helper/win32/src/KeeWebHelper/WindowsInput/Native/KEYBDINPUT.cs deleted file mode 100755 index 03a4097f..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/Native/KEYBDINPUT.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; - -namespace WindowsInput.Native -{ -#pragma warning disable 649 - /// - /// The KEYBDINPUT structure contains information about a simulated keyboard event. (see: http://msdn.microsoft.com/en-us/library/ms646271(VS.85).aspx) - /// Declared in Winuser.h, include Windows.h - /// - /// - /// Windows 2000/XP: INPUT_KEYBOARD supports nonkeyboard-input methods—such as handwriting recognition or voice recognition—as if it were text input by using the KEYEVENTF_UNICODE flag. If KEYEVENTF_UNICODE is specified, SendInput sends a WM_KEYDOWN or WM_KEYUP message to the foreground thread's message queue with wParam equal to VK_PACKET. Once GetMessage or PeekMessage obtains this message, passing the message to TranslateMessage posts a WM_CHAR message with the Unicode character originally specified by wScan. This Unicode character will automatically be converted to the appropriate ANSI value if it is posted to an ANSI window. - /// Windows 2000/XP: Set the KEYEVENTF_SCANCODE flag to define keyboard input in terms of the scan code. This is useful to simulate a physical keystroke regardless of which keyboard is currently being used. The virtual key value of a key may alter depending on the current keyboard layout or what other keys were pressed, but the scan code will always be the same. - /// - internal struct KEYBDINPUT - { - /// - /// Specifies a virtual-key code. The code must be a value in the range 1 to 254. The Winuser.h header file provides macro definitions (VK_*) for each value. If the dwFlags member specifies KEYEVENTF_UNICODE, wVk must be 0. - /// - public UInt16 KeyCode; - - /// - /// Specifies a hardware scan code for the key. If dwFlags specifies KEYEVENTF_UNICODE, wScan specifies a Unicode character which is to be sent to the foreground application. - /// - public UInt16 Scan; - - /// - /// Specifies various aspects of a keystroke. This member can be certain combinations of the following values. - /// KEYEVENTF_EXTENDEDKEY - If specified, the scan code was preceded by a prefix byte that has the value 0xE0 (224). - /// KEYEVENTF_KEYUP - If specified, the key is being released. If not specified, the key is being pressed. - /// KEYEVENTF_SCANCODE - If specified, wScan identifies the key and wVk is ignored. - /// KEYEVENTF_UNICODE - Windows 2000/XP: If specified, the system synthesizes a VK_PACKET keystroke. The wVk parameter must be zero. This flag can only be combined with the KEYEVENTF_KEYUP flag. For more information, see the Remarks section. - /// - public UInt32 Flags; - - /// - /// Time stamp for the event, in milliseconds. If this parameter is zero, the system will provide its own time stamp. - /// - public UInt32 Time; - - /// - /// Specifies an additional value associated with the keystroke. Use the GetMessageExtraInfo function to obtain this information. - /// - public IntPtr ExtraInfo; - } -#pragma warning restore 649 -} diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/Native/KeyboardFlag.cs b/helper/win32/src/KeeWebHelper/WindowsInput/Native/KeyboardFlag.cs deleted file mode 100755 index f2707882..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/Native/KeyboardFlag.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; - -namespace WindowsInput.Native -{ - /// - /// Specifies various aspects of a keystroke. This member can be certain combinations of the following values. - /// - [Flags] - internal enum KeyboardFlag : uint // UInt32 - { - /// - /// KEYEVENTF_EXTENDEDKEY = 0x0001 (If specified, the scan code was preceded by a prefix byte that has the value 0xE0 (224).) - /// - ExtendedKey = 0x0001, - - /// - /// KEYEVENTF_KEYUP = 0x0002 (If specified, the key is being released. If not specified, the key is being pressed.) - /// - KeyUp = 0x0002, - - /// - /// KEYEVENTF_UNICODE = 0x0004 (If specified, wScan identifies the key and wVk is ignored.) - /// - Unicode = 0x0004, - - /// - /// KEYEVENTF_SCANCODE = 0x0008 (Windows 2000/XP: If specified, the system synthesizes a VK_PACKET keystroke. The wVk parameter must be zero. This flag can only be combined with the KEYEVENTF_KEYUP flag. For more information, see the Remarks section.) - /// - ScanCode = 0x0008, - } -} diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/Native/MOUSEINPUT.cs b/helper/win32/src/KeeWebHelper/WindowsInput/Native/MOUSEINPUT.cs deleted file mode 100755 index 496ff0a8..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/Native/MOUSEINPUT.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; - -namespace WindowsInput.Native -{ -#pragma warning disable 649 - /// - /// The MOUSEINPUT structure contains information about a simulated mouse event. (see: http://msdn.microsoft.com/en-us/library/ms646273(VS.85).aspx) - /// Declared in Winuser.h, include Windows.h - /// - /// - /// If the mouse has moved, indicated by MOUSEEVENTF_MOVE, dx and dy specify information about that movement. The information is specified as absolute or relative integer values. - /// If MOUSEEVENTF_ABSOLUTE value is specified, dx and dy contain normalized absolute coordinates between 0 and 65,535. The event procedure maps these coordinates onto the display surface. Coordinate (0,0) maps onto the upper-left corner of the display surface; coordinate (65535,65535) maps onto the lower-right corner. In a multimonitor system, the coordinates map to the primary monitor. - /// Windows 2000/XP: If MOUSEEVENTF_VIRTUALDESK is specified, the coordinates map to the entire virtual desktop. - /// If the MOUSEEVENTF_ABSOLUTE value is not specified, dx and dy specify movement relative to the previous mouse event (the last reported position). Positive values mean the mouse moved right (or down); negative values mean the mouse moved left (or up). - /// Relative mouse motion is subject to the effects of the mouse speed and the two-mouse threshold values. A user sets these three values with the Pointer Speed slider of the Control Panel's Mouse Properties sheet. You can obtain and set these values using the SystemParametersInfo function. - /// The system applies two tests to the specified relative mouse movement. If the specified distance along either the x or y axis is greater than the first mouse threshold value, and the mouse speed is not zero, the system doubles the distance. If the specified distance along either the x or y axis is greater than the second mouse threshold value, and the mouse speed is equal to two, the system doubles the distance that resulted from applying the first threshold test. It is thus possible for the system to multiply specified relative mouse movement along the x or y axis by up to four times. - /// - internal struct MOUSEINPUT - { - /// - /// Specifies the absolute position of the mouse, or the amount of motion since the last mouse event was generated, depending on the value of the dwFlags member. Absolute data is specified as the x coordinate of the mouse; relative data is specified as the number of pixels moved. - /// - public Int32 X; - - /// - /// Specifies the absolute position of the mouse, or the amount of motion since the last mouse event was generated, depending on the value of the dwFlags member. Absolute data is specified as the y coordinate of the mouse; relative data is specified as the number of pixels moved. - /// - public Int32 Y; - - /// - /// If dwFlags contains MOUSEEVENTF_WHEEL, then mouseData specifies the amount of wheel movement. A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, toward the user. One wheel click is defined as WHEEL_DELTA, which is 120. - /// Windows Vista: If dwFlags contains MOUSEEVENTF_HWHEEL, then dwData specifies the amount of wheel movement. A positive value indicates that the wheel was rotated to the right; a negative value indicates that the wheel was rotated to the left. One wheel click is defined as WHEEL_DELTA, which is 120. - /// Windows 2000/XP: IfdwFlags does not contain MOUSEEVENTF_WHEEL, MOUSEEVENTF_XDOWN, or MOUSEEVENTF_XUP, then mouseData should be zero. - /// If dwFlags contains MOUSEEVENTF_XDOWN or MOUSEEVENTF_XUP, then mouseData specifies which X buttons were pressed or released. This value may be any combination of the following flags. - /// - public UInt32 MouseData; - - /// - /// A set of bit flags that specify various aspects of mouse motion and button clicks. The bits in this member can be any reasonable combination of the following values. - /// The bit flags that specify mouse button status are set to indicate changes in status, not ongoing conditions. For example, if the left mouse button is pressed and held down, MOUSEEVENTF_LEFTDOWN is set when the left button is first pressed, but not for subsequent motions. Similarly, MOUSEEVENTF_LEFTUP is set only when the button is first released. - /// You cannot specify both the MOUSEEVENTF_WHEEL flag and either MOUSEEVENTF_XDOWN or MOUSEEVENTF_XUP flags simultaneously in the dwFlags parameter, because they both require use of the mouseData field. - /// - public UInt32 Flags; - - /// - /// Time stamp for the event, in milliseconds. If this parameter is 0, the system will provide its own time stamp. - /// - public UInt32 Time; - - /// - /// Specifies an additional value associated with the mouse event. An application calls GetMessageExtraInfo to obtain this extra information. - /// - public IntPtr ExtraInfo; - } -#pragma warning restore 649 -} \ No newline at end of file diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/Native/MOUSEKEYBDHARDWAREINPUT.cs b/helper/win32/src/KeeWebHelper/WindowsInput/Native/MOUSEKEYBDHARDWAREINPUT.cs deleted file mode 100755 index 0700f8e5..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/Native/MOUSEKEYBDHARDWAREINPUT.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Runtime.InteropServices; - -namespace WindowsInput.Native -{ -#pragma warning disable 649 - /// - /// The combined/overlayed structure that includes Mouse, Keyboard and Hardware Input message data (see: http://msdn.microsoft.com/en-us/library/ms646270(VS.85).aspx) - /// - [StructLayout(LayoutKind.Explicit)] - internal struct MOUSEKEYBDHARDWAREINPUT - { - /// - /// The definition. - /// - [FieldOffset(0)] - public MOUSEINPUT Mouse; - - /// - /// The definition. - /// - [FieldOffset(0)] - public KEYBDINPUT Keyboard; - - /// - /// The definition. - /// - [FieldOffset(0)] - public HARDWAREINPUT Hardware; - } -#pragma warning restore 649 -} diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/Native/MouseFlag.cs b/helper/win32/src/KeeWebHelper/WindowsInput/Native/MouseFlag.cs deleted file mode 100755 index f86b1d1d..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/Native/MouseFlag.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; - -namespace WindowsInput.Native -{ - /// - /// The set of MouseFlags for use in the Flags property of the structure. (See: http://msdn.microsoft.com/en-us/library/ms646273(VS.85).aspx) - /// - [Flags] - internal enum MouseFlag : uint // UInt32 - { - /// - /// Specifies that movement occurred. - /// - Move = 0x0001, - - /// - /// Specifies that the left button was pressed. - /// - LeftDown = 0x0002, - - /// - /// Specifies that the left button was released. - /// - LeftUp = 0x0004, - - /// - /// Specifies that the right button was pressed. - /// - RightDown = 0x0008, - - /// - /// Specifies that the right button was released. - /// - RightUp = 0x0010, - - /// - /// Specifies that the middle button was pressed. - /// - MiddleDown = 0x0020, - - /// - /// Specifies that the middle button was released. - /// - MiddleUp = 0x0040, - - /// - /// Windows 2000/XP: Specifies that an X button was pressed. - /// - XDown = 0x0080, - - /// - /// Windows 2000/XP: Specifies that an X button was released. - /// - XUp = 0x0100, - - /// - /// Windows NT/2000/XP: Specifies that the wheel was moved, if the mouse has a wheel. The amount of movement is specified in mouseData. - /// - VerticalWheel = 0x0800, - - /// - /// Specifies that the wheel was moved horizontally, if the mouse has a wheel. The amount of movement is specified in mouseData. Windows 2000/XP: Not supported. - /// - HorizontalWheel = 0x1000, - - /// - /// Windows 2000/XP: Maps coordinates to the entire desktop. Must be used with MOUSEEVENTF_ABSOLUTE. - /// - VirtualDesk = 0x4000, - - /// - /// Specifies that the dx and dy members contain normalized absolute coordinates. If the flag is not set, dxand dy contain relative data (the change in position since the last reported position). This flag can be set, or not set, regardless of what kind of mouse or other pointing device, if any, is connected to the system. For further information about relative mouse motion, see the following Remarks section. - /// - Absolute = 0x8000, - } -} diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/Native/NativeMethods.cs b/helper/win32/src/KeeWebHelper/WindowsInput/Native/NativeMethods.cs deleted file mode 100755 index eeb85286..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/Native/NativeMethods.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -namespace WindowsInput.Native -{ - /// - /// References all of the Native Windows API methods for the WindowsInput functionality. - /// - internal static class NativeMethods - { - /// - /// The GetAsyncKeyState function determines whether a key is up or down at the time the function is called, and whether the key was pressed after a previous call to GetAsyncKeyState. (See: http://msdn.microsoft.com/en-us/library/ms646293(VS.85).aspx) - /// - /// Specifies one of 256 possible virtual-key codes. For more information, see Virtual Key Codes. Windows NT/2000/XP: You can use left- and right-distinguishing constants to specify certain keys. See the Remarks section for further information. - /// - /// If the function succeeds, the return value specifies whether the key was pressed since the last call to GetAsyncKeyState, and whether the key is currently up or down. If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState. However, you should not rely on this last behavior; for more information, see the Remarks. - /// - /// Windows NT/2000/XP: The return value is zero for the following cases: - /// - The current desktop is not the active desktop - /// - The foreground thread belongs to another process and the desktop does not allow the hook or the journal record. - /// - /// Windows 95/98/Me: The return value is the global asynchronous key state for each virtual key. The system does not check which thread has the keyboard focus. - /// - /// Windows 95/98/Me: Windows 95 does not support the left- and right-distinguishing constants. If you call GetAsyncKeyState with these constants, the return value is zero. - /// - /// - /// The GetAsyncKeyState function works with mouse buttons. However, it checks on the state of the physical mouse buttons, not on the logical mouse buttons that the physical buttons are mapped to. For example, the call GetAsyncKeyState(VK_LBUTTON) always returns the state of the left physical mouse button, regardless of whether it is mapped to the left or right logical mouse button. You can determine the system's current mapping of physical mouse buttons to logical mouse buttons by calling - /// Copy CodeGetSystemMetrics(SM_SWAPBUTTON) which returns TRUE if the mouse buttons have been swapped. - /// - /// Although the least significant bit of the return value indicates whether the key has been pressed since the last query, due to the pre-emptive multitasking nature of Windows, another application can call GetAsyncKeyState and receive the "recently pressed" bit instead of your application. The behavior of the least significant bit of the return value is retained strictly for compatibility with 16-bit Windows applications (which are non-preemptive) and should not be relied upon. - /// - /// You can use the virtual-key code constants VK_SHIFT, VK_CONTROL, and VK_MENU as values for the vKey parameter. This gives the state of the SHIFT, CTRL, or ALT keys without distinguishing between left and right. - /// - /// Windows NT/2000/XP: You can use the following virtual-key code constants as values for vKey to distinguish between the left and right instances of those keys. - /// - /// Code Meaning - /// VK_LSHIFT Left-shift key. - /// VK_RSHIFT Right-shift key. - /// VK_LCONTROL Left-control key. - /// VK_RCONTROL Right-control key. - /// VK_LMENU Left-menu key. - /// VK_RMENU Right-menu key. - /// - /// These left- and right-distinguishing constants are only available when you call the GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState, and MapVirtualKey functions. - /// - [DllImport("user32.dll", SetLastError = true)] - public static extern Int16 GetAsyncKeyState(UInt16 virtualKeyCode); - - /// - /// The GetKeyState function retrieves the status of the specified virtual key. The status specifies whether the key is up, down, or toggled (on, off alternating each time the key is pressed). (See: http://msdn.microsoft.com/en-us/library/ms646301(VS.85).aspx) - /// - /// - /// Specifies a virtual key. If the desired virtual key is a letter or digit (A through Z, a through z, or 0 through 9), nVirtKey must be set to the ASCII value of that character. For other keys, it must be a virtual-key code. - /// If a non-English keyboard layout is used, virtual keys with values in the range ASCII A through Z and 0 through 9 are used to specify most of the character keys. For example, for the German keyboard layout, the virtual key of value ASCII O (0x4F) refers to the "o" key, whereas VK_OEM_1 refers to the "o with umlaut" key. - /// - /// - /// The return value specifies the status of the specified virtual key, as follows: - /// If the high-order bit is 1, the key is down; otherwise, it is up. - /// If the low-order bit is 1, the key is toggled. A key, such as the CAPS LOCK key, is toggled if it is turned on. The key is off and untoggled if the low-order bit is 0. A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled. - /// - /// - /// The key status returned from this function changes as a thread reads key messages from its message queue. The status does not reflect the interrupt-level state associated with the hardware. Use the GetAsyncKeyState function to retrieve that information. - /// An application calls GetKeyState in response to a keyboard-input message. This function retrieves the state of the key when the input message was generated. - /// To retrieve state information for all the virtual keys, use the GetKeyboardState function. - /// An application can use the virtual-key code constants VK_SHIFT, VK_CONTROL, and VK_MENU as values for the nVirtKey parameter. This gives the status of the SHIFT, CTRL, or ALT keys without distinguishing between left and right. An application can also use the following virtual-key code constants as values for nVirtKey to distinguish between the left and right instances of those keys. - /// VK_LSHIFT - /// VK_RSHIFT - /// VK_LCONTROL - /// VK_RCONTROL - /// VK_LMENU - /// VK_RMENU - /// - /// These left- and right-distinguishing constants are available to an application only through the GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState, and MapVirtualKey functions. - /// - [DllImport("user32.dll", SetLastError = true)] - public static extern Int16 GetKeyState(UInt16 virtualKeyCode); - - /// - /// The SendInput function synthesizes keystrokes, mouse motions, and button clicks. - /// - /// Number of structures in the Inputs array. - /// Pointer to an array of INPUT structures. Each structure represents an event to be inserted into the keyboard or mouse input stream. - /// Specifies the size, in bytes, of an INPUT structure. If cbSize is not the size of an INPUT structure, the function fails. - /// The function returns the number of events that it successfully inserted into the keyboard or mouse input stream. If the function returns zero, the input was already blocked by another thread. To get extended error information, call GetLastError.Microsoft Windows Vista. This function fails when it is blocked by User Interface Privilege Isolation (UIPI). Note that neither GetLastError nor the return value will indicate the failure was caused by UIPI blocking. - /// - /// Microsoft Windows Vista. This function is subject to UIPI. Applications are permitted to inject input only into applications that are at an equal or lesser integrity level. - /// The SendInput function inserts the events in the INPUT structures serially into the keyboard or mouse input stream. These events are not interspersed with other keyboard or mouse input events inserted either by the user (with the keyboard or mouse) or by calls to keybd_event, mouse_event, or other calls to SendInput. - /// This function does not reset the keyboard's current state. Any keys that are already pressed when the function is called might interfere with the events that this function generates. To avoid this problem, check the keyboard's state with the GetAsyncKeyState function and correct as necessary. - /// - [DllImport("user32.dll", SetLastError = true)] - public static extern UInt32 SendInput(UInt32 numberOfInputs, INPUT[] inputs, Int32 sizeOfInputStructure); - - /// - /// The GetMessageExtraInfo function retrieves the extra message information for the current thread. Extra message information is an application- or driver-defined value associated with the current thread's message queue. - /// - /// - /// To set a thread's extra message information, use the SetMessageExtraInfo function. - [DllImport("user32.dll")] - public static extern IntPtr GetMessageExtraInfo(); - } -} \ No newline at end of file diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/Native/VirtualKeyCode.cs b/helper/win32/src/KeeWebHelper/WindowsInput/Native/VirtualKeyCode.cs deleted file mode 100755 index 269e0a41..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/Native/VirtualKeyCode.cs +++ /dev/null @@ -1,939 +0,0 @@ -namespace WindowsInput.Native -{ - /// - /// The list of VirtualKeyCodes (see: http://msdn.microsoft.com/en-us/library/ms645540(VS.85).aspx) - /// - public enum VirtualKeyCode //: UInt16 - { - /// - /// Left mouse button - /// - LBUTTON = 0x01, - - /// - /// Right mouse button - /// - RBUTTON = 0x02, - - /// - /// Control-break processing - /// - CANCEL = 0x03, - - /// - /// Middle mouse button (three-button mouse) - NOT contiguous with LBUTTON and RBUTTON - /// - MBUTTON = 0x04, - - /// - /// Windows 2000/XP: X1 mouse button - NOT contiguous with LBUTTON and RBUTTON - /// - XBUTTON1 = 0x05, - - /// - /// Windows 2000/XP: X2 mouse button - NOT contiguous with LBUTTON and RBUTTON - /// - XBUTTON2 = 0x06, - - // 0x07 : Undefined - - /// - /// BACKSPACE key - /// - BACK = 0x08, - - /// - /// TAB key - /// - TAB = 0x09, - - // 0x0A - 0x0B : Reserved - - /// - /// CLEAR key - /// - CLEAR = 0x0C, - - /// - /// ENTER key - /// - RETURN = 0x0D, - - // 0x0E - 0x0F : Undefined - - /// - /// SHIFT key - /// - SHIFT = 0x10, - - /// - /// CTRL key - /// - CONTROL = 0x11, - - /// - /// ALT key - /// - MENU = 0x12, - - /// - /// PAUSE key - /// - PAUSE = 0x13, - - /// - /// CAPS LOCK key - /// - CAPITAL = 0x14, - - /// - /// Input Method Editor (IME) Kana mode - /// - KANA = 0x15, - - /// - /// IME Hanguel mode (maintained for compatibility; use HANGUL) - /// - HANGEUL = 0x15, - - /// - /// IME Hangul mode - /// - HANGUL = 0x15, - - // 0x16 : Undefined - - /// - /// IME Junja mode - /// - JUNJA = 0x17, - - /// - /// IME final mode - /// - FINAL = 0x18, - - /// - /// IME Hanja mode - /// - HANJA = 0x19, - - /// - /// IME Kanji mode - /// - KANJI = 0x19, - - // 0x1A : Undefined - - /// - /// ESC key - /// - ESCAPE = 0x1B, - - /// - /// IME convert - /// - CONVERT = 0x1C, - - /// - /// IME nonconvert - /// - NONCONVERT = 0x1D, - - /// - /// IME accept - /// - ACCEPT = 0x1E, - - /// - /// IME mode change request - /// - MODECHANGE = 0x1F, - - /// - /// SPACEBAR - /// - SPACE = 0x20, - - /// - /// PAGE UP key - /// - PRIOR = 0x21, - - /// - /// PAGE DOWN key - /// - NEXT = 0x22, - - /// - /// END key - /// - END = 0x23, - - /// - /// HOME key - /// - HOME = 0x24, - - /// - /// LEFT ARROW key - /// - LEFT = 0x25, - - /// - /// UP ARROW key - /// - UP = 0x26, - - /// - /// RIGHT ARROW key - /// - RIGHT = 0x27, - - /// - /// DOWN ARROW key - /// - DOWN = 0x28, - - /// - /// SELECT key - /// - SELECT = 0x29, - - /// - /// PRINT key - /// - PRINT = 0x2A, - - /// - /// EXECUTE key - /// - EXECUTE = 0x2B, - - /// - /// PRINT SCREEN key - /// - SNAPSHOT = 0x2C, - - /// - /// INS key - /// - INSERT = 0x2D, - - /// - /// DEL key - /// - DELETE = 0x2E, - - /// - /// HELP key - /// - HELP = 0x2F, - - /// - /// 0 key - /// - VK_0 = 0x30, - - /// - /// 1 key - /// - VK_1 = 0x31, - - /// - /// 2 key - /// - VK_2 = 0x32, - - /// - /// 3 key - /// - VK_3 = 0x33, - - /// - /// 4 key - /// - VK_4 = 0x34, - - /// - /// 5 key - /// - VK_5 = 0x35, - - /// - /// 6 key - /// - VK_6 = 0x36, - - /// - /// 7 key - /// - VK_7 = 0x37, - - /// - /// 8 key - /// - VK_8 = 0x38, - - /// - /// 9 key - /// - VK_9 = 0x39, - - // - // 0x3A - 0x40 : Udefined - // - - /// - /// A key - /// - VK_A = 0x41, - - /// - /// B key - /// - VK_B = 0x42, - - /// - /// C key - /// - VK_C = 0x43, - - /// - /// D key - /// - VK_D = 0x44, - - /// - /// E key - /// - VK_E = 0x45, - - /// - /// F key - /// - VK_F = 0x46, - - /// - /// G key - /// - VK_G = 0x47, - - /// - /// H key - /// - VK_H = 0x48, - - /// - /// I key - /// - VK_I = 0x49, - - /// - /// J key - /// - VK_J = 0x4A, - - /// - /// K key - /// - VK_K = 0x4B, - - /// - /// L key - /// - VK_L = 0x4C, - - /// - /// M key - /// - VK_M = 0x4D, - - /// - /// N key - /// - VK_N = 0x4E, - - /// - /// O key - /// - VK_O = 0x4F, - - /// - /// P key - /// - VK_P = 0x50, - - /// - /// Q key - /// - VK_Q = 0x51, - - /// - /// R key - /// - VK_R = 0x52, - - /// - /// S key - /// - VK_S = 0x53, - - /// - /// T key - /// - VK_T = 0x54, - - /// - /// U key - /// - VK_U = 0x55, - - /// - /// V key - /// - VK_V = 0x56, - - /// - /// W key - /// - VK_W = 0x57, - - /// - /// X key - /// - VK_X = 0x58, - - /// - /// Y key - /// - VK_Y = 0x59, - - /// - /// Z key - /// - VK_Z = 0x5A, - - /// - /// Left Windows key (Microsoft Natural keyboard) - /// - LWIN = 0x5B, - - /// - /// Right Windows key (Natural keyboard) - /// - RWIN = 0x5C, - - /// - /// Applications key (Natural keyboard) - /// - APPS = 0x5D, - - // 0x5E : reserved - - /// - /// Computer Sleep key - /// - SLEEP = 0x5F, - - /// - /// Numeric keypad 0 key - /// - NUMPAD0 = 0x60, - - /// - /// Numeric keypad 1 key - /// - NUMPAD1 = 0x61, - - /// - /// Numeric keypad 2 key - /// - NUMPAD2 = 0x62, - - /// - /// Numeric keypad 3 key - /// - NUMPAD3 = 0x63, - - /// - /// Numeric keypad 4 key - /// - NUMPAD4 = 0x64, - - /// - /// Numeric keypad 5 key - /// - NUMPAD5 = 0x65, - - /// - /// Numeric keypad 6 key - /// - NUMPAD6 = 0x66, - - /// - /// Numeric keypad 7 key - /// - NUMPAD7 = 0x67, - - /// - /// Numeric keypad 8 key - /// - NUMPAD8 = 0x68, - - /// - /// Numeric keypad 9 key - /// - NUMPAD9 = 0x69, - - /// - /// Multiply key - /// - MULTIPLY = 0x6A, - - /// - /// Add key - /// - ADD = 0x6B, - - /// - /// Separator key - /// - SEPARATOR = 0x6C, - - /// - /// Subtract key - /// - SUBTRACT = 0x6D, - - /// - /// Decimal key - /// - DECIMAL = 0x6E, - - /// - /// Divide key - /// - DIVIDE = 0x6F, - - /// - /// F1 key - /// - F1 = 0x70, - - /// - /// F2 key - /// - F2 = 0x71, - - /// - /// F3 key - /// - F3 = 0x72, - - /// - /// F4 key - /// - F4 = 0x73, - - /// - /// F5 key - /// - F5 = 0x74, - - /// - /// F6 key - /// - F6 = 0x75, - - /// - /// F7 key - /// - F7 = 0x76, - - /// - /// F8 key - /// - F8 = 0x77, - - /// - /// F9 key - /// - F9 = 0x78, - - /// - /// F10 key - /// - F10 = 0x79, - - /// - /// F11 key - /// - F11 = 0x7A, - - /// - /// F12 key - /// - F12 = 0x7B, - - /// - /// F13 key - /// - F13 = 0x7C, - - /// - /// F14 key - /// - F14 = 0x7D, - - /// - /// F15 key - /// - F15 = 0x7E, - - /// - /// F16 key - /// - F16 = 0x7F, - - /// - /// F17 key - /// - F17 = 0x80, - - /// - /// F18 key - /// - F18 = 0x81, - - /// - /// F19 key - /// - F19 = 0x82, - - /// - /// F20 key - /// - F20 = 0x83, - - /// - /// F21 key - /// - F21 = 0x84, - - /// - /// F22 key - /// - F22 = 0x85, - - /// - /// F23 key - /// - F23 = 0x86, - - /// - /// F24 key - /// - F24 = 0x87, - - // - // 0x88 - 0x8F : Unassigned - // - - /// - /// NUM LOCK key - /// - NUMLOCK = 0x90, - - /// - /// SCROLL LOCK key - /// - SCROLL = 0x91, - - // 0x92 - 0x96 : OEM Specific - - // 0x97 - 0x9F : Unassigned - - // - // L* & R* - left and right Alt, Ctrl and Shift virtual keys. - // Used only as parameters to GetAsyncKeyState() and GetKeyState(). - // No other API or message will distinguish left and right keys in this way. - // - - /// - /// Left SHIFT key - Used only as parameters to GetAsyncKeyState() and GetKeyState() - /// - LSHIFT = 0xA0, - - /// - /// Right SHIFT key - Used only as parameters to GetAsyncKeyState() and GetKeyState() - /// - RSHIFT = 0xA1, - - /// - /// Left CONTROL key - Used only as parameters to GetAsyncKeyState() and GetKeyState() - /// - LCONTROL = 0xA2, - - /// - /// Right CONTROL key - Used only as parameters to GetAsyncKeyState() and GetKeyState() - /// - RCONTROL = 0xA3, - - /// - /// Left MENU key - Used only as parameters to GetAsyncKeyState() and GetKeyState() - /// - LMENU = 0xA4, - - /// - /// Right MENU key - Used only as parameters to GetAsyncKeyState() and GetKeyState() - /// - RMENU = 0xA5, - - /// - /// Windows 2000/XP: Browser Back key - /// - BROWSER_BACK = 0xA6, - - /// - /// Windows 2000/XP: Browser Forward key - /// - BROWSER_FORWARD = 0xA7, - - /// - /// Windows 2000/XP: Browser Refresh key - /// - BROWSER_REFRESH = 0xA8, - - /// - /// Windows 2000/XP: Browser Stop key - /// - BROWSER_STOP = 0xA9, - - /// - /// Windows 2000/XP: Browser Search key - /// - BROWSER_SEARCH = 0xAA, - - /// - /// Windows 2000/XP: Browser Favorites key - /// - BROWSER_FAVORITES = 0xAB, - - /// - /// Windows 2000/XP: Browser Start and Home key - /// - BROWSER_HOME = 0xAC, - - /// - /// Windows 2000/XP: Volume Mute key - /// - VOLUME_MUTE = 0xAD, - - /// - /// Windows 2000/XP: Volume Down key - /// - VOLUME_DOWN = 0xAE, - - /// - /// Windows 2000/XP: Volume Up key - /// - VOLUME_UP = 0xAF, - - /// - /// Windows 2000/XP: Next Track key - /// - MEDIA_NEXT_TRACK = 0xB0, - - /// - /// Windows 2000/XP: Previous Track key - /// - MEDIA_PREV_TRACK = 0xB1, - - /// - /// Windows 2000/XP: Stop Media key - /// - MEDIA_STOP = 0xB2, - - /// - /// Windows 2000/XP: Play/Pause Media key - /// - MEDIA_PLAY_PAUSE = 0xB3, - - /// - /// Windows 2000/XP: Start Mail key - /// - LAUNCH_MAIL = 0xB4, - - /// - /// Windows 2000/XP: Select Media key - /// - LAUNCH_MEDIA_SELECT = 0xB5, - - /// - /// Windows 2000/XP: Start Application 1 key - /// - LAUNCH_APP1 = 0xB6, - - /// - /// Windows 2000/XP: Start Application 2 key - /// - LAUNCH_APP2 = 0xB7, - - // - // 0xB8 - 0xB9 : Reserved - // - - /// - /// Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the ';:' key - /// - OEM_1 = 0xBA, - - /// - /// Windows 2000/XP: For any country/region, the '+' key - /// - OEM_PLUS = 0xBB, - - /// - /// Windows 2000/XP: For any country/region, the ',' key - /// - OEM_COMMA = 0xBC, - - /// - /// Windows 2000/XP: For any country/region, the '-' key - /// - OEM_MINUS = 0xBD, - - /// - /// Windows 2000/XP: For any country/region, the '.' key - /// - OEM_PERIOD = 0xBE, - - /// - /// Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '/?' key - /// - OEM_2 = 0xBF, - - /// - /// Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '`~' key - /// - OEM_3 = 0xC0, - - // - // 0xC1 - 0xD7 : Reserved - // - - // - // 0xD8 - 0xDA : Unassigned - // - - /// - /// Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '[{' key - /// - OEM_4 = 0xDB, - - /// - /// Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '\|' key - /// - OEM_5 = 0xDC, - - /// - /// Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the ']}' key - /// - OEM_6 = 0xDD, - - /// - /// Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key - /// - OEM_7 = 0xDE, - - /// - /// Used for miscellaneous characters; it can vary by keyboard. - /// - OEM_8 = 0xDF, - - // - // 0xE0 : Reserved - // - - // - // 0xE1 : OEM Specific - // - - /// - /// Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard - /// - OEM_102 = 0xE2, - - // - // (0xE3-E4) : OEM specific - // - - /// - /// Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key - /// - PROCESSKEY = 0xE5, - - // - // 0xE6 : OEM specific - // - - /// - /// Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes. The PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP - /// - PACKET = 0xE7, - - // - // 0xE8 : Unassigned - // - - // - // 0xE9-F5 : OEM specific - // - - /// - /// Attn key - /// - ATTN = 0xF6, - - /// - /// CrSel key - /// - CRSEL = 0xF7, - - /// - /// ExSel key - /// - EXSEL = 0xF8, - - /// - /// Erase EOF key - /// - EREOF = 0xF9, - - /// - /// Play key - /// - PLAY = 0xFA, - - /// - /// Zoom key - /// - ZOOM = 0xFB, - - /// - /// Reserved - /// - NONAME = 0xFC, - - /// - /// PA1 key - /// - PA1 = 0xFD, - - /// - /// Clear key - /// - OEM_CLEAR = 0xFE, - } -} diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/Native/XButton.cs b/helper/win32/src/KeeWebHelper/WindowsInput/Native/XButton.cs deleted file mode 100755 index 5b61024b..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/Native/XButton.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace WindowsInput.Native -{ - /// - /// XButton definitions for use in the MouseData property of the structure. (See: http://msdn.microsoft.com/en-us/library/ms646273(VS.85).aspx) - /// - internal enum XButton : uint - { - /// - /// Set if the first X button is pressed or released. - /// - XButton1 = 0x0001, - - /// - /// Set if the second X button is pressed or released. - /// - XButton2 = 0x0002, - } -} diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/README.md b/helper/win32/src/KeeWebHelper/WindowsInput/README.md deleted file mode 100755 index 09da182f..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# InputSimulator project - -https://github.com/michaelnoonan/inputsimulator -https://inputsimulator.codeplex.com/ - -# Microsoft Public License (Ms-PL) - -This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. - -1. Definitions - -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. - -A "contribution" is the original software, or any additions or changes to the software. - -A "contributor" is any person that distributes its contribution under this license. - -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights - -(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. - -(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. - -3. Conditions and Limitations - -(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. - -(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. - -(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. - -(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. - -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/WindowsInputDeviceStateAdaptor.cs b/helper/win32/src/KeeWebHelper/WindowsInput/WindowsInputDeviceStateAdaptor.cs deleted file mode 100755 index 4a43f702..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/WindowsInputDeviceStateAdaptor.cs +++ /dev/null @@ -1,157 +0,0 @@ -using System; -using WindowsInput.Native; - -namespace WindowsInput -{ - /// - /// An implementation of for Windows by calling the native and methods. - /// - public class WindowsInputDeviceStateAdaptor : IInputDeviceStateAdaptor - { - - /// - /// Determines whether the specified key is up or down by calling the GetKeyState function. (See: http://msdn.microsoft.com/en-us/library/ms646301(VS.85).aspx) - /// - /// The for the key. - /// - /// true if the key is down; otherwise, false. - /// - /// - /// The key status returned from this function changes as a thread reads key messages from its message queue. The status does not reflect the interrupt-level state associated with the hardware. Use the GetAsyncKeyState function to retrieve that information. - /// An application calls GetKeyState in response to a keyboard-input message. This function retrieves the state of the key when the input message was generated. - /// To retrieve state information for all the virtual keys, use the GetKeyboardState function. - /// An application can use the virtual-key code constants VK_SHIFT, VK_CONTROL, and VK_MENU as values for Bthe nVirtKey parameter. This gives the status of the SHIFT, CTRL, or ALT keys without distinguishing between left and right. An application can also use the following virtual-key code constants as values for nVirtKey to distinguish between the left and right instances of those keys. - /// VK_LSHIFT - /// VK_RSHIFT - /// VK_LCONTROL - /// VK_RCONTROL - /// VK_LMENU - /// VK_RMENU - /// - /// These left- and right-distinguishing constants are available to an application only through the GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState, and MapVirtualKey functions. - /// - public bool IsKeyDown(VirtualKeyCode keyCode) - { - Int16 result = NativeMethods.GetKeyState((UInt16)keyCode); - return (result < 0); - } - - /// - /// Determines whether the specified key is up or downby calling the function. (See: http://msdn.microsoft.com/en-us/library/ms646301(VS.85).aspx) - /// - /// The for the key. - /// - /// true if the key is up; otherwise, false. - /// - /// - /// The key status returned from this function changes as a thread reads key messages from its message queue. The status does not reflect the interrupt-level state associated with the hardware. Use the GetAsyncKeyState function to retrieve that information. - /// An application calls GetKeyState in response to a keyboard-input message. This function retrieves the state of the key when the input message was generated. - /// To retrieve state information for all the virtual keys, use the GetKeyboardState function. - /// An application can use the virtual-key code constants VK_SHIFT, VK_CONTROL, and VK_MENU as values for Bthe nVirtKey parameter. This gives the status of the SHIFT, CTRL, or ALT keys without distinguishing between left and right. An application can also use the following virtual-key code constants as values for nVirtKey to distinguish between the left and right instances of those keys. - /// VK_LSHIFT - /// VK_RSHIFT - /// VK_LCONTROL - /// VK_RCONTROL - /// VK_LMENU - /// VK_RMENU - /// - /// These left- and right-distinguishing constants are available to an application only through the GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState, and MapVirtualKey functions. - /// - public bool IsKeyUp(VirtualKeyCode keyCode) - { - return !IsKeyDown(keyCode); - } - - /// - /// Determines whether the physical key is up or down at the time the function is called regardless of whether the application thread has read the keyboard event from the message pump by calling the function. (See: http://msdn.microsoft.com/en-us/library/ms646293(VS.85).aspx) - /// - /// The for the key. - /// - /// true if the key is down; otherwise, false. - /// - /// - /// The GetAsyncKeyState function works with mouse buttons. However, it checks on the state of the physical mouse buttons, not on the logical mouse buttons that the physical buttons are mapped to. For example, the call GetAsyncKeyState(VK_LBUTTON) always returns the state of the left physical mouse button, regardless of whether it is mapped to the left or right logical mouse button. You can determine the system's current mapping of physical mouse buttons to logical mouse buttons by calling - /// Copy CodeGetSystemMetrics(SM_SWAPBUTTON) which returns TRUE if the mouse buttons have been swapped. - /// - /// Although the least significant bit of the return value indicates whether the key has been pressed since the last query, due to the pre-emptive multitasking nature of Windows, another application can call GetAsyncKeyState and receive the "recently pressed" bit instead of your application. The behavior of the least significant bit of the return value is retained strictly for compatibility with 16-bit Windows applications (which are non-preemptive) and should not be relied upon. - /// - /// You can use the virtual-key code constants VK_SHIFT, VK_CONTROL, and VK_MENU as values for the vKey parameter. This gives the state of the SHIFT, CTRL, or ALT keys without distinguishing between left and right. - /// - /// Windows NT/2000/XP: You can use the following virtual-key code constants as values for vKey to distinguish between the left and right instances of those keys. - /// - /// Code Meaning - /// VK_LSHIFT Left-shift key. - /// VK_RSHIFT Right-shift key. - /// VK_LCONTROL Left-control key. - /// VK_RCONTROL Right-control key. - /// VK_LMENU Left-menu key. - /// VK_RMENU Right-menu key. - /// - /// These left- and right-distinguishing constants are only available when you call the GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState, and MapVirtualKey functions. - /// - public bool IsHardwareKeyDown(VirtualKeyCode keyCode) - { - var result = NativeMethods.GetAsyncKeyState((UInt16)keyCode); - return (result < 0); - } - - /// - /// Determines whether the physical key is up or down at the time the function is called regardless of whether the application thread has read the keyboard event from the message pump by calling the function. (See: http://msdn.microsoft.com/en-us/library/ms646293(VS.85).aspx) - /// - /// The for the key. - /// - /// true if the key is up; otherwise, false. - /// - /// - /// The GetAsyncKeyState function works with mouse buttons. However, it checks on the state of the physical mouse buttons, not on the logical mouse buttons that the physical buttons are mapped to. For example, the call GetAsyncKeyState(VK_LBUTTON) always returns the state of the left physical mouse button, regardless of whether it is mapped to the left or right logical mouse button. You can determine the system's current mapping of physical mouse buttons to logical mouse buttons by calling - /// Copy CodeGetSystemMetrics(SM_SWAPBUTTON) which returns TRUE if the mouse buttons have been swapped. - /// - /// Although the least significant bit of the return value indicates whether the key has been pressed since the last query, due to the pre-emptive multitasking nature of Windows, another application can call GetAsyncKeyState and receive the "recently pressed" bit instead of your application. The behavior of the least significant bit of the return value is retained strictly for compatibility with 16-bit Windows applications (which are non-preemptive) and should not be relied upon. - /// - /// You can use the virtual-key code constants VK_SHIFT, VK_CONTROL, and VK_MENU as values for the vKey parameter. This gives the state of the SHIFT, CTRL, or ALT keys without distinguishing between left and right. - /// - /// Windows NT/2000/XP: You can use the following virtual-key code constants as values for vKey to distinguish between the left and right instances of those keys. - /// - /// Code Meaning - /// VK_LSHIFT Left-shift key. - /// VK_RSHIFT Right-shift key. - /// VK_LCONTROL Left-control key. - /// VK_RCONTROL Right-control key. - /// VK_LMENU Left-menu key. - /// VK_RMENU Right-menu key. - /// - /// These left- and right-distinguishing constants are only available when you call the GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState, and MapVirtualKey functions. - /// - public bool IsHardwareKeyUp(VirtualKeyCode keyCode) - { - return !IsHardwareKeyDown(keyCode); - } - - /// - /// Determines whether the toggling key is toggled on (in-effect) or not by calling the function. (See: http://msdn.microsoft.com/en-us/library/ms646301(VS.85).aspx) - /// - /// The for the key. - /// - /// true if the toggling key is toggled on (in-effect); otherwise, false. - /// - /// - /// The key status returned from this function changes as a thread reads key messages from its message queue. The status does not reflect the interrupt-level state associated with the hardware. Use the GetAsyncKeyState function to retrieve that information. - /// An application calls GetKeyState in response to a keyboard-input message. This function retrieves the state of the key when the input message was generated. - /// To retrieve state information for all the virtual keys, use the GetKeyboardState function. - /// An application can use the virtual-key code constants VK_SHIFT, VK_CONTROL, and VK_MENU as values for the nVirtKey parameter. This gives the status of the SHIFT, CTRL, or ALT keys without distinguishing between left and right. An application can also use the following virtual-key code constants as values for nVirtKey to distinguish between the left and right instances of those keys. - /// VK_LSHIFT - /// VK_RSHIFT - /// VK_LCONTROL - /// VK_RCONTROL - /// VK_LMENU - /// VK_RMENU - /// - /// These left- and right-distinguishing constants are available to an application only through the GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState, and MapVirtualKey functions. - /// - public bool IsTogglingKeyInEffect(VirtualKeyCode keyCode) - { - Int16 result = NativeMethods.GetKeyState((UInt16)keyCode); - return (result & 0x01) == 0x01; - } - } -} \ No newline at end of file diff --git a/helper/win32/src/KeeWebHelper/WindowsInput/WindowsInputMessageDispatcher.cs b/helper/win32/src/KeeWebHelper/WindowsInput/WindowsInputMessageDispatcher.cs deleted file mode 100755 index 31eaff20..00000000 --- a/helper/win32/src/KeeWebHelper/WindowsInput/WindowsInputMessageDispatcher.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using WindowsInput.Native; - -namespace WindowsInput -{ - /// - /// Implements the by calling . - /// - internal class WindowsInputMessageDispatcher : IInputMessageDispatcher - { - /// - /// Dispatches the specified list of messages in their specified order by issuing a single called to . - /// - /// The list of messages to be dispatched. - /// If the array is empty. - /// If the array is null. - /// If the any of the commands in the array could not be sent successfully. - public void DispatchInput(INPUT[] inputs) - { - if (inputs == null) throw new ArgumentNullException("inputs"); - if (inputs.Length == 0) throw new ArgumentException("The input array was empty", "inputs"); - var successful = NativeMethods.SendInput((UInt32)inputs.Length, inputs, Marshal.SizeOf(typeof (INPUT))); - if (successful != inputs.Length) - throw new Exception("Some simulated input commands were not sent successfully. The most common reason for this happening are the security features of Windows including User Interface Privacy Isolation (UIPI). Your application can only send commands to applications of the same or lower elevation. Similarly certain commands are restricted to Accessibility/UIAutomation applications. Refer to the project home page and the code samples for more information."); - } - } -} \ No newline at end of file diff --git a/package/win/sign.cmd b/package/win/sign.cmd deleted file mode 100644 index 074abe44..00000000 --- a/package/win/sign.cmd +++ /dev/null @@ -1 +0,0 @@ -"c:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe" sign /t http://timestamp.verisign.com/scripts/timstamp.dll /d "KeeWeb Helper" /du https://keeweb.info helper/win32/KeeWebHelper.exe