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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0401
knock2chkboxの素朴な疑問21解決


knock2

リンク

2008/4/1(Tue) 12:35:47|NO.14750

chkbox "test",ff

チェックボックスにフォーカスしてからスペースバーを押すとチェックのon/offができますが これを無効にする(マウスクリックのみ有効)ことはできますか?



この記事に返信する


いでじま

リンク

2008/4/1(Tue) 15:49:03|NO.14753

すごく操作する側からすると不自然かもしれませんが、他のプロセスの動作にも影響を与えないように考えるとこれしかないのでしょうか…?
この関連詳しくないので、他の方のを待ったほうが良いかもしれません。

chkbox "test",a cbxid=stat repeat wait 1 stick st if st=16:objprm cbxid,1-a loop



As

リンク

2008/4/1(Tue) 22:25:50|NO.14765

WM_COMMAND または WM_NOTIFY が送られてきたときに、objsel で他のオブジェクトに
フォーカスを移せば大丈夫だとおもいます。



knock2

リンク

2008/4/2(Wed) 12:34:36|NO.14774

回答ありがとうございます。

うーん、状態が変わったら修正するという方向ではなくてスペースバーで反応しないようにしたい
わけです。これはbuttonでも同じことですがスペースバーでラベルに飛んで行ってしまうようなこと
がないようにしたいのですが・・・windowsの仕様?



inovia

リンク

2008/4/2(Wed) 13:17:30|NO.14776

これはどうですか?

chkbox "test",ff //OBJ ID0 onkey goto *test //キーの入力をチェック *test if iparam=32{ //スペースキーのみ検出 objsel -1 //アクティブなオブジェクトを検索 if stat=0:{ //OBJ IDが0の時 if ff=0:{ff=1}else{ff=0} //選択されている内容を反転 objprm 0,ff //反映する } }



knock2

リンク

2008/4/2(Wed) 22:10:48|NO.14788

>これはどうですか?

これもやはりスペースバーに反応していますね。これはマウスクリックの代わりにキーボード
でも対応できるWindowsの親切心だと思うのですが余計なお世話という時もあるのでこの機能を
外せるものなら外したいのです。スペースバーだけでなく+−キーにも反応します。



begriff

リンク

2008/4/2(Wed) 22:48:02|NO.14789

BS_CHECKBOXからBS_AUTOCHECKBOXへ変更 これによって全般反応しなくなったので反応をユーザーが書く。
マウスがコントロールの上に来たときの左マウスクリックだけに反応するようにしました

#uselib "user32.dll" #func SetWindowLong "SetWindowLongA" int,int,int #cfunc GetFocus "GetFocus" chkbox "test",ff ff2=ff id=stat SetWindowLong objinfo(id,2),-16,$52000002 oncmd gosub *ok,$4E repeat getkey c,1 if c&c1=0:c1=1:gosub *cil if c=0:c1=0 wait 1 loop *ok dupptr nmhdr, lparam, 12 if nmhdr.0 = objinfo(id,2)&nmhdr.2=-1249{ if k=1:k=0:else:k=1 logmes ""+k } return *cil if k=1&GetFocus()=objinfo(id,2){ objprm id,1-ff2 if ff2=0:ff2=1:else:ff2=0 } return



begriff

リンク

2008/4/2(Wed) 22:49:24|NO.14790

↑文での変更する方向逆だった。



knock2

リンク

2008/4/3(Thu) 22:14:13|NO.14816

>反応をユーザーが書く。

うむー、BS_AUTOCHECKBOXをBS_CHECKBOXに変更しても自動でチェックが付かないだけでスペースバー
には反応していますね。chkboxがbuttonだったとしたらスペースバーを押したとたんにjamp先に
飛んでしまいます。要はマウスクリックだけに反応してキーボードに反応しないようにしたい
のです。一時的にキーボードを無効にすることでも良いですが・・・。



As

リンク

2008/4/3(Thu) 22:27:02|NO.14817

>>うーん、状態が変わったら修正するという方向ではなく


一応こんなかんじになります
かなり簡単ですが

chkbox "test",ff hchk=objinfo(stat,2) oncmd *ON_WM_COMMAND, $00000111 pos -1000,21 : button "Dammy",*dammy stop *ON_WM_COMMAND if hchk=lparam{ objsel 1 } stop *dammy stop



As

リンク

2008/4/3(Thu) 22:38:39|NO.14819

もっと楽な方法がありました。
スペース押されたらメッセージ奪って無理やり離すだけです。


#uselib "user32.dll" #func keybd_event "keybd_event" int,nullptr,int,nullptr chkbox "test",ff iChk=stat onkey gosub *key stop *key objsel -1 if (stat=iChk)&(iparam=32){ keybd_event 0x32, $00000002 } return



nodon

リンク

2008/4/3(Thu) 23:04:48|NO.14824

ジャンプしないのだったらこんな感じでどうですか?


#uselib "user32.dll" #func SetWindowLong "SetWindowLongA" int,int,int chkbox "test",ff id=stat SetWindowLong objinfo(id,2),-16,$52000002 oncmd gosub *ok,0x111 repeat getkey c,1 oncmd c wait 1 loop *ok objprm id,1-ff mes "ジャンプした" return



knock2

リンク

2008/4/4(Fri) 22:01:26|NO.14857

>もっと楽な方法がありました。

これだ !
私の望んでいた回答がこれです。質問の趣旨が曖昧だったためchkboxのみにこだわった回答いただき
ましたが私としてはbuttonも同じコントロールと考えているのでどちらもスペースバーに反応しない
方法が無いかと質問した次第です。chkboxでもbuttonでもこれならスペースバーを無効にできますね。

keybd_event は使えそうなAPIと思っていましたがいまいち使い方が分かりませんでした。
keybd_event 0x32, $00000002
がどういう動作をするのか説明してもらえませんか?
またonkey で割り込みを受けるところがミソでoncmdではだめですね。oncmdは割り込んだ後の結果
だから?



As

リンク

2008/4/4(Fri) 23:03:59|NO.14861

oncmdはHSPウィンドウに対して割り振られるプロシージャですので、
buttonなどの子ウィンドウ上では使えないようです。


ただ、ちょうどonkeyはHSP画面上であればどこでも反応するので
使わなない手はありません。


>keybd_event 0x32, $00000002
は、0x32 つまりスペースキーで $00000002 で キーを離す という処理になります。


オブジェクトボタンを押したというメッセージを送る前に 離してしまったというところでしょうか。



s

リンク

2008/4/5(Sat) 06:02:11|NO.14872

短い、簡単なスクリプトだけどインタプリタの面白さが出てるなぁ
勉強になった



船丸

リンク

2008/4/5(Sat) 07:18:50|NO.14874

チェックは付けないの?



knock2

リンク

2008/4/5(Sat) 17:55:16|NO.14898

皆さんありがとうございます。

最後にもう一度お願いします。

>0x32 つまりスペースキーで $00000002 で キーを離す という処理になります。

0x32 はスペースキーのキーコードですが keybd_eventで指定している仮想キーコードは0x20では
ないですか?↓
http://yokohama.cool.ne.jp/chokuto/urawaza/prm/virtual_key_code.html



ANTARES

リンク

2008/4/5(Sat) 21:10:31|NO.14902

 理由はよくわかりませんが、32,2以外なら何を指定してもいいみたいですね。
ただし、p2については1のビットも2のビットも寝ている値はやばいです。
1のビットを立てたら結局スペースキー以外を指定したことになるので、
p1を変えたのと同じといえば同じです。



begriff

リンク

2008/4/6(Sun) 01:15:45|NO.14910

かなり気になったので書かせていただきます。

>>チェックボックスにフォーカスしてからスペースバーを押すとチェックのon/offができますがこれを無効にする(マ
>>ウスクリックのみ有効)ことはできますか?

>>うむー、BS_AUTOCHECKBOXをBS_CHECKBOXに変更しても自動でチェックが付かないだけでスペースバー
>>には反応していますね。chkboxがbuttonだったとしたらスペースバーを押したとたんにjamp先に
>>飛んでしまいます。要はマウスクリックだけに反応してキーボードに反応しないようにしたい
>>のです。一時的にキーボードを無効にすることでも良いですが・・・。

>>私の望んでいた回答がこれです。質問の趣旨が曖昧だったためchkboxのみにこだわった回答いただき
>>ましたが私としてはbuttonも同じコントロールと考えているのでどちらもスペースバーに反応しない
>>方法が無いかと質問した次第です。chkboxでもbuttonでもこれならスペースバーを無効にできますね。

同じウィンドウクラスなので部類としては同じですが。。。


最初にちゃんと実質なにがしたいのかをちゃんと示しさなければ私のように空振ります。私のスクリプトは

>>スペースバーを押すとチェックのon/offができますがこれを無効にする
という初頭の目的は果たせているので(フォーカスは移るが)。
ボタンでは動作してしまうが、

>>これはbuttonでも同じことですがスペースバーでラベルに飛んで行ってしまうようなこと
>>がないようにしたいのですが
この文脈からだと、"buttonで動作させる"と言う前提が読み取りずらい。。。

もっと別な動作を目的とするなら最初にそのすべてを明確に示すべきであって
書き足りなかった場合はまたそれをそのつど"目的・目標"として明確に示したほうが早く、また良い結果が得られるのでは。。。っと。



begriff

リンク

2008/4/6(Sun) 01:23:49|NO.14911

もう、超必要ないけど違う方法を。。。※それもあんまり良い動作はしないかも
#uselib "user32.dll"
#func SetWindowLong "SetWindowLongA" int,int,int #cfunc GetFocus "GetFocus" #func SetFocus "SetFocus" int hwnd_=hwnd chkbox "test",ff ff2=ff id=stat SetWindowLong objinfo(id,2),-16,$52000002 oncmd gosub *ok,$4E repeat getkey c,1 if c&c1=0:c1=1:gosub *cil if c=0:c1=0 if GetFocus()=objinfo(id,2):setfocus hwnd_ wait 1 loop *ok dupptr nmhdr, lparam, 12 if nmhdr.0 = objinfo(id,2)&nmhdr.2=-1249{ if k=1:k=0:else:k=1 logmes ""+k } return *cil if k=1&GetFocus()=objinfo(id,2){ objprm id,1-ff2 if ff2=0:ff2=1:else:ff2=0 } return



As

リンク

2008/4/6(Sun) 02:14:50|NO.14912

>0x32 はスペースキーのキーコードですが keybd_eventで指定している仮想キーコードは0x20では
>ないですか?↓
>http://yokohama.cool.ne.jp/chokuto/urawaza/prm/virtual_key_code.html


ここに書いているのは正確には16進数ではなく10進数のコード表です。
といっても、間違いではなく、MSDN上などで16進数として表記されている
からこういった勘違いになってしまうんだとおもいます。

仮想キーコードはそもそも1〜254までの10進数であらわします。
つまり、0xをつけずに”20”とだけ入力しても”0x32”とあらわしたことと
なんら変わりはありません。よく誤植で”0x20”としてしまうサイトさんもいるようですが、
ちょくとさんのページには”0x”はついてませんよね?
これが正しい表記です。かいてあるとおり20としても0x32としてもどちらでも構いません。
ただ、”VK_SPACE”が20として定義されているので20を使ったほうがいいかもしれません。


10進数の変換などはWindows付属の電卓で調べてみてください



knock2

リンク

2008/4/6(Sun) 21:07:08|NO.14927

皆さんありがとうございます。

begriffさん
>もっと別な動作を目的とするなら最初にそのすべてを明確に示すべきであって

ごもっともです。途中で気が付いて
>これはbuttonでも同じことですがスペースバーでラベルに飛んで行ってしまうようなこと
>がないようにしたいのですが・・・windowsの仕様?
とか
>質問の趣旨が曖昧だったためchkboxのみにこだわった回答いただき
>ましたが私としてはbuttonも同じコントロールと考えているのでどちらも
でフォローしたつもりでしたがご迷惑おかけしました。

Asさん、しつこいようですが、ちょっと納得いかないのでもう一度。

その前に一つ訂正しておきます。
>0x32 はスペースキーのキーコードですが・・・
誤0x32→正32
 
>ここに書いているのは正確には16進数ではなく10進数のコード表です。
>ちょくとさんのページには”0x”はついてませんよね?

表のTOPに値(16進数)と明記されていますし、例えばVK_ESCAPEの1B は16進数ですよね。

>0xをつけずに”20”とだけ入力しても”0x32”とあらわしたことと
>なんら変わりはありません。

10進数20は16進数で0x14、16進数0x20は10進数で32、16進数0x32は10進数で50ですが?

質問の趣旨はおかげさまで解決しているので一応解決チェックしておきます。



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