From 39ab04a2043485f0d706d5bbbc929bcb45f30b11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20G=C3=BCnner?= Date: Sun, 7 Jul 2024 15:15:43 +0200 Subject: [PATCH] initial release --- README.md | 57 +++++++- TypeIt.sln | 31 ++++ TypeIt/Resource.rc | Bin 0 -> 5282 bytes TypeIt/TypeIt.cpp | 262 ++++++++++++++++++++++++++++++++++ TypeIt/TypeIt.vcxproj | 144 +++++++++++++++++++ TypeIt/TypeIt.vcxproj.filters | 37 +++++ TypeIt/icon1.ico | Bin 0 -> 45451 bytes TypeIt/resource.h | 16 +++ 8 files changed, 546 insertions(+), 1 deletion(-) create mode 100644 TypeIt.sln create mode 100644 TypeIt/Resource.rc create mode 100644 TypeIt/TypeIt.cpp create mode 100644 TypeIt/TypeIt.vcxproj create mode 100644 TypeIt/TypeIt.vcxproj.filters create mode 100644 TypeIt/icon1.ico create mode 100644 TypeIt/resource.h diff --git a/README.md b/README.md index 27fccf3..a0986c1 100644 --- a/README.md +++ b/README.md @@ -1 +1,56 @@ -# TypeIt +
+ + +
+ + TypeIt Banner + +
+ + [![Version][version-shield]][version-url] + [![Download Counter][downloads-shield]][downloads-url] + [![License][license-shield]][license-url] +
+ +[version-shield]: https://img.shields.io/github/v/release/valnoxy/typeit?color=9565F6 +[version-url]: https://github.com/valnoxy/typeit/releases + +[downloads-shield]: https://img.shields.io/github/downloads/valnoxy/typeit/total.svg?color=431D93 +[downloads-url]: https://github.com/valnoxy/typeit/releases + +[license-shield]: https://img.shields.io/github/license/valnoxy/typeit?color=9565F6 +[license-url]: https://img.shields.io/github/license/valnoxy/typeit + +
+

TypeIt

+

+

An app that simulates and types clipboard content.

+ Report Bug + · + Discussions +
+
+ 🎉 Version 1.0.0 is out. Check out the release notes + here. +
+
+

+
+ +--- + +# 🚀Introduction +TypeIt is a small application for typing the clipboard using a hotkey. This can be useful for environments where CTRL-V is blocked. + +# 🤸 Usage +Start TypeIt like any other application. At the bottom of the taskbar you will find a small icon where you can set whether ENTER should be pressed after pasting. + +The clipboard is typed in with the hotkey ```CTRL-B```. + +# 🧾 License +TIelevated is licensed under [GPL-3.0](https://github.com/valnoxy/TIelevated/blob/main/LICENSE). + +
+
© 2018 - 2024 valnoxy. All Rights Reserved. +
+By Jonas Günner <jonas@exploitox.de>
\ No newline at end of file diff --git a/TypeIt.sln b/TypeIt.sln new file mode 100644 index 0000000..583661a --- /dev/null +++ b/TypeIt.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.9.34616.47 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TypeIt", "TypeIt\TypeIt.vcxproj", "{F15CAC6B-2232-441F-B08F-05263EE15BCC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F15CAC6B-2232-441F-B08F-05263EE15BCC}.Debug|x64.ActiveCfg = Debug|x64 + {F15CAC6B-2232-441F-B08F-05263EE15BCC}.Debug|x64.Build.0 = Debug|x64 + {F15CAC6B-2232-441F-B08F-05263EE15BCC}.Debug|x86.ActiveCfg = Debug|Win32 + {F15CAC6B-2232-441F-B08F-05263EE15BCC}.Debug|x86.Build.0 = Debug|Win32 + {F15CAC6B-2232-441F-B08F-05263EE15BCC}.Release|x64.ActiveCfg = Release|x64 + {F15CAC6B-2232-441F-B08F-05263EE15BCC}.Release|x64.Build.0 = Release|x64 + {F15CAC6B-2232-441F-B08F-05263EE15BCC}.Release|x86.ActiveCfg = Release|Win32 + {F15CAC6B-2232-441F-B08F-05263EE15BCC}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {198EE6B5-EA2C-46CD-BEF8-1A9CDAE5ECA1} + EndGlobalSection +EndGlobal diff --git a/TypeIt/Resource.rc b/TypeIt/Resource.rc new file mode 100644 index 0000000000000000000000000000000000000000..324d4951a782ebdd78a1a4be60b29c13fe8219fe GIT binary patch literal 5282 zcmdUz+ioI95QghIQr=;LZ?eh;gKa5M?tEYo3TrHbQ4%3pYcMPd2E<|GmGbP_{r>K0 zW(EdF;9L-mhMwuJuCC)>HGKK!*p4l-_cpYy&1_(_^h1S3ETSMzh^prg+%%5!y1Eh5&nH7YZflMKBDdSYcnHqQnq-L69My7J`J6%zRToQ4{qo7j)?O4 z)FgNA$gE3Z>Yj7zT;lsTSG09!3m&(`uXa?}|HhqKXZD)eJI1Pu(J*uG-fziOQM`q7 z6RHc&@;kEYvV`}!G}!KQWkehKf90&J|6TUy=XHpJV1qKY%BPH+#uw;bb=aUCQGDfN zZO2M6-d3=jx0rSbN%lD-5915Ai7*B0fK(k~)}wtQdSaFlhz?wjhq)%fg&pSgf~@wbqh7(CbCbiTUat1 zQTv5Q>Ic*#sD964+66l!XJPdhsyPvqQ@2BXh&qd*lO|%!%H?a@6Ex~0=Ir$AbKWJ1 zDyQU;F5)`kQa|!JUVUQp)ld@GK&l!Tr_Mnc_0kpSUZP2_73>fDh3M{psuN^VZ>6_7 zPlMIl0~YAopUACD=wQK9H>T%h*HfhSwn#do;JvhG59c{Z7e;lI(o&wvi?lY_e-BNC z3ev|zT5VM z6W+PnR7FD7tR^)k;)G}X(`QA}2>p`kxt?!)Z!{E96>p?2PFJ}-G#g!9|JNL_mVoBxk1`8m{f{yW!EnDPz*?>8KY2o-O{aC zs~S|h@U6ph;5f>YQ@AMl22?EZQHSY$oLx~b-F5x#2^y8{XZw-vr^J264qw%R*Ne=Y zBeCjA!duq&Ur*BM6H@fB%r25QVs6S6StLY^-qJCcwoH+8p1F59=Z148NT<59_|NQ~ z<@%agf)_d$xER|i9lw#cV@+Q(I zPrfdwH_7WMU;kZqI8}dL5^0{keRX{4i+!`7Ugvo@@6t@tgz>fi-JGsaB>6Wj``=Bl a<>A<1T@p#S{rgEMs*1MxPtB&^#px>!5q`k{ literal 0 HcmV?d00001 diff --git a/TypeIt/TypeIt.cpp b/TypeIt/TypeIt.cpp new file mode 100644 index 0000000..a146874 --- /dev/null +++ b/TypeIt/TypeIt.cpp @@ -0,0 +1,262 @@ +#include +#include +#include +#include +#include + +#include "resource.h" + +#define WM_TRAYICON (WM_USER + 1) +#define ID_TRAY_EXIT 1001 +#define ID_TRAY_OPTION1 1002 +#define ID_TRAY_OPTION2 1003 + +HINSTANCE hInst; +NOTIFYICONDATA nid; +HWND hWnd; +bool pressEnter = true; + +// Read stored registry value +bool ReadRegistry(const wchar_t* keyPath, const wchar_t* valueName) { + HKEY hKey; + DWORD dwType = REG_DWORD; + DWORD dwData = 0; + DWORD dwDataSize = sizeof(DWORD); + + LONG result = RegOpenKeyEx(HKEY_CURRENT_USER, keyPath, 0, KEY_READ, &hKey); + if (result == ERROR_SUCCESS) { + result = RegQueryValueEx(hKey, valueName, nullptr, &dwType, reinterpret_cast(&dwData), &dwDataSize); + RegCloseKey(hKey); + } + + return (result == ERROR_SUCCESS && dwData != 0); // Return true if value exists and is non-zero +} + +// Write stored registry value +bool WriteRegistry(bool value) { + const wchar_t* keyPath = L"SOFTWARE\\valnoxy\\TypeIt"; + const wchar_t* valueName = L"PressEnter"; + + HKEY hKey; + DWORD dwDisposition; + + LONG result = RegCreateKeyEx( + HKEY_CURRENT_USER, + keyPath, + 0, + nullptr, + REG_OPTION_NON_VOLATILE, + KEY_WRITE, + nullptr, + &hKey, + &dwDisposition + ); + + if (result != ERROR_SUCCESS) { + std::cerr << "Failed to create registry key." << '\n'; + return false; + } + + DWORD data = value ? 1 : 0; + result = RegSetValueEx( + hKey, + valueName, + 0, + REG_DWORD, + reinterpret_cast(&data), + sizeof(DWORD) + ); + + RegCloseKey(hKey); + + if (result != ERROR_SUCCESS) { + std::cerr << "Failed to set registry value." << '\n'; + return false; + } + + return true; +} + +std::wstring GetClipboardText() { + if (!OpenClipboard(nullptr)) { + return L""; + } + + HANDLE hData = GetClipboardData(CF_UNICODETEXT); + if (hData == nullptr) { + CloseClipboard(); + return L""; + } + + auto pwszText = static_cast(GlobalLock(hData)); + if (pwszText == nullptr) { + CloseClipboard(); + return L""; + } + + std::wstring text(pwszText); + GlobalUnlock(hData); + CloseClipboard(); + return text; +} + +// Simulate Keyboard Input +void SimulateKeyboardInput(const std::wstring& text) { + for (wchar_t c : text) { + INPUT input = { 0 }; + input.type = INPUT_KEYBOARD; + + if (c == L'\n') { + input.ki.wVk = VK_RETURN; + input.ki.dwFlags = 0; + SendInput(1, &input, sizeof(INPUT)); + input.ki.dwFlags = KEYEVENTF_KEYUP; + SendInput(1, &input, sizeof(INPUT)); + } + else { + input.ki.wVk = 0; + input.ki.wScan = c; + input.ki.dwFlags = KEYEVENTF_UNICODE; + SendInput(1, &input, sizeof(INPUT)); + input.ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP; + SendInput(1, &input, sizeof(INPUT)); + } + + // Workaround for preventing typing too fast + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + } + + // Press Enter if option is enabled + if (pressEnter) + { + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + INPUT input = { 0 }; + input.type = INPUT_KEYBOARD; + input.ki.wVk = VK_RETURN; + input.ki.dwFlags = 0; + SendInput(1, &input, sizeof(INPUT)); + input.ki.dwFlags = KEYEVENTF_KEYUP; + SendInput(1, &input, sizeof(INPUT)); + } +} + +// Tray Icon +void CreateTrayIcon(HWND hwnd) { + nid.cbSize = sizeof(NOTIFYICONDATA); + nid.hWnd = hwnd; + nid.uID = 1; + nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; + nid.uCallbackMessage = WM_TRAYICON; + nid.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1)); + wcscpy_s(nid.szTip, L"TypeIt"); + + Shell_NotifyIcon(NIM_ADD, &nid); +} + +void ShowContextMenu(HWND hwnd) { + POINT pt; + GetCursorPos(&pt); + HMENU hMenu = CreatePopupMenu(); + if (hMenu) { + // Option 1 + UINT uCheck1 = (pressEnter) ? MF_CHECKED : MF_UNCHECKED; + InsertMenu(hMenu, -1, MF_BYPOSITION | MF_STRING | uCheck1, ID_TRAY_OPTION1, L"CTRL-V + ENTER"); + + // Option 2 + UINT uCheck2 = (!pressEnter) ? MF_CHECKED : MF_UNCHECKED; + InsertMenu(hMenu, -1, MF_BYPOSITION | MF_STRING | uCheck2, ID_TRAY_OPTION2, L"CTRL-V"); + + InsertMenu(hMenu, -1, MF_BYPOSITION | MF_SEPARATOR, 0, nullptr); + InsertMenu(hMenu, -1, MF_BYPOSITION, ID_TRAY_EXIT, L"Exit"); + + // Display context menu + SetForegroundWindow(hwnd); + TrackPopupMenu(hMenu, TPM_BOTTOMALIGN | TPM_LEFTALIGN, pt.x, pt.y, 0, hwnd, nullptr); + DestroyMenu(hMenu); + } +} + +LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + switch (uMsg) { + case WM_HOTKEY: + if (wParam == 1) { + std::wstring clipboardText = GetClipboardText(); + SimulateKeyboardInput(clipboardText); + } + break; + case WM_TRAYICON: + if (lParam == WM_RBUTTONUP) { + ShowContextMenu(hwnd); + } + break; + case WM_COMMAND: + switch (LOWORD(wParam)) { + case ID_TRAY_OPTION1: + pressEnter = true; + WriteRegistry(true); + break; + case ID_TRAY_OPTION2: + pressEnter = false; + WriteRegistry(false); + break; + case ID_TRAY_EXIT: + PostQuitMessage(0); + break; + default: + break; + } + break; + case WM_DESTROY: + Shell_NotifyIcon(NIM_DELETE, &nid); + PostQuitMessage(0); + break; + default: + return DefWindowProc(hwnd, uMsg, wParam, lParam); + } + return 0; +} + +// Entry Point +int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) { + hInst = hInstance; + WNDCLASS wc = { 0 }; + + wc.lpfnWndProc = WindowProc; + wc.hInstance = hInstance; + wc.lpszClassName = L"TypeItClass"; + + RegisterClass(&wc); + + pressEnter = ReadRegistry(L"SOFTWARE\\valnoxy\\TypeIt", L"PressEnter"); + + hWnd = CreateWindowEx( + 0, + L"TypeItClass", + L"TypeIt", + 0, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + nullptr, + nullptr, + hInstance, + nullptr + ); + + if (hWnd == nullptr) { + return 0; + } + + if (!RegisterHotKey(hWnd, 1, MOD_CONTROL, 'B')) { + MessageBox(nullptr, L"Failed to register hotkey! Make sure that no other application is already using the CTRL-B hotkey.", L"Error", MB_OK | MB_ICONERROR); + return 0; + } + CreateTrayIcon(hWnd); + + MSG msg = { nullptr }; + while (GetMessage(&msg, nullptr, 0, 0)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + UnregisterHotKey(hWnd, 1); + return 0; +} diff --git a/TypeIt/TypeIt.vcxproj b/TypeIt/TypeIt.vcxproj new file mode 100644 index 0000000..3aae7af --- /dev/null +++ b/TypeIt/TypeIt.vcxproj @@ -0,0 +1,144 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {f15cac6b-2232-441f-b08f-05263ee15bcc} + TypeIt + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TypeIt/TypeIt.vcxproj.filters b/TypeIt/TypeIt.vcxproj.filters new file mode 100644 index 0000000..d162b47 --- /dev/null +++ b/TypeIt/TypeIt.vcxproj.filters @@ -0,0 +1,37 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Quelldateien + + + + + Ressourcendateien + + + + + Headerdateien + + + + + Ressourcendateien + + + \ No newline at end of file diff --git a/TypeIt/icon1.ico b/TypeIt/icon1.ico new file mode 100644 index 0000000000000000000000000000000000000000..5d06b9f2857b39f0b5d3395e3e7999ba6bcc3a38 GIT binary patch literal 45451 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 literal 0 HcmV?d00001 diff --git a/TypeIt/resource.h b/TypeIt/resource.h new file mode 100644 index 0000000..40fdca0 --- /dev/null +++ b/TypeIt/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Von Microsoft Visual C++ generierte Includedatei. +// Verwendet durch Resource.rc +// +#define IDI_ICON1 102 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif