KevinS |
Отправлено: 15 Декабря, 2021 - 19:30:31
|
Мастер
Покинул форум
Сообщений всего: 218
Дата рег-ции: Февр. 2020
Репутация: 2
|
Здравствуйте.
Как сделать так, чтобы пользователь мог сам назначить хоткей запуска бота в диалоге. К примеру, чтобы можно было назначить ALT+Q, F4, M, Home, Esc, Shift+R?
Как понять, что было нажато пользователем и преобразовать это в хоткей?(Отредактировано автором: 15 Декабря, 2021 - 19:30:58) |
|
|
Zireael |
Отправлено: 15 Декабря, 2021 - 21:13:57
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
HotKey Control (Отобразить)CODE:#define WS_VISIBLE 0x10000000
#define WS_CHILD 0x40000000
#define WS_BORDER 0x00800000
#define HKM_GETHOTKEY 0x402
#define HOTKEYF_SHIFT 0x01
#define HOTKEYF_CONTROL 0x02
#define HOTKEYF_ALT 0x04
#define MOD_ALT 0x0001
#define MOD_CONTROL 0x0002
#define MOD_SHIFT 0x0004
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll");
external(INT, "EnableWindow", "EnableWindow", "User32.dll");
external(INT, "RegisterHotKey", "RegisterHotKey", "User32.dll");
external(INT, "UnregisterHotKey", "UnregisterHotKey", "User32.dll");
int HotKey, ButtonOK;
int HotKeyId = 1111;
int RegisterHotKeyFlag = 0;
createdialog(0);
showdialog(0, "Диалог",100, 100, 300, 200, 4, 1);
loop()sleep(10);
end:;
function getmessage(0, WM_CREATE)
{
HotKey=CreateWindow(0, "msctls_hotkey32", "", WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 10, 140, 24, gethwnd(0), 0, 0, 0);
ButtonOK=CreateWindow(0, "BUTTON", "Установить Хоткей", WS_CHILD | WS_VISIBLE, 20, 40, 140, 24, gethwnd(0), 0, 0, 0);
}
function getmessage(0, WM_COMMAND)
{
if(message.lparam==ButtonOK) // если нажата кнопка
{
if(RegisterHotKeyFlag==0) // если хоткей не был установлен
{
int Key = sendmessage(HKM_GETHOTKEY, 0, 0, formatiw(HotKey)); // получить код клавиши и модификаторы
if(Key==0)
{
messagebox("Пусто");
return;
}
// узнать какие модификаторы были нажаты
char byte[4];
codhex(Key, #byte[0]);
int fsModifiers = 0;
if(formatci(byte[1]) == HOTKEYF_SHIFT)fsModifiers = MOD_SHIFT;
if(formatci(byte[1]) == HOTKEYF_CONTROL)fsModifiers = MOD_CONTROL;
if(formatci(byte[1]) == HOTKEYF_CONTROL | HOTKEYF_SHIFT)fsModifiers = MOD_CONTROL | MOD_SHIFT;
if(formatci(byte[1]) == HOTKEYF_ALT)fsModifiers = MOD_ALT;
if(formatci(byte[1]) == HOTKEYF_ALT | HOTKEYF_SHIFT)fsModifiers = MOD_ALT | MOD_SHIFT;
if(formatci(byte[1]) == HOTKEYF_CONTROL | HOTKEYF_ALT)fsModifiers = MOD_CONTROL | MOD_ALT;
if(formatci(byte[1]) == HOTKEYF_CONTROL | HOTKEYF_ALT | HOTKEYF_SHIFT)fsModifiers = MOD_CONTROL | MOD_ALT | MOD_SHIFT;
if(RegisterHotKey(gethwnd(0), HotKeyId, fsModifiers, formatci(byte[0]))) // установить хоткей
{
RegisterHotKeyFlag=1;
EnableWindow(ButtonOK, 0);
messagebox("Хоткей установлен^r^nЗакрыв это окно можно проверить работу хоткея");
}
}
}
}
function getmessage(0, WM_HOTKEY)
{
if(message.wparam==HotKeyId)
{
messagebox("Нажат Хоткей^r^nДальнейшие действия");
}
}
function getmessage(0, WM_CLOSE)
{
UnregisterHotKey(gethwnd(0), HotKeyId);
messagebox("Окно закрыто^r^nХоткей удалён");
goto global end;
} (Отредактировано автором: 15 Декабря, 2021 - 21:26:42) |
|
|
KevinS |
Отправлено: 22 Декабря, 2021 - 18:51:57
|
Мастер
Покинул форум
Сообщений всего: 218
Дата рег-ции: Февр. 2020
Репутация: 2
|
А как сохранить установленный хоткей и автоматически загрузить при повторном запуске программы? У меня проблема в том, что я не могу вывести в CODE:HotKey=CreateWindow(0, "msctls_hotkey32", "", WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 10, 140, 24, gethwnd(0), 0, 0, 0); установленный в прошлой сессии хоткей. В поле пишет "нет". |
|
|
Zireael |
Отправлено: 22 Декабря, 2021 - 19:51:34
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: А как сохранить установленный хоткей и автоматически загрузить при повторном запуске программы?
Сохранять в файл значение переменной Key, при запуске скрипта прочитать файл и установить хоткей.
CODE:#define HKM_SETHOTKEY 0x401
sendmessage(HKM_SETHOTKEY, Key, 0, formatiw(HotKey));
Для примера в function getmessage(0, WM_CREATE) добавить:
CODE:sendmessage(HKM_SETHOTKEY, 602, 0, formatiw(HotKey));
в поле будет введено Ctrl+Z. |
|
|
KevinS |
Отправлено: 22 Декабря, 2021 - 20:05:14
|
Мастер
Покинул форум
Сообщений всего: 218
Дата рег-ции: Февр. 2020
Репутация: 2
|
Zireael пишет: Цитата: А как сохранить установленный хоткей и автоматически загрузить при повторном запуске программы?
Сохранять в файл значение переменной Key, при запуске скрипта прочитать файл и установить хоткей.
CODE:#define HKM_SETHOTKEY 0x401
sendmessage(HKM_SETHOTKEY, Key, 0, formatiw(HotKey));
Для примера в function getmessage(0, WM_CREATE) добавить:
CODE:sendmessage(HKM_SETHOTKEY, 602, 0, formatiw(HotKey));
в поле будет введено Ctrl+Z.
Огромное при огромное тебе спасибо! |
|
|
Zireael |
Отправлено: 24 Декабря, 2021 - 17:02:52
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Как можно временно отключить
В скрипт добавить переменную:
и таймер:
CODE:CREATE_TIMER(0, 2000)
{
disable=0;
disabletimer(0);
}
В обработчике проверить значение переменной.
CODE:function getmessage(0, WM_HOTKEY)
{
if(disable)return; // если не 0, выход
if(message.wparam==HotKeyId)
{
disable=1;
enabletimer(0); // включить таймер
messagebox("Нажат Хоткей^r^nДальнейшие действия");
}
} |
|
|
|