|
|
2023/10/16(Mon) 19:45:37|NO.100275
|
|
2023/10/17(Tue) 13:01:57|NO.100291
GetKeyboardStateでキーの状態を丸ごと取得するのはどうでしょうか。
#include "user32.as"
sdim k_state,256
repeat
GetKeyboardState varptr(k_state)
//↑これを実行するとk_stateの256個のバイトそれぞれに
//仮想キーコードの状態が入る。
//押されている状態だと最上位ビット(0x80)が立つ。
redraw 0
color 255,255,255 : boxf : color 0,0,0
repeat 256
pos cnt\16*30,cnt/16*20
mes strf("%02X",peek(k_state,cnt))
loop
redraw 1
await 33
loop
以下はShit+Ctrl+F12を検出する例です。
#include "user32.as"
sdim k_state,256
repeat
GetKeyboardState varptr(k_state)
//仮想キーコードは、Shiftは0x10(左右共通)、
//Ctrlは0x11(左右共通)、F12は0x7B
if peek(k_state,0x10)&peek(k_state,0x11)&peek(k_state,0x7B)&0x80 {
dialog "Shift + Ctrl + F12"
}
await 33
loop
|
|
2023/10/17(Tue) 17:28:49|NO.100293
すいません。非アクティブでもホットキーが検出ができるようにしたいです。
ホットキーが押されたらウィンドウを表示できるようにしたいので…。
|
|
2023/10/17(Tue) 18:24:06|NO.100297
getkeyの方だと非アクティブでキーの取得はできるのですが、入力ボックスが選択された状態でF1が押されたら、F1と入力ボックスに表示させるようにしたいのですができないのでしょうか?
screen 0,400,150
_ctrl = 1
mes "ホットキーの設定"
chkbox "Shift",_shift
chkbox "Ctrl",_ctrl
chkbox "Alt",_alt
sdim keys
input keys
repeat
await 16
if _shift{
getkey shift,0x10
}else{
shift = 1
}
if _ctrl{
getkey ctrl,0x11
}else{
ctrl = 1
}
if _alt{
getkey alt,0x12
}else{
alt = 1
}
if (shift) & (ctrl) & (alt){
getkey anykey, //ここで設定された押された設定のキーを検出
if anykey:dialog "キーが押されました"
}
loop
https://twitter.com/Yukkuri_XP/status/1714209641826332791
|
|
2023/10/17(Tue) 19:43:56|NO.100298
ShiftやCtrlはgetkeyで取得するようにして、他はonkeyで取得するようにしてみましたが、
これでどうでしょうか?
#include "user32.as"
screen 0,400,150
_ctrl = 1
mes "ホットキーの設定"
chkbox "Shift",_shift
chkbox "Ctrl",_ctrl
chkbox "Alt",_alt
sdim keys
input keys : id_inp=stat : h_inp=objinfo(id_inp,2)
onkey gosub *key
stop
*key
GetFocus : if stat!=h_inp : return //入力ボックスにフォーカスが当たっている時のみ
if _shift{
getkey shift,0x10
}else{
shift = 1
}
if _ctrl{
getkey ctrl,0x11
}else{
ctrl = 1
}
if _alt{
getkey alt,0x12
}else{
alt = 1
}
if (shift) & (ctrl) & (alt){
if wparam>=0x70 & wparam<=0x87 : objprm id_inp,"F"+str(wparam-0x6F) //F1〜F24まで対応させてみる
}
return
ただ、AtlについてはCtrlやShiftに比べてもかなり特殊なキーで、
これが絡む場合はコールバック関数を必要とする等、かなり話がややこしくなる様子なのですよね…。
|
|
2023/10/18(Wed) 16:15:35|NO.100301
こんにちは。ホットキーの設定について、実はホットキーコントロールというものがWindowsに標準であります。
https://learn.microsoft.com/ja-jp/windows/win32/controls/hot-key-controls
久しぶりにサンプルを書いてみたのでどうぞ。
#include "user32.as"
#define HKM_GETHOTKEY 0x402
#define HKM_SETHOTKEY 0x401
#define HOTKEYF_ALT 0x4
#define HOTKEYF_CONTROL 0x2
#define HOTKEYF_EXT 0x8
#define HOTKEYF_SHIFT 0x1
#define WS_CHILD 0x40000000
#define WS_VISIBLE 0x10000000
// ホットキーコントロール作成
winobj "msctls_hotkey32", "", 0, WS_CHILD | WS_VISIBLE, 200, 30
hHotkeyCtrl = objinfo_hwnd(stat)
// ホットキー設定
sendmsg hHotkeyCtrl, HKM_SETHOTKEY, 'A', 0
objsize 200
button gosub "ホットキー取得", *gethotkey
stop
// ホットキー取得
*gethotkey
sendmsg hHotkeyCtrl, HKM_GETHOTKEY, 0, 0
hotkey = stat
// 仮想キーコード(下位8bit)
vtKey = hotkey & 0xFF
// 修飾キーコード(上位8bit)
modKey = (hotkey >> 8) & 0xFF
isCtrl = modkey & HOTKEYF_CONTROL
isShift = modkey & HOTKEYF_SHIFT
isAlt = modkey & HOTKEYF_ALT
isExt = modkey & HOTKEYF_EXT
// 見やすく文字列に変換してみる
output = ""
if (hotkey == 0) {
output = "なし"
} else {
if (modkey != 0) {
if (isCtrl) : output += "Ctrl + "
if (isShift) : output += "Shift + "
if (isAlt) : output += "Alt + "
if (isExt) : output += "Ext + "
}
keyName = ""
keyScanCode = MapVirtualKey(vtKey, 0) // MAPVK_VK_TO_VSC
GetKeyNameText keyScanCode << 16 , varptr(keyName), varsize(keyName)
output += keyName
}
mes output
return
また、実際にホットキーを登録するにはRegisterHotKey関数というのを使います。ホットキー押下時にWM_HOTKEYメッセージが送られてくるので、oncmdで割り込み処理をするだけです。
https://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-registerhotkey
| |
|
2023/10/18(Wed) 16:36:49|NO.100302
そんな便利なものがあったとは……。
やってみましたが、非アクティブでも検知されますし、Altと文字キーの組み合わせも検出できるようですね。
#include "user32.as"
#const MOD_ALT 1
#const MOD_CONTROL 2
#const MOD_SHIFT 4
#const MOD_WIN 8
#const WM_HOTKEY 0x0312
RegisterHotKey hwnd,1,MOD_CONTROL|MOD_SHIFT,0x7B //Shift+Ctrl+F12
RegisterHotKey hwnd,2,MOD_ALT,0x50 //Alt+P(Alt+ファンクションキーの組み合わせはできない?)
onexit *exit
oncmd gosub *hot,WM_HOTKEY
stop
*hot
if wparam=1 : dialog "[Shift]+[Ctrl]+[F12]"
if wparam=2 : dialog "[Alt]+[P]"
return
*exit
UnregisterHotKey hwnd,1
UnregisterHotKey hwnd,2
end
|
|
2023/10/19(Thu) 17:42:16|NO.100307
こんな感じでいいのでしょうか?
あと、Shift + F12だけなぜか検出されないのですが、これはWindowsの仕様なのでしょうか?
#include "user32.as"
#define global MOD_ALT 1
#define global MOD_CONTROL 2
#define global MOD_SHIFT 4
#define global MOD_WIN 8
#define global WM_HOTKEY 0x0312
#define HKM_GETHOTKEY 0x402
#define HKM_SETHOTKEY 0x401
#define HOTKEYF_ALT 0x4
#define HOTKEYF_CONTROL 0x2
#define HOTKEYF_EXT 0x8
#define HOTKEYF_SHIFT 0x1
#define WS_CHILD 0x40000000
#define WS_VISIBLE 0x10000000
winobj "msctls_hotkey32", "", 0, WS_CHILD | WS_VISIBLE, 200, 30
hHotkeyCtrl = objinfo_hwnd(stat)
// ホットキー設定
sendmsg hHotkeyCtrl, HKM_SETHOTKEY, 'A', 0
objsize 200
button gosub "ホットキー取得", *gethotkey
button "テスト",*test
stop
// ホットキー取得
*gethotkey
sendmsg hHotkeyCtrl, HKM_GETHOTKEY, 0, 0
hotkey = stat
vtKey = hotkey & 0xFF
modKey = (hotkey >> 8) & 0xFF
isCtrl = modkey & HOTKEYF_CONTROL
isShift = modkey & HOTKEYF_SHIFT
isAlt = modkey & HOTKEYF_ALT
isExt = modkey & HOTKEYF_EXT
// 見やすく文字列に変換してみる
output = ""
if (hotkey == 0) {
output = "なし"
} else {
if (modkey != 0) {
if (isCtrl) : output += "Ctrl + "
if (isShift) : output += "Shift + "
if (isAlt) : output += "Alt + "
if (isExt) : output += "Ext + "
}
keyName = ""
keyScanCode = MapVirtualKey(vtKey, 0) // MAPVK_VK_TO_VSC
GetKeyNameText keyScanCode << 16 , varptr(keyName), varsize(keyName)
output += keyName
}
dialog "ホットキーを"+output+"に設定"
return
*test
cls
mes "設定されたキーを入力"
mod_key = 0
if isCtrl:mod_key = mod_key | MOD_CONTROL
if isShift:mod_key = mod_key | MOD_SHIFT
if isAlt:mod_key = mod_key | MOD_ALT
oncmd gosub *hot,WM_HOTKEY
RegisterHotKey hwnd,1,mod_key,vtKey
onexit *exit
stop
*hot
if wparam=1:dialog output+"が押されました。"
return
*exit
UnregisterHotKey hwnd,1
end
| |
|
2023/10/21(Sat) 15:10:54|NO.100319
それで良いと思います。
RegisterHotKey関数のドキュメントに書いてあったのですが、F12キーはデバッガー用で登録すべきではないそうです。
|
|
2023/10/22(Sun) 17:00:29|NO.100337
皆さん回答ありがとうございました!
|
|