2013年09月17日

概要
マウスをキャプチャしてウィンドウ外でもメッセージを受け取るようにするのと、マウスの位置からウィンドウハンドルを取得する関数と、デスクトップ上にGDIで描く方法を使えばSpy++、ProcessExplorerの検索のような物が作れます。

ソースコード
#include "user32.as"
#include "gdi32.as"

screen 0,200,40 : title "サンプル" : syscolor 15 : boxf
color : sysfont 17 : pos 62,14 : mes "クリック&ドラッグ"
LoadCursor 0,$00007F03 : hCross=stat ;IDC_CROSS 十字カーソルを取得
dim mousexy,2
dim rect,4

oncmd gosub *m_lbuttondown,$00000201;WM_LBUTTONDOWN ドラッグ開始判定
oncmd gosub *m_lbuttonup , $00000202;WM_LBUTTONUP ドラッグ終了判定
oncmd gosub *m_mousemove , $00000200;WM_MOUSEMOVE ドラッグ中の処理
stop

*m_mousemove
if draging=0 : return
;ドラッグ中の処理
GetCursorPos varptr(mousexy) ;カーソルのスクリーン座標を取得
WindowFromPoint mousexy.0,mousexy.1 ;マウスの下にあるウィンドウハンドルを取得(無効、非表示とかはスキップされる)
p_hwnd=stat
ScreenToClient p_hwnd,varptr(mousexy) ;マウス座標をクライアント座標に
ChildWindowFromPoint p_hwnd,mousexy.0,mousexy.1 ;マウスの下の無効、非表示ウィンドウハンドルを取得できる
c_hwnd=stat
draw_hwnd=p_hwnd ;枠線を描画するウィンドウハンドル
if c_hwnd : p_hwnd=c_hwnd : c_hwnd=draw_hwndz : draw_hwnd=p_hwnd ;無効、非表示ウィンドウがあれば入れ替える
;枠を描画
if old_draw_hwnd!draw_hwnd{
if old_draw_hwnd!=0 : gosub *invert
old_draw_hwnd=draw_hwnd
if old_draw_hwnd!=0 : gosub *invert
if draw_hwnd!0{
draw_hwnd=0
syscolor 15 : boxf : color : pos 46,14 : mes strf("ハンドル:0x%08X",p_hwnd)
}
}
return
*m_lbuttonup
draging=0 ;ドラッグフラグオフ
if draw_hwnd!0 : old_draw_hwnd=draw_hwnd : gosub *invert
old_draw_hwnd=0 : draw_hwnd=0
ReleaseCapture ;マウスキャプチャオフ
return
*m_lbuttondown
draging=1 ;ドラッグフラグオン
syscolor 15 : boxf : color : pos 46,14 : mes "ハンドル:"
SetCursor hCross
SetCapture hwnd ;マウスキャプチャオン(ウィンドウ外にでてもマウスメッセージを受け取る)
return
*invert
;old_draw_hwndのウィンドウに選択枠線を描画
if old_draw_hwnd=0 : return
GetWindowDC old_draw_hwnd : top_hdc=stat
GetClientRect old_draw_hwnd,varptr(rect)
//DrawFocusRect top_hdc,varptr(rect)
InvertRect top_hdc,varptr(rect)
rect.0+=4 : rect.1+=4 : rect.2-=4 : rect.3-=4
InvertRect top_hdc,varptr(rect)
ReleaseDC 0,top_hdc
return

ソフト
これをもとにしたミニソフトがこちら

簡易ウィンドウファインダー

ミニです

トラックバックURL

コメントする

名前
 
  絵文字