Win32API | タスクバーに表示されるウィンドウのみ 一覧を取得する | HSP
Win32API | タスクバーに表示されるウィンドウのみ 一覧を取得する | HSP
ソースコード (HSP)
#include "user32.as"
#include "kernel32.as"#uselib "psapi.dll"
#func global EnumProcessModules "EnumProcessModules" sptr, sptr, sptr, sptr
#func global GetModuleFileNameEx "GetModuleFileNameExA" sptr, sptr, sptr, sptr#include "mod_clbk2.hsp"
// コンパイル設定
#runtime "hsp3cl"// 定数
#define NULL 0
#define FALSE 0
#define TRUE 1#define _MAX_PATH 260
#define GWL_STYLE -16
#define GWL_EXSTYLE -20
#define GW_OWNER 0x00000004#define WS_VISIBLE 0x10000000
#define WS_EX_TOOLWINDOW 0x00000080
#define WS_EX_NOREDIRECTIONBITMAP 0x00200000#define PROCESS_VM_READ 0x0010
#define PROCESS_QUERY_INFORMATION 0x0400#define MONITOR_DEFAULTTOPRIMARY 0x00000001
//
// メイン
//labelptr clbk, 2, *ew
EnumWindows stat, 0mes "\n取得数 : " + i + "\n"
stop
//
// ウィンドウハンドル取得時のコールバック関数
//
*ew// 引数
labelargv argvarg_hWnd = argv(0)
arg_lParam = argv(1)// いらないものをはじく
/* ウィンドウスタイル・拡張スタイルを取得 */
GetWindowLong arg_hWnd, GWL_STYLE
style = stat
GetWindowLong arg_hWnd, GWL_EXSTYLE
exStyle = stat/* 可視状態かどうか */
if (0 == (style & WS_VISIBLE)) : return 1
if (0 != (exStyle & WS_EX_NOREDIRECTIONBITMAP)) : return 1
/* タスクバーに表示されているかどうか */
if (0 != (exStyle & WS_EX_TOOLWINDOW)) : return 1
/* オーナーウィンドウを持つかどうか */
GetWindow arg_hWnd, GW_OWNER
if (NULL != stat) : return 1
// タイトル取得
GetWindowTextLength arg_hWnd
len = stat
sdim text, len + 1
GetWindowText arg_hWnd, varptr(text), len + 1// ファイルパス取得
/* プロセス ID 取得 */
processID = NULL
GetWindowThreadProcessId arg_hWnd, varptr(processID)/* プロセスを開く */
OpenProcess PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID
hProcess = stat/* モジュールハンドル 取得 */
hModule = NULL
EnumProcessModules hProcess, varptr(hModule), 4, NULL/* ファイルパス 取得 */
sdim path, _MAX_PATH
GetModuleFileNameEx hProcess, hModule, varptr(path), _MAX_PATH/* プロセスを閉じる */
CloseHandle hProcess// ウィンドウの状態取得
IsIconic arg_hWnd
fIconic = stat
IsZoomed arg_hWnd
fZoomed = stat
IsWindowVisible arg_hWnd
fWindowVisible = stat
IsWindowEnabled arg_hWnd
fWindowEnabled = stat// ウィンドウの位置・サイズ取得
/* ワークエリア内での座標 */
dim wndPl, 11 // WINDOWPLACEMENT 構造体
wndPl.0 = 4 * 11 // wndPl.length = sizeof(WINDOWPLACEMENT)
GetWindowPlacement arg_hWnd, varptr(wndPl)
ptNormalPosition = wndPl.7, wndPl.8 // ptNormalPosition = wndPl.rcNormalPosition.left, wndPl.rcNormalPosition.top
ptNormalSize = wndPl.9 - wndPl.7, wndPl.10 - wndPl.8 // ptNormalSize = wndPl.rcNormalPosition.right - wndPl.rcNormalPosition.left, wndPl.rcNormalPosition.bottom - wndPl.rcNormalPosition.top/* 位置の補正 */
dim mi, 10 // MONITORINFO 構造体
mi.0 = 10 * 4 // mi.cbSize = sizeof(MONITORINFO)
MonitorFromWindow arg_hWnd, MONITOR_DEFAULTTOPRIMARY
GetMonitorInfo stat, varptr(mi)
ptNormalPosition.0 += mi.5 - mi.1 // ptNormalPosition.x += mi.rcWork.left - mi.rcMonitor.left
ptNormalPosition.1 += mi.6 - mi.2 // ptNormalPosition.y += mi.rcWork.top - mi.rcMonitor.top// 表示
mes "hWnd : " + arg_hWnd
mes "text : " + text
mes "path : " + path
mes "IsIconic : " + fIconic
mes "IsZoomed : " + fZoomed
mes "IsWindowVisible : " + fWindowVisible
mes "IsWindowEnabled : " + fWindowEnabled
mes "ptNormalPosition : (" + ptNormalPosition.0 + ", " + ptNormalPosition.1 + ")"
mes "ptNormalSize : (" + ptNormalSize.0 + ", " + ptNormalSize.1 + ")"
mes// カウント
i++return 1
説明
1.タスクバーに表示されていないものを省く
- ウィンドウスタイルに WS_VISIBLE を持たないもの
- 拡張ウィンドウスタイルに WS_EX_TOOLWINDOW, WS_EX_NOREDIRECTIONBITMAP を持つもの ※重要
- オーナーウィンドウを持つもの
title ""
としたウィンドウのことを考えれば当然ですよね。
The window does not render to a redirection surface. This is for windows that do not have visible content or that use mechanisms other than surfaces to provide their visual.
このウィンドウスタイルが指定されたウィンドウは、外観上、出力先に描画されません。
これは、目に見える中身を持たなかったり、目に見えるものを内部的に与える仕組みを使うウィンドウを作るためです。
2.様々なウィンドウ情報 (タイトル・ファイルパス・最小化/最大化の状態など) の取得
3.ウィンドウ位置の取得
- GetWindowRect 関数の罠
- GetWindowPlacement 関数の罠
#define SPI_GETWORKAREA 0x00000030
// SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
SystemParametersInfo SPI_GETWORKAREA, 0, varptr(rect), 0
で良いですし、マルチディスプレイにちゃんと対応したいのであれば、ウィンドウハンドルを用いて MonitorFromWindow 関数でどのモニターにいるかを取得し、そのモニターの情報から座標を修正します。
いいですね! Windows7ですけど、
タスクバーにある開いてるプログラムの一覧が全部表示されました。
いろんなことに活用できそうです^^
> フェルミウム湾さん
ありがとうございます!
Windows 7 でもう動いてくれてよかったです (^^
はじめまして。
「プログラミングのメモ帳」のブログ管理者です。
今日、ウインドウ・スタイルの WS_EX_NOREDIRECTIONBITMAP の事を知りました。
確かに HSP で空文字列をセットしたタイトルバーを容易に作れますね。
お勉強になりましたよ。
良い情報をありがとうございます。