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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0202
蒟蒻砂漠hspdishでalt無効2未解決


蒟蒻砂漠

リンク

2018/2/2(Fri) 10:51:56|NO.82388

最近HSPDISHを使い始めた者です。
タイトルの通りHSPDISHでaltとf10を押したときにプログラムを止めない方法を探しています。
普通のhsp用のalt無効プログラムはhspdishではサポート外の命令を使っていたため
使うことができませんでした。



この記事に返信する


あまら

リンク

2018/2/3(Sat) 01:04:56|NO.82391

> 普通のhsp用のalt無効プログラム
どれの事でしょう?という疑問は置いておくとして。

いずれにしても、おそらくon〜系の割り込み命令を使っているものでしょうから、
いまのところdishでは使えないんですよね。

APIでなんとかするとか色々方法はありますが、
結局Windows依存になるのでわざわざdishでやる意味が無い気もします。

とか思いつつも少し気にはなったのでやるだけやってみました。
一番シンプルな方法として
http://hsp.tv/play/pforum.php?mode=pastwch&num=31910
こちらのChokokoさんのソースに手を加えさせていただきました。
#include "hsp3dish.as"
#uselib "user32.dll" #func keybd_event "keybd_event" int,int,int repeat redraw 0 color 255,255,255 : boxf : color pos 0,0 :mes cnt // ALT getkey alt,18 if alt=1{;ALT連打 keybd_event 18,,$2; ALTキー押し上げ keybd_event 18; 再度ALTキー押し下げ keybd_event 18,,$2; ALTキー押し上げ } // F10 getkey f10,121 if f10=1{;F10連打 keybd_event 121,,$2; F10キー押し上げ keybd_event 121; 再度F10キー押し下げ keybd_event 121,,$2; F10キー押し上げ } redraw 1 await 50 loop
Chokokoさんも仰っていますが、あまりスマートなやり方ではありませんが
dishの限られた条件の中では最適だと思います。



あまら

リンク

2018/2/3(Sat) 20:09:08|NO.82397

Microsoftさんによると、keybd_event 関数ついて
>Windows NT/2000:この関数は、SendInput 関数に取って代わられています。
>この関数の代わりに SendInput を使ってください。


というわけでSendInput版も
#include "hsp3dish.as"
//入力タイプ(type) #const INPUT_KEYBOARD 1 // キーボードイベント //動作を指定するフラグ(dwFlags) #const KEYEVENTF_KEYDOWN 0x0 // キーを押す #const KEYEVENTF_KEYUP 0x2 // キーを離す // 仮想キーコード #const VK_MENU 0x12 // ALT #const VK_F10 0x79 // F10 #uselib "user32.dll" #func SendInput "SendInput" sptr, sptr, sptr #define MapVirtualKey MapVirtualKeyA #cfunc MapVirtualKeyA "MapVirtualKeyA" sptr, sptr // キーイベントの事前準備 dim pInputsA, 7, 3; ALT用入力イベント登録用配列 dim pInputsF, 7, 3; F10用入力イベント登録用配列 wScanA = MapVirtualKey( VK_MENU, 0 ); wScanF = MapVirtualKey( VK_F10, 0 ); // ALT用 挿入する入力イベントの配列 pInputsA(0, 0) = INPUT_KEYBOARD, VK_MENU|(wScanA<<16), KEYEVENTF_KEYUP; ALTキー押し上げ pInputsA(0, 1) = INPUT_KEYBOARD, VK_MENU|(wScanA<<16), KEYEVENTF_KEYDOWN; 再度ALTキー押し下げ pInputsA(0, 2) = INPUT_KEYBOARD, VK_MENU|(wScanA<<16), KEYEVENTF_KEYUP; ALTキー押し上げ // F10用 挿入する入力イベントの配列 pInputsF(0, 0) = INPUT_KEYBOARD, VK_F10|(wScanF<<16), KEYEVENTF_KEYUP; F10キー押し上げ pInputsF(0, 1) = INPUT_KEYBOARD, VK_F10|(wScanF<<16), KEYEVENTF_KEYDOWN; 再度F10キー押し下げ pInputsF(0, 2) = INPUT_KEYBOARD, VK_F10|(wScanF<<16), KEYEVENTF_KEYUP; F10キー押し上げ nInputs = 3; // 入力イベントの数 cbSize = 7 * 4; // 構造体のサイズ // メインループ repeat redraw 0; color 255,255,255: boxf; color 0, 0, 0: pos 0, 0; mes cnt; // ALT getkey alt, VK_MENU; if( alt ): SendInput nInputs, varptr(pInputsA), cbSize; // F10 getkey f10, VK_F10; if( f10 ): SendInput nInputs, varptr(pInputsF), cbSize; redraw 1; await 50; loop
メインループはシンプルになりましたが、それ以前が理解しにくいですね。



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