hspでマウスがふれたら画像を出すというプログラムを作りたいのですが...
koya 2013/5/17(Fri) 18:26:06|NO.54086
Windows8のチャーム機能のようなもの(ディスプレイの端にマウスが来ると画像が出る)を作りたいのですが、
oncmd gosub *mousemove, $200
stop
*mousemove
return
このスクリプトを使って作れないでしょうか?
結果がこんな感じになるのを教えてください
chgdisp 1,1366,768
bgscr 0,1366,768,,0,0
xx=0:yy=0
buffer 1
picload"img/ce.png": gsel 0
repeat
redraw 0
if mousex!0 : mx=mousex
if mousey!0 : my=mousey
if xx<mx&1380+10>mx & yy<my&yy+10>my {
pos 1280,0
objimage 1,0,0,0,0,0,0
objsize 87,768
button "",*sm
wait 100
clrobj 0,-1
}
redraw 1
wait 1
loop
*sm
dialog "画像です"
お願いします
test 2013/5/17(Fri) 18:43:14|NO.54087
サンプルスクリプトは画像などを使わずboxfなどで代替し、誰でも簡単に実行できるようにすると見てもらえます。
そのサンプルスクリプトではウィンドウ上のマウス座標を用いて判定していますから、そのかわりにスクリーン上のマウス座標が分かればいいわけです。
スクリーン上のマウス座標を得る方法は調べれば簡単にわかります。
koya 2013/5/17(Fri) 19:00:11|NO.54088
すいません。
一番目のスクリプトはこれです。
oncmd gosub *mousemove, $200
stop
*mousemove
title "X: "+mousex+" / Y: "+mousey+" || "+wparam+""
return
調べましたが、よくわかりませんでした。
できれば、スクリプト、などを書いていただけないでしょうか
test 2013/5/17(Fri) 20:36:12|NO.54093
申し訳ありません。ウィンドウメッセージの仕様をよく調べずに回答しました。
oncmdを使った方法だと、WM_MOUSEMOVEが自分のウィンドウ上しか送られて来ないので、画面全体を動くマウスの動きを取得することはできないようです。
グローバルフックというものをつかえばできないことはないですが、HSPでは難しいようです。
HSPで簡単に実現したい場合は、二番目のスクリプトと同様の手法を使えばできます。やはりmousex,mouseyを使うとウィンドウ上のマウス位置しか分からないので、代わりにスクリーン全体でのマウス位置を取得して使います。
スクリーン全体でのマウス座標の取得方法を調べるには、エディタでF1を押して開いたヘルプで「マウス スクリーン」とかで検索してみましょう。
ht. 2013/5/17(Fri) 21:07:13|NO.54094
とりあえずウインドウ外からクライアント座標を得るスクリプトです。
ディスプレイの縁にマウスカーソルがあるかどうか調べたいならScreenToClientを除去してginfo_dispxなどと比較してください。
#include "user32.as"
dim pt, 2
repeat
GetCursorPos varptr(pt)
ScreenToClient hwnd, varptr(pt)
pos 0, 0 : color 255, 255, 255 : boxf : color
mes "X: " + pt.0
mes "Y: " + pt.1
wait 3
loop
123 2013/5/17(Fri) 21:32:19|NO.54095
マウスの動きだけだけど
repeat
redraw 0
color 0,0,0
boxf
color 255,255,255
pos 0,0
mes ginfo(0)
mes ginfo(1)
redraw 1
await
loop
ぴょぴょ 2013/5/18(Sat) 09:21:12|NO.54100
> とりあえずウインドウ外からクライアント座標を得るスクリプトです。
> ディスプレイの縁にマウスカーソルがあるかどうか調べたいならScreenToClientを除去してginfo_dispxなどと比較してください。
私も最初は「GetCursorPos」関数を使う事を考えてました。
しかし、マニュアルを見たら ginfo_mx、ginfo_my でスクリーン座標でもマウス位置が分かるようです。
きっと内部では、GetCursorPos 関数で取得してるでしょうがね。
// マクロ関数
#define ctype CheckScreenLeft(%1) (ginfo_mx == (0))
#define ctype CheckScreenRight(%1) (ginfo_mx == (ginfo_dispX-1))
#define ctype CheckScreenTop(%1) (ginfo_my == (0))
#define ctype CheckScreenBottom(%1) (ginfo_my == (ginfo_dispY-1))
// メイン部
*Main
mes "デスクトップの画面端にマウス移動するとダイアログが出現します。"
mes "なお、画面端とは、左端、右端、上端、下端の1ドット幅のことです。"
repeat
if CheckScreenLeft() : dialog "左端のウインドウ出現",0,"確認"
if CheckScreenRight() : dialog "右端のウインドウ出現",0,"確認"
if CheckScreenTop() : dialog "上端のウインドウ出現",0,"確認"
if CheckScreenBottom() : dialog "下端のウインドウ出現",0,"確認"
wait 10 ;0.1秒単位
loop
stop
↑
これがサンプルです。
0.1秒単位で監視してるシンプル方法です。
koya 2013/5/18(Sat) 12:11:18|NO.54107
本当に何度もすいません。
実は、このスクリプトの前に、ボタンなどの命令があるのですが、
repeat でループしてしまうと、ボタンが表示されなくなってしまいます。
それで、調べたのが二つ目のスクリプトなのですが、
repeat なしで、同じようなものを作れないでしょうか...
ぴょぴょ 2013/5/18(Sat) 12:18:45|NO.54108
> 実は、このスクリプトの前に、ボタンなどの命令があるのですが、
> repeat でループしてしまうと、ボタンが表示されなくなってしまいます。
ん?
それならば先にボタンを表示してからループ監視に入れば良いと思うが…。
基本的にループ中でもボタンが押されると
強制的にボタン用のラベルにジャンプしますよね。
暇人 2013/5/18(Sat) 14:37:46|NO.54113
>実は、このスクリプトの前に、ボタンなどの命令があるのですが、
そのボタンは何処に配置してるの?
> repeat でループしてしまうと、ボタンが表示されなくなってしまいます。
それはrepeatの問題ではなくスクリプトの流れに問題があるんじゃ?
何故repeatを無くす方向に行くのか・・・
wsx=80
bgscr 0,wsx,ginfo_dispy,2,ginfo_dispx-wsx,0
syscolor 4
boxf
buffer 1
picload dir_exe+"\\sample\\hsp3dish\\hsplogo8.png"
bsx=ginfo_sx
bsy=ginfo_sy
gsel 0
pos 0,20
button "終了",*exit
objimage 1,0,0,0,0,0,0
objsize bsx,bsy
button gosub "",*sm
hxy=10
repeat
mx=ginfo_mx
my=ginfo_my
if (mx\(ginfo_dispx-hxy))<hxy or (my\(ginfo_dispy-hxy))<hxy {
if (gsel_mode ! 2) {gsel_mode=2:gsel 0,gsel_mode}
wait_fps=100
}else{
if wait_fps>0 {
if mx<(ginfo_dispx-wsx) {
redraw 0
syscolor 4
boxf
pos 4,4
color
mes wait_fps
redraw 1
wait_fps--
}
}else{
if gsel_mode=2 {gsel_mode=-1:gsel 0,gsel_mode:syscolor 4:boxf}
}
}
await 10
loop
*sm
dialog "画像です"
return
*exit
end
waitじゃ無くawait使ってるのはwaitにバグがあるっぽく
wait 1 だとウェイト時間が不安定になる事があるので・・・(3.32β2ごろには既におかしい・・・)
123 2013/5/18(Sat) 23:21:42|NO.54128
リピートで監視するか
マウスが動いたときに判定して
ボタンの上には描画しない。