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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0518
roppyaku-Kマウスイベント6解決


roppyaku-K

リンク

2013/5/18(Sat) 00:52:54|NO.54098

マウスカーソルをキーボードで操作するツール を作っているのですが、
マウスイベント命令でどうしても分からないことがあります。
自分なりに調べてはみましたが、さっぱりわかりません。
;クイック加速処理(q)
if qkey=1 : speed=5 : ren=31
if qkey=0 : speed=1
;左クリック操作(w)
if wkey=2 : mouse_event $2
if wkey=-1: mouse_event $4
これは、おそらく問題となっている部分です。

Wキーにマウスの左クリックと同じ働きをさせる。のですが、
バグの内容は、
・HSP製ウィンドウ(このプログラムのウィンドウやHSPデバッグウィンドウ)を
 Wキークリックすると、全く関係ないと思われるマウスの移動速度が変動。
・さらに、mouse_event $4が実行されないのか、ドラック状態が持続する。
予期せぬ謎めいた動作をし、マウス又はトラックパッドからのクリックで
このバグは解除されます。

マウスの移動速度はQキーを押した時だけ加速させているのですが、なぜか、
HSP製ウィンドウをマウスイベントでクリックすると、上記のバグが発生します。
HSP製というか、プログラム内で生成されたウィンドウがです。
本体と簡易リアルタイムデバッグウィンドウとHSPデバッグウィンドウ。
HSPエディタではWキークリックしてもバグは発生しませんでした。



試しに、問題のプログラムと実行ファイルをアップしておきましたので。
・MCM本体をWキークリックで同様のバグが起こるか。
・別ウィンドウをWキークリックして、問題のバグは起きないか。
確認してみてください。



単純に僕の技術不足なのか、mouse_event自体のエラーなのか教えてほしいです。
http://www.geocities.jp/kamui_stst/dl/mcmplus_test0518.zip



この記事に返信する


roppyaku-K

リンク

2013/5/18(Sat) 00:56:48|NO.54099

連続投稿すみません。
URLがリンクになってますけど、アドレスバーに直接打ち込まないと
ページ見つかりませんエラーが出てDLできないようです。



暇人

リンク

2013/5/19(Sun) 02:37:12|NO.54138

>・さらに、mouse_event $4が実行されないのか、ドラック状態が持続する。

>;ドラック&ドロップ処理
> if mc=1 : sendmsg hwnd,$00A1,2,0
HSPのウィンドウがドラッグされるので
HSPが停止する
旧スクリプト.hsp見る限り他のウィンドウにカーソルが有る時でも関係なく
sendmsg hwnd,$00A1,2,0が実行されてる

ウィンドウ内を左クリックしてる間カウントが止まるサンプル

repeat title ""+cnt getkey L,1 if L=1{ sendmsg hwnd,$00A1,2,0} await 16 loop



暇人

リンク

2013/5/19(Sun) 04:25:56|NO.54140

タイマー割り込み使ってドラッグ中でもgetkeyするサンプル

#include "user32.as"
#define WM_TIMER 0x0113
#define TIMER_ID 1

#module
#undef getkey
#deffunc getkey var p1,int p2
getkey@hsp key(245),p2
p1=key(245)*2-key(p2)
key(p2)=key(245)
return
#global


oncmd gosub *OnTimer, WM_TIMER
onexit goto *OnQuit
SetTimer hwnd, TIMER_ID, 10, 0

repeat
getkey w,87
if w=2 {mouse_event $2,0,0,0,0}
if w=-1 {mouse_event $4,0,0,0,0}

getkey L,1
title strf("cnt=%d w=%d L=%d",cnt,w,L)

if L=1 and ginfo_act=0 {sendmsg hwnd,$00A1,2,0}//ウィンドウを動かすか何かキー操作されるまでタイマー割り込みが停止する感じ
await 16
loop
stop

*OnTimer
if wparam = TIMER_ID {
if L=1 {
getkey w,87
if w=-1 {mouse_event $4,0,0,0,0}
}
}
tim++
color
boxf 0,0,200,20
color 255
pos 0,0
mes strf("TIM=%d w=%d L=%d",tim,w,L)
return 0

*OnQuit
KillTimer hwnd, TIMER_ID
end




roppyaku-K

リンク

2013/5/19(Sun) 15:34:36|NO.54151

ウィンドウメッセージなどに
ほとんど触れたことがないので、部分的な解説をお願いしたいです。
マクロも、
#define WM_TIMER 0x0113
#define TIMER_ID 1
マクロ定義部分が何を意味するのか全く分かりません。

また、settimerやkilltimerはuser32.as内で定義さているのだと思いますが、
物がよく分かりません。(感でやって痛い目を見たことがあるのでよく知っておきたい)
user32.as内で用意されている変数や命令が載っている場所などを教えて下されば
幸いです。



質問攻めで申し訳ありませんが返答お願いします。



暇人

リンク

2013/5/19(Sun) 16:24:27|NO.54153

Win32APIだから検索かければ情報はいくらでも出てくるよ
HSP用の解説じゃなくてもuser32.asの内容見ながら検索して比較すればある程度なんとかなる

WM_TIMERはタイマー割り込み、oncmdに設定するとWM_TIMERが自分のウィンドウに送られてきたら
指定されたラベルに飛ぶ(wait,stopとかでタスクがOS(?)に移らないと発生しない、ドラッグ中はstopと同等っぽい)

WM_TIMERを定期的に自分のウィンドウに送る命令がSetTimer
必要なくなったらKillTimerでタイマーを破棄

TIMER_IDは任意の数値、タイマーを複数使いたいときに違うIDでSetTimer設定すれば
割り込みが来た時にwparamで識別できる



roppyaku-K

リンク

2013/5/19(Sun) 16:43:33|NO.54156

Win32API・・・とuser32.as・・・。
分かりました。後は自分で調べることにします。
命令の意味がはっきりすれば、分かりそうな気がします。
暇人さんありがとうございます



(wparamすら分からない(汗)



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