主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

デスクトップの作業領域座標を取得 python

                
tags:
デスクトップの作業領域の座標を求めたいのだが、win32apiのGetSystemMetricsの引数をSM_CXFULLSCREEN,SM_CYFULLSCREENとしてもタスクバーを除いた作業領域の幅と高さしか得られない。システムのタスクバーが上に表示されていた場合、ウィンドウとタスクバーが重なってよろしくないケースになる。
110322.jpg

"システムのタスクバーやアプリケーションのツールバーが占有する領域を除いた画面領域の座標を取得するには、SPI_GETWORKAREA #48 を指定して SystemParametersInfo 関数を使え(MSDN - GetSystemMetrics)とのことだけど、これに関しちゃwin32guiは未対応('11/03/22, NotImplementedError: Action 48 is not supported yet)。

ctypesを使ったやり方は↓に。
http://www.gossamer-threads.com/lists/python/python/162297

ctypesと同等のものをはきだすのを、レジストリを読む形で作ってみた。

どうやら"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects2"にタスクバー関連の値が入っているとのこと。
値の解説はないので自分でレジストリの値を解読。そのためにまず、タスクバーの位置と太さを変えながらレジストリの値をメモした。bottomやtopというのはタスクバーの位置、その後ろはタスクバーの太さ。その下にならんでいるのがレジストリの値。
================================================================
bottom(taskbar height; a:40, b:82)
a:"Settings"=hex:28,00,00,00,ff,ff,ff,ff,02,00,00,00,03,00,00,00,3e,00,00,00,28,00,00,00,00,00,00,00,d8,03,00,00,00,05,00,00,00,04,00,00
b:"Settings"=hex:28,00,00,00,ff,ff,ff,ff,02,00,00,00,03,00,00,00,3e,00,00,00,52,00,00,00,00,00,00,00,ae,03,00,00,00,05,00,00,00,04,00,00

top(taskbar height; a:40, b:82, c:124)
a:"Settings"=hex:28,00,00,00,ff,ff,ff,ff,02,00,00,00,01,00,00,00,3e,00,00,00,28,00,00,00,00,00,00,00,00,00,00,00,00,05,00,00,28,00,00,00
b:"Settings"=hex:28,00,00,00,ff,ff,ff,ff,02,00,00,00,01,00,00,00,3e,00,00,00,52,00,00,00,00,00,00,00,00,00,00,00,00,05,00,00,52,00,00,00
c:"Settings"=hex:28,00,00,00,ff,ff,ff,ff,02,00,00,00,01,00,00,00,3e,00,00,00,7c,00,00,00,00,00,00,00,00,00,00,00,00,05,00,00,7c,00,00,00

right(taskbar width; a:60, b:136)
a:"Settings"=hex:28,00,00,00,ff,ff,ff,ff,02,00,00,00,02,00,00,00,3e,00,00,00,28,00,00,00,c2,04,00,00,00,00,00,00,00,05,00,00,00,04,00,00
b:"Settings"=hex:28,00,00,00,ff,ff,ff,ff,02,00,00,00,02,00,00,00,88,00,00,00,28,00,00,00,78,04,00,00,00,00,00,00,00,05,00,00,00,04,00,00

left(taskbar width; a:60)
a:"Settings"=hex:28,00,00,00,ff,ff,ff,ff,02,00,00,00,00,00,00,00,3e,00,00,00,28,00,00,00,00,00,00,00,00,00,00,00,3e,00,00,00,00,04,00,00
================================================================
どの数値が共通していて、どの数値が変化しているかを読み取る。13番目がタスクバーの位置、17番目がタスクバーの横幅(十六進の値)、21番目がタスクバーの縦幅(十六進の値)に依存してるなと。
ここまでわかったら_winregを使って目的の値を引っ張って、十六進の値を十進に変換す
るだけだった。


import _winreg
#from win32api import GetSystemMetrics

def WorkCorner():
reg = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects2')
pos = _winreg.EnumValue(reg, 0)[1][12]
width = ord(_winreg.EnumValue(reg, 0)[1][16])
height = ord(_winreg.EnumValue(reg, 0)[1][20])
if pos == '\x03':#bottom
x,y = 0, 0
elif pos == '\x01':#top
x,y = 0, height
elif pos == '\x02':#right
x,y = 0, 0
elif pos == '\x00':#left
x,y = width, 0

return x,y

def WorkArea():
from win32api import GetSystemMetrics
reg = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects2')
pos = _winreg.EnumValue(reg, 0)[1][12]
width = ord(_winreg.EnumValue(reg, 0)[1][16])
height = ord(_winreg.EnumValue(reg, 0)[1][20])
x,y = GetSystemMetrics(0),GetSystemMetrics(1)
if pos == '\x03':#bottom
top,bottom,left,right = 0, y-height, 0, x
elif pos == '\x01':#top
top,bottom,left,right = height, y, 0, x
elif pos == '\x02':#right
top,bottom,left,right = 0, y, 0, x-width
elif pos == '\x00':#left
top,bottom,left,right = 0, y, width, x

return top,bottom,left,right

print WorkCorner()
print WorkArea()
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。