Описание
Hotkeystart — позволяет установить горячую клавишу для запуска/остановки текущего скрипта.
Hotkeypause — позволяет установить горячую клавишу для приостановки текущего скрипта.
Хоткеи задаются глобально, как если бы это делалось через стандартную форму редактирования (настройка горячих клавиш находится во вкладке ‘Ещё’, ‘EditHotKeys’). Если такая горячая клавиша уже назначена на что-то другое, то новая назначится, но будет неактивна до отключения существующей.
Синтаксис
Привязка к окну: Нет.
Работа со свернутым окном: Да.
set hotkeystart [~|^|@]{key} set hotkeypause [~|^|@]{key}
Где:
[~|^|@] — необязательные модификаторы: ‘~’ — shift, ‘^’ — ctrl, ‘@’ — alt.
{key} — клавиша, задаётся в фигурных скобках.
Переменная ‘errorlevel’ содержит код завершения команд. При включении соответствующей галочки в меню, выводят в лог описание кода завершения:
1 - хоткей такой уже есть; 2 - не смогли добавить хоткей; 3 - клавиша указана но не распознана; 4 - нет скобок, не указана клавиша, пустые скобки.
Примеры
// Пример 1 set hotkeystart {t} //установить клавишу t для запуска/остановки текущего скрипта End_script
// Пример 2 set hotkeystart @{F1} //установить Alt + F1 для запуска/остановки текущего скрипта End_script
// Пример 3 set hotkeystart ^{q} //установить Ctrl + q для запуска/остановки текущего скрипта set hotkeypause ~{q} //установить Shift + q для приостановки текущего скрипта End_script
Смотрите также
Start script
Stop script
Pause script
Resume script
История развития
2.36
Добавил команды задания горячих клавиш для запуска и приостановки текущего скрипта. Клавиша задается в фигурных скобках. Модификаторы перед скобками в виде ‘~’ — shift, ‘^’ — ctrl, ‘@’ — alt. Хоткеи задаются глобально, как если бы это делалось через стандартную форму редактирования. Если такая горячая клавиша уже назначена на что-то другое, то новая назначится, но будет неактивна до отключения существующей.
'set hotkeystart @{F1}' 'set hotkeypause {F2}' Переменная 'errorlevel' содержит код завершения команд. при включении соответствующей галочки в меню, выводят в лог описание кода завершения: 1 - хоткей такой уже есть; 2 - не смогли добавить хоткей; 3 - клавиша указана но не распознана; 4 - нет скобок, не указана клавиша, пустые скобки.
2.41
Исправил ошибку в командах ‘set hotkeystart’ и ‘set hotkeypause’.
Hello everyone.
I have enabled the «Key combination» option and it works fine to me. But when you open a secondary RDP session to go further (open RDP connection again on remote side) it cannot pass Ctrl+Alt+End combination for the second or third nested session.
It works only for the first one. Some time we have even three or four nested RDP session, it such a kind of security using jump-boxes to go thru.
The trick here is to open on-screen keyboard in the first session and using it, send a Ctrl+Alt+End combination to the secondary nested session (and so on).
It would be very nice to have a built-in option to send such a predefined key combination for a nested session. (For example by right clicking on connection tab and call this function)
Thanks a lot
I do not believe this is something that mRemoteNG can do, nor any RDP client. Have you considered using an RD Gateway to connect through instead of using the nested approach? I would expect a mammoth improvement in performance and responsiveness of the RDP sessions with a gateway.
Another option is to set up custom keyboard shortcuts within the descendants that would provide the equivalent of Ctrl+Alt+Del. Perhaps Autohotkey (https://www.autohotkey.com) which makes it trivial to create shortcuts would be an option on each remote machine.
This is hard to fix I think due to how RDP is built up.
I do not even think that a rdp -> rdp -> rdp would be able to do that to understand which connection is the one that is active to recieve the keyboard shortcuts.
Hello
Remote Desktop Connection Manager can send a such key combination
(For example: RDCMan v2.7 build 1406.0)
I think you misunderstood this function, we should not send this key combination directly from a keyboard thru all nested RDP connections. Just use it on demand (in appropriate nested level, no matter how it is deep) by clicking on the tab connection or from the appropriate menu. For Example like RDC Manager do this.
Work Around : launch «osk.exe» (virtual keyboard), do CTRL + ALT with the keybord, and «SUPPR» with the virtual keyboard
as TheDevilDan says you can use this workaround: launch the virtual keyboard with osk.exe or click start >windows ease of access > Onscreen keyboard. On your physical keyboard do CTRL+ALT . Then on your Virtual keyboard press Delete. This worked for me.
as TheDevilDan says you can use this workaround: launch the virtual keyboard with osk.exe or click start >windows ease of access > Onscreen keyboard. On your physical keyboard do CTRL+ALT . Then on your Virtual keyboard press Delete. This worked for me.
This usually works but not quite as convenient. Another wrinkle is if osk does not start for reasons unknown. I had this recently, and ended up having to copy RDCMan to the jump host in question so I could use the [Send keys] functionality.
I have an application where Ctrl + Alt + End is mapped to a command, but when using the machine via Remote Desktop, Ctrl + Alt + End is used by the system as an alternative to Ctrl + Alt + Delete. Is there any way to change that setting for the Remote Desktop session so I can use Ctrl + Alt + End in my application?
asked Jan 7, 2010 at 19:34
Do you have the option of running AutoHotkey on the remote PC? You could run a script there which would trap an alternate hotkey of your choosing, and render it (there) as Ctrl+Alt+End.
answered Jan 7, 2010 at 19:43
JMDJMD
4,7671 gold badge21 silver badges25 bronze badges
0
Alternate method which opens the ‘Ctrl—Alt—Delete‘ overlay manually:
Run > shell:::{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}
or
cmd > explorer.exe shell:::{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}
Robotnik
2,3803 gold badges23 silver badges41 bronze badges
answered Jun 5, 2017 at 8:06
1
Use On-Screen Keyboard.
- Click Windows button -> Run
- Open
osk
and click related key.
answered Mar 3, 2018 at 18:29
Ivan ChauIvan Chau
1,3739 silver badges18 bronze badges
1
If you have permission to install on the remote machine, you could use a scripting engine like AutoHotkey or AutoIt to make a small script to catch whatever shortcut you would like and virtually «press» Ctrl+Alt+Del on the remote machine for you.
answered Jan 7, 2010 at 19:43
Jared HarleyJared Harley
12.4k3 gold badges40 silver badges51 bronze badges
1
When you’re connecting, on the Local Resources tab of your Remote Desktop Client choose «On the Local Computer» in the drop-down menu of the Keyboard frame. This will send those keyboard signals directly to the remote machine instead of via the client.
answered Jan 7, 2010 at 19:56
squillmansquillman
7,1513 gold badges35 silver badges42 bronze badges
1
Here is an alternative using Powershell. This worked for me in a slightly different and more complicated setup (connecting from a Mac laptop (no «end» key on keyboard) to a Linux server through SSH and then from the Linux server to a Windows Server 2016 server through Remote desktop protocol using the rdesktop
Linux RDP command line client).
In Windows:
- Click Start menu
- Click in the search bar
- Type «powershell»
- In the search results, click «powershell.exe»
-
In the PowerShell shell that opens, type the following:
Powershell -noprofile -nologo -noninteractive -command "(new-object -ComObject shell.application).WindowsSecurity()"
answered Mar 20, 2020 at 18:12
philbphilb
1174 bronze badges
Also from PowerShell (if any other combinations doesn’t work)
(New-Object -COM Shell.Application).WindowsSecurity()
answered Dec 9, 2022 at 10:47
4
Это вольный перевод статьи с сайта tamas.io о программном отключении и включении горячих клавиш Windows средствами C#. Совсем недавно мне самому понадобились подобные функции в моей программе и я с удивлением обнаружил, что в рунете ничего об этом нет, да и вообще в сети об этом сказано совсем немного. Так что, если интересно или также нужно, как было мне — добро пожаловать!
Я написал эту статью в 2007 году и она до сих пор ходит по сети и упоминается в различных обсуждениях, включая StackOverflow и DotNetSpider, так что я решил вновь опубликовать её. Это было актуально уже тогда и не было проверено на Windows 7, в силу того, что её на тот момент просто не существовало физически.
Перед тем, как продолжить чтение, прошу, обратите внимание на то, что эта статья вовсе не призывает вас создавать вредоносные приложения. Вы можете использовать приведённый код в целях обучения или для развлечения.
После небольшого исследования по отключению клавиш и их сочетаний я узнал, что есть несколько способов изменения поведения ранее упомянутых ключевых комбо.
Не волнуйтесь, мы не будем рассматривать их здесь, но я покажу, как с ними работать.
Используем возможности редактирования реестра C#, чтобы установить / изменить групповую политику для последовательности клавиш CTRL-ALT-DEL. Давайте посмотрим, что можно сделать не написав ни строчки кода. Откройте «Пуск -> Выполнить» и наберите gpedit.msc. Перейдите к: Конфигурация пользователя> Административные шаблоны> Система>Варианты действий после нажатия CTRL-ALT-DEL (User Configuration > Administrative Templates > System > CTRL+ALT+DELETE Options). Это то место, где стандартным способом можно установить действие, которое будет вызвано нажатием этого комбо. Дважды щёлкните по «Удалить диспетчер задач» (Remove Task Manager). Изменение этого параметра меняет значение в SoftwareMicrosoftWindowsCurrentVersionPoliciesSystem и значение DisableTaskMgr получит значение 1.
Теперь задача стала яснее.
Важно, не пропустите эту строку:
using Microsoft.Win32;
Метод, который я написал, выглядит следующим образом:
public void KillCtrlAltDelete()
{
RegistryKey regkey;
string keyValueInt = "1";
string subKey = @"SoftwareMicrosoftWindowsCurrentVersionPoliciesSystem";
try
{
regkey = Registry.CurrentUser.CreateSubKey(subKey);
regkey.SetValue("DisableTaskMgr", keyValueInt);
regkey.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
Таким образом, мы позаботились об изменении значения комбинации CTRL-ALT-DEL. Рассмотрим остальные сочетания. Возможно, вам могло показаться это сложным, но это проще простого. Как отключить ALT + F4? Всего 5 строк кода:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
base.OnClosing(e);
}
Хорошо. Об остальном пришлось много читать и сейчас будет трудно назвать точно те статьи, которые мне помогли разобраться, но из всех было штук 15, которые содержали хоть какую-то полезную информацию. Я дам вам метод, который называется хук. Фрагмент кода использует LowLevelKeyboardProc, который:
Процедура LowLevelKeyboardProc — это программно определённая или библиотечно определённая процедура вызова функции, используемая совместно с функцией SetWindowsHookEx. Система вызывает эту функцию каждый раз, когда событие ввода с клавиатуры вот-вот будет размещено в очереди потока ввода. Ввод с клавиатуры может пройти через драйвер или через вызовы функции keybdevent. Если вызов произошёл через вызов keybdevent, то он был «введён» (injected). Тем не менее, хук WHKEYBOARDLL не внедряется в другой процесс. Вместо этого, контекст переключается на другой процесс, на который установлен хук и вызывается в первоначальном виде. Затем, контекст переключается обратно на приложение, которое вызвало это событие.
И снова, не забудьте:
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Diagnostics;
Здесь всё остальное, что может ещё вам пригодиться:
[DllImport("user32", EntryPoint = "SetWindowsHookExA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int SetWindowsHookEx(int idHook, LowLevelKeyboardProcDelegate lpfn, int hMod, int dwThreadId);
[DllImport("user32", EntryPoint = "UnhookWindowsHookEx", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int UnhookWindowsHookEx(int hHook);
public delegate int LowLevelKeyboardProcDelegate(int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam);
[DllImport("user32", EntryPoint = "CallNextHookEx", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int CallNextHookEx(int hHook, int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam);
public const int WH_KEYBOARD_LL = 13;
/*code needed to disable start menu*/
[DllImport("user32.dll")]
private static extern int FindWindow(string className, string windowText);
[DllImport("user32.dll")]
private static extern int ShowWindow(int hwnd, int command);
private const int SW_HIDE = 0;
private const int SW_SHOW = 1;
public struct KBDLLHOOKSTRUCT
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
public static int intLLKey;
public int LowLevelKeyboardProc(int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam)
{
bool blnEat = false;
switch (wParam)
{
case 256:
case 257:
case 260:
case 261:
//Alt+Tab, Alt+Esc, Ctrl+Esc, Windows Key,
blnEat = ((lParam.vkCode == 9) && (lParam.flags == 32)) | ((lParam.vkCode == 27) && (lParam.flags == 32)) | ((lParam.vkCode == 27) && (lParam.flags == 0)) | ((lParam.vkCode == 91) && (lParam.flags == 1)) | ((lParam.vkCode == 92) && (lParam.flags == 1)) | ((lParam.vkCode == 73) && (lParam.flags == 0));
break;
}
if (blnEat == true)
{
return 1;
}
else
{
return CallNextHookEx(0, nCode, wParam, ref lParam);
}
}
public void KillStartMenu()
{
int hwnd = FindWindow("Shell_TrayWnd", "");
ShowWindow(hwnd, SW_HIDE);
}
private void Form1_Load(object sender, EventArgs e)
{
intLLKey = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]).ToInt32(), 0);
}
Совершенно очевидно, что вы можете программно вернуть все значения, вновь включив все сочетания:
public static void ShowStartMenu()
{
int hwnd = FindWindow("Shell_TrayWnd", "");
ShowWindow(hwnd, SW_SHOW);
}
public static void EnableCTRLALTDEL()
{
try
{
string subKey = @"SoftwareMicrosoftWindowsCurrentVersionPoliciesSystem";
RegistryKey rk = Registry.CurrentUser;
RegistryKey sk1 = rk.OpenSubKey(subKey);
if (sk1 != null)
rk.DeleteSubKeyTree(subKey);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
UnhookWindowsHookEx(intLLKey);
}
Я надеюсь, вам понравилась статья и вы нашли в ней что-то полезное. Я постарался собрать здесь всю информацию, которую только смог найти по этой теме.
От себя дополню, что в .NET4 код вида:
intLLKey = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]).ToInt32(), 0);
Не работает. Нужно писать что-то типа:
var inst = LoadLibrary("user32.dll").ToInt32();
intLLKey = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, inst, 0);
Ну и в начало кода структуры AddHooks, среди прочего импорта сделать:
LoadLibrary:
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern IntPtr LoadLibrary(string lpFileName);
Надеюсь, перевод получился не совсем плох и окажется кому — либо полезен.
UPD: Ссылка на законченную рабочую программу.