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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0318
ひで仮想デスクトップ内の表示位置の取得5未解決


ひで

リンク

2009/3/18(Wed) 21:38:12|NO.23981

使用しているノートパソコンのモニターは1024x600の表示できますが、
画面の解像度設定は、1920x1080まで可能です。
(デスクトップで右クリック−プロパティ、画面のプロパティ、設定タブ内の解像度設定)

実際に表示されているのは1024x600で、
マウスカーソルを画面端まで持ってくるとデスクトップがスクロール?して、
1920x1080のエリアを使えるようになっています。
(仮想デスクトップと呼ぶのかな?)

それで何を教えていただきたいのかと言いますと、
HSPで1920x1080のうち、どの場所を表示しているか取得したいです。
何か方法はないでしょうか?
(ginfo_dispx、ginfo_dispyで見ると、1920、1080になっています)

OSはXP Homeです。



この記事に返信する


荒河 軒持

リンク

2009/3/20(Fri) 11:32:15|NO.23996

多分無理。
あと、どの仮想デスクトップ使ってるか解からないと答えられるものも答えられない。



ひで

リンク

2009/3/20(Fri) 11:48:57|NO.23997

画面プロパティで確認できた、
Intel Graphics Media Accelerator Driver for mobile
Mobile Intel(R) 945 Express Chipset Familly
Intel(R) GMA 950
これらのドライバが持っている機能の仮想デスクトップだと思うのですが、よく分かりません。



panda

リンク

2009/3/20(Fri) 19:27:33|NO.24006

おっしゃってる意味はわかりますが、多分無理だとおもいます。
いろいろ、調べてみましたが関する情報は得られませんでした。

やっぱり、OS上では 1920x1080 で動作してるみたいですし…。
あえて、考え付く方法といえば、ディスプレイのドライバーを入れている環境なら、
ディスプレイドライバー(GPUではない)から最大解像度を読み出しすくらいですかね。

しかし、必ずしもディスプレイのドライバーが入ってるとは限らないですし・・・
非現実的なのかもしれません。



osakana

リンク

2009/4/1(Wed) 06:38:00|NO.24294

実際に確認できる環境に無いので 上手く行くか分かりませんが、
画面のサイズとマウスの座標から表示領域を絞り込む事は出来るかもしれません。
と言っても ginfo 0 と 1 で取得出来るスクリーン系座標でさえ
モニターの実画面の上での座標だった場合にはこの方法も使えませんが。

考え方は、仮想デスクトップ(のような物)内でやっている
どの場所を表示しているかと言う処理を、改めて自分で書き
どこを表示しているかを推測してみようと言う物です。

説明がしにくいので、
イメージ出来そうなサンプルを書いてみました。
実行するとマウスが中心になるように枠を表示しますので、
マウスを動かしてみてください。

wsizex = 640, 1 // 枠のウィンドウサイズを入れる変数 wsizey = 480, 1 // 〃 wposx = limit(GINFO_MX - wsizex/2, 0, GINFO_DISPX) // 枠の表示位置を入れる変数 wposy = limit(GINFO_MY - wsizey/2, 0, GINFO_DISPY) // 〃 // ウィンドウを4つ使って確認用の枠を作成 repeat 4 bgscr cnt+1, wsizex(cnt/2), wsizey((3-cnt)/2), 3 palette 0, 255, 0, 0, 1 :palcolor :boxf // 赤色にする loop gosub *REWAKU // 枠線の更新 *MAIN // 現在のスクリーン系マウス座標と、比較用の前回の座標を格納 smousex2 = smousex smousey2 = smousey smousex = GINFO_MX smousey = GINFO_MY // マウスが移動したら if smousex ! smousex2 | smousey ! smousey2 { // 枠の位置の更新が必要かどうか if smousex < wposx :wposx = smousex :gosub *REWAKU if smousey < wposy :wposy = smousey :gosub *REWAKU if smousex >= wposx + wsizex :wposx = smousex - wsizex + 1 :gosub *REWAKU if smousey >= wposy + wsizey :wposy = smousey - wsizey + 1 :gosub *REWAKU } // 状態の表示 redraw 0 color 255, 255, 255 :boxf :color :pos 0, 0 mes "枠のサイズ :" + wsizex + ", " + wsizey mes "マウスの位置:" + smousex + ", " + smousey mes "枠の左上座標:" + wposy + ", " + wposx mes "枠の右下座標:" + (wposx + wsizex) + ", " + (wposy + wsizey) redraw 1 wait 10 goto *MAIN *REWAKU // 枠の表示の更新 gsel 1, 2 :width ,, wposx, wposy gsel 2, 2 :width ,, wposx, wposy + wsizey - 1 gsel 3, 2 :width ,, wposx, wposy gsel 4, 2 :width ,, wposx + wsizex - 1, wposy gsel 0 return
赤枠で囲まれた部分がモニターの実画面のつもりです。
wsizex, wsizey の0要素目がそのサイズを設定している部分ですが
そこをモニター解像度と同じ 1024, 600 にして試して見て下さい

上手く行けば画面の四隅を何回かつつけば、
ある程度正確な値が出せると思います。
また四隅を触るのが面倒なら、処理の始めに、
変数 wposx, wposy(枠の位置が入っている)とマウス座標 X, Y を
予め0に設定し、常に 0, 0 から始まるようにしておけば、
四隅を触らなくてもそれなりの値が出せると思います。

ただ、この方法は表示位置を取得するのではなく推測しているだけなので、
たとえ上手く行ったとしても微妙に結果がずれる可能性が有ります。

赤色の枠線は動作を分かり易くするために描いているだけなので
実際に使う場合は枠線に関する処理は必要有りません。

もしやりたい事と違ったり、
上手くいかなかったりした場合はスルーして下さい。


#本当は oncmd を使ったメッセージ処理にしようと思ったのですが、
#スクリーン全体でマウスの移動を感知する方法が分からなかったので
#非効率ながら常にループを回しながらの処理になってます。



osakana

リンク

2009/4/3(Fri) 03:53:46|NO.24367

改めて見直してみたら、
スクリプトに2箇箇所間違いが有りました。
修正箇所は以下の通りです。

3、4行目

wposx = limit(GINFO_MX - wsizex/2, 0, GINFO_DISPX) wposy = limit(GINFO_MY - wsizey/2, 0, GINFO_DISPY)
  ↓↓

wposx = limit(GINFO_MX - wsizex/2, 0, GINFO_DISPX - wsizex) wposy = limit(GINFO_MY - wsizey/2, 0, GINFO_DISPY - wsizey)
32行目

mes "枠の右下座標:" + (wposx + wsizex) + ", " + (wposy + wsizey)
  ↓↓

mes "枠の右下座標:" + (wposx + wsizex - 1) + ", " + (wposy + wsizey - 1)



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