HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
1016
ゆっくりXPキーを自分で設定できるようにしたい9解決


ゆっくりXP

リンク

2023/10/16(Mon) 19:45:37|NO.100275

↓こんな感じのようにすることは可能でしょうか?自分でgetkeyとかで使うキーを設定できるようにしたいです。
https://twitter.com/Yukkuri_XP/status/1713868354061320369/photo/1



この記事に返信する


沢渡

リンク

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



ゆっくりXP

リンク

2023/10/17(Tue) 17:28:49|NO.100293

すいません。非アクティブでもホットキーが検出ができるようにしたいです。
ホットキーが押されたらウィンドウを表示できるようにしたいので…。



ゆっくりXP

リンク

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



ゆっくりXP

リンク

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キーはデバッガー用で登録すべきではないそうです。



ゆっくりXP

リンク

2023/10/22(Sun) 17:00:29|NO.100337

皆さん回答ありがとうございました!



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.100275への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2023(c) All rights reserved.