| 
					 
							
													 
							
						 
						
 
 | 
 | 
 
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 
皆さん回答ありがとうございました! 
 
 |   
  
					 |