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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0517
koyahspでマウスがふれたら画像を出すというプログラムを作りたいのですが...10未解決


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

リピートで監視するか
マウスが動いたときに判定して
ボタンの上には描画しない。



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