|
|
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
|
|
2008/4/1(Tue) 22:25:50|NO.14765
WM_COMMAND または WM_NOTIFY が送られてきたときに、objsel で他のオブジェクトに
フォーカスを移せば大丈夫だとおもいます。
|
|
2008/4/2(Wed) 12:34:36|NO.14774
回答ありがとうございます。
うーん、状態が変わったら修正するという方向ではなくてスペースバーで反応しないようにしたい
わけです。これはbuttonでも同じことですがスペースバーでラベルに飛んで行ってしまうようなこと
がないようにしたいのですが・・・windowsの仕様?
|
|
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 //反映する
}
}
|
|
2008/4/2(Wed) 22:10:48|NO.14788
>これはどうですか?
これもやはりスペースバーに反応していますね。これはマウスクリックの代わりにキーボード
でも対応できるWindowsの親切心だと思うのですが余計なお世話という時もあるのでこの機能を
外せるものなら外したいのです。スペースバーだけでなく+−キーにも反応します。
|
|
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
|
|
2008/4/2(Wed) 22:49:24|NO.14790
↑文での変更する方向逆だった。
|
|
2008/4/3(Thu) 22:14:13|NO.14816
>反応をユーザーが書く。
うむー、BS_AUTOCHECKBOXをBS_CHECKBOXに変更しても自動でチェックが付かないだけでスペースバー
には反応していますね。chkboxがbuttonだったとしたらスペースバーを押したとたんにjamp先に
飛んでしまいます。要はマウスクリックだけに反応してキーボードに反応しないようにしたい
のです。一時的にキーボードを無効にすることでも良いですが・・・。
|
|
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
|
|
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
|
|
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
|
|
2008/4/4(Fri) 22:01:26|NO.14857
>もっと楽な方法がありました。
これだ !
私の望んでいた回答がこれです。質問の趣旨が曖昧だったためchkboxのみにこだわった回答いただき
ましたが私としてはbuttonも同じコントロールと考えているのでどちらもスペースバーに反応しない
方法が無いかと質問した次第です。chkboxでもbuttonでもこれならスペースバーを無効にできますね。
keybd_event は使えそうなAPIと思っていましたがいまいち使い方が分かりませんでした。
keybd_event 0x32, $00000002
がどういう動作をするのか説明してもらえませんか?
またonkey で割り込みを受けるところがミソでoncmdではだめですね。oncmdは割り込んだ後の結果
だから?
|
|
2008/4/4(Fri) 23:03:59|NO.14861
oncmdはHSPウィンドウに対して割り振られるプロシージャですので、
buttonなどの子ウィンドウ上では使えないようです。
ただ、ちょうどonkeyはHSP画面上であればどこでも反応するので
使わなない手はありません。
>keybd_event 0x32, $00000002
は、0x32 つまりスペースキーで $00000002 で キーを離す という処理になります。
オブジェクトボタンを押したというメッセージを送る前に 離してしまったというところでしょうか。
|
|
2008/4/5(Sat) 06:02:11|NO.14872
短い、簡単なスクリプトだけどインタプリタの面白さが出てるなぁ
勉強になった
|
|
2008/4/5(Sat) 07:18:50|NO.14874
チェックは付けないの?
|
|
2008/4/5(Sat) 21:10:31|NO.14902
理由はよくわかりませんが、32,2以外なら何を指定してもいいみたいですね。
ただし、p2については1のビットも2のビットも寝ている値はやばいです。
1のビットを立てたら結局スペースキー以外を指定したことになるので、
p1を変えたのと同じといえば同じです。
|
|
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で動作させる"と言う前提が読み取りずらい。。。
もっと別な動作を目的とするなら最初にそのすべてを明確に示すべきであって
書き足りなかった場合はまたそれをそのつど"目的・目標"として明確に示したほうが早く、また良い結果が得られるのでは。。。っと。
|
|
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
|
|
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付属の電卓で調べてみてください
|
|
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ですが?
質問の趣旨はおかげさまで解決しているので一応解決チェックしておきます。
|
|