忍者ブログ
適当に日々あったこととか書いてます。
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

DWORD GetWindowThreadProcessId(
HWND hWnd, // ウィンドウのハンドル
LPDWORD lpdwProcessId // プロセス ID
);

指定されたウィンドウを作成したスレッドの ID を取得します。
必要であれば、ウィンドウを作成したプロセスの ID も取得できます。

<パラメータ>
・hWnd
ウィンドウのハンドルを指定します。
・lpdwProcessId
プロセス ID を受け取る変数へのポインタを指定します。
ポインタを指定すると、それが指す変数にプロセス ID がコピーされます。
NULL を指定した場合は、プロセス ID の取得は行われません。

<戻り値>
ウィンドウを作成したスレッドの ID が返ります。

<対応情報>
Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:Windows 95 以降
ヘッダー:Winuser.h で宣言、Windows.h をインクルード
インポートライブラリ:User32.lib を使用

引用:ttp://msdn.microsoft.com/ja-jp/library/cc364779.aspx

<使用メモ>
そのまんまプロセスID取得に使用。
が、使用しようとしたときに別の解決方法が見つかったので結局使わずに終了。
PR
BOOL SetForegroundWindow(
HWND hWnd // ウィンドウのハンドル
);

指定されたウィンドウを作成したスレッドをフォアグラウンドにし、そのウィンドウをアクティブにします。
キーボード入力はこのウィンドウに直接送られるようになり、ユーザーにこれがわかるように画面でのさまざまな表示が変更されます。
Windows システムは、フォアグラウンドウィンドウを生成したスレッドに対して、他のスレッドよりも若干高い優先順位を割り当てます。

<パラメータ>
・hWnd
アクティブにし、フォアグラウンドにするウィンドウのハンドルを指定します。

<戻り値>
ウィンドウがフォアグラウンドになったら、0 以外の値が返ります。
ウィンドウがフォアグラウンドにならなかった場合は、0 が返ります。

<解説>
フォアグラウンドウィンドウは、 の最も高いウィンドウであり、現在ユーザーが作業しているウィンドウです。
プリエンプティブなマルチタスク環境では、一般的には、どのウィンドウをフォアグラウンドウィンドウにするかの決定はユーザーに委ねます。

Windows 98、Windows 2000:フォアグラウンドウィンドウを設定することができるプロセスは、システムにより制限されます。
次の条件が満たされていなければ、プロセスがフォアグラウンドウィンドウを設定することはできません。
 •そのプロセスがフォアグラウンドプロセスである。
 •そのプロセスはフォアグラウンドプロセスにより開始された。
 •そのプロセスが最後の入力イベントを受け取った。
 •フォアグラウンドプロセスがない。
 •フォアグラウンドプロセスがデバッグ中である。
 •フォアグラウンドがロックされていない(LockSetForegroundWindow 関数の説明を参照)。
 •フォアグラウンドロックのタイムアウトが発生している( 関数の SPI_GETFOREGROUNDLOCKTIMEOUT の説明を参照)。
 •Windows 2000:アクティブなメニューがない。

この旧バージョンからの変更により、アプリケーションは、ユーザーが他のウィンドウで作業しているときに強制的にフォアグラウンドウィンドウを設定することはできなくなりました。
その代わりに、SetForegroundWindow 関数は、ウィンドウをアクティブにし(SetActiveWindow 関数の説明を参照)、 関数を呼び出してユーザーに通知します。

フォアグラウンドウィンドウを設定できるプロセスは、AllowSetForegroundWindow 関数を呼び出すことにより、他のプロセスにフォアグラウンドウィンドウを設定する能力を与えることができます。
この関数の dwProcessId パラメータで指定されたプロセスは、次にユーザーがそのプロセス以外のプロセスに対して入力操作を行ったときか、または他のプロセスの指定された AllowSetForegroundWindow 関数の呼び出しがあったときに、フォアグラウンドウィンドウを設定する能力を失います。

フォアグラウンドプロセスは、LockSetForegroundWindow 関数を呼び出すことにより SetForegroundWindow 関数の呼び出しを無効化できます。

<対応情報>
Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:Windows 95 以降
ヘッダー:Winuser.h で宣言、Windows.h をインクルード
インポートライブラリ:User32.lib を使用

引用:ttp://msdn.microsoft.com/ja-jp/library/cc411039.aspx

<使用メモ>
まぁそのまんま、指定したハンドルのアプリをアクティブにするために使用。
HWND GetDesktopWindow(VOID);

デスクトップウィンドウのハンドルを取得します。
デスクトップウィンドウはスクリーン全体を覆っており、この上にアイコンやウィンドウなどが描画されます。

<パラメータ>
パラメータはありません。

<戻り値>
デスクトップウィンドウのハンドルが返ります。

<対応情報>
Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:Windows 95 以降
ヘッダー:Winuser.h で宣言、Windows.h をインクルード
インポートライブラリ:User32.lib を使用

引用:ttp://msdn.microsoft.com/ja-jp/library/cc364616.aspx

<使用メモ>
そのまんま、デスクトップのハンドル取得に使用。
int GetClassName(
HWND hWnd, // ウィンドウのハンドル
LPTSTR lpClassName, // クラス名
int nMaxCount // クラス名バッファのサイズ
);

指定されたウィンドウが属するクラスの名前を取得します。

<パラメータ>
・hWnd
 ウィンドウのハンドルを指定します。
 クラスも間接的に指定したことになります(指定したウィンドウの属するクラスが使われます)。

・lpClassName
 バッファへのポインタを指定します。
 このバッファに、クラスの名前が文字列で格納されます。

・nMaxCount
 lpClassName パラメータがポイントするバッファの長さを TCHAR 単位で指定します。
 バッファに入り切らない部分は、切り捨てられます。

<戻り値>
関数が成功すると、バッファにコピーされた TCHAR 値の数が返ります。
関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、 関数を使います。

<対応情報>
Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:Windows 95 以降
ヘッダー:Winuser.h で宣言、Windows.h をインクルード
インポートライブラリ:User32.lib を使用
Unicode:Windows NT/2000 は Unicode 版と ANSI 版を実装

引用:ttp://msdn.microsoft.com/ja-jp/library/cc364600.aspx

<使用メモ>
まぁなんかクラス名を取得するのに使用。

char cBuff[256];
GetClassName( hWnd, cBuff, sizeof(cBuff));

ってやると、GetClassNameWは2番目の引数がダメデスヨーってエラーが。
アァン?と思って

TCHAR tcBuff[256];
GetClassName( hWnd,tcBuff, (sizeof(tcBuff) / sizeof(tcBuff[0])));

ってやったら正常に取得。
UNICODE定義されてないときは上でもいける、されてるときは下じゃないとだめって感じらしい?
ってヘルプにTCHAR単位でサイズ指定って書いてあるワー・・・!
普通にやるならTCHAR使えってことか?気づかんかった・・・。
BOOL EnumWindows(
WNDENUMPROC lpEnumFunc, // コールバック関数
LPARAM lParam // アプリケーション定義の値
);

画面上のすべてのトップレベルウィンドウを列挙します。
この関数を呼び出すと、各ウィンドウのハンドルが順々にアプリケーション定義のコールバック関数に渡されます。
EnumWindows 関数は、すべてのトップレベルリンドウを列挙し終えるか、またはアプリケーション定義のコールバック関数から 0(FALSE)が返されるまで処理を続けます。

<パラメータ>
・lpEnumFunc
アプリケーション定義のコールバック関数へのポインタを指定します。詳細については、EnumWindowsProc 関数の説明を参照してください。

・lParam
コールバック関数に渡すアプリケーション定義の値を指定します。

<戻り値>
・関数が成功すると、0 以外の値が返ります。
・関数が失敗すると、0 が返ります。
 拡張エラー情報を取得するには、 関数を使います。
・EnumWindowsProc 関数が 0 を返すと、戻り値は 0 になります。

<解説>
EnumWindows 関数は、子ウィンドウは列挙しません。
ただし、WS_CHILD スタイルを持つ、システムにより所有されたいくつかのトップレベルウィンドウは例外です。

この関数を呼び出すと、GetWindow 関数をループ処理で呼び出すよりも信頼性の高い結果が得られます。
GetWindow 関数を呼び出してトップレベルウィンドウを列挙すると、無限ループに陥ったり、すでに破棄されているウィンドウのハンドルを参照する危険性がでてきます。

<対応情報>
Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:Windows 95 以降
ヘッダー:Winuser.h で宣言、Windows.h をインクルード
インポートライブラリ:User32.lib を使用

引用:ttp://msdn.microsoft.com/ja-jp/library/cc410851.aspx

<使用メモ>
while文で永久ループで使用。
VCのアプリで以下の記述で使用。

class aaaa {
public:
 void bbbb();
private:
 static BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);
}

void aaaa::bbbb(){
 EnumWindows(&aaaa::EnumWindowsProc, (LPARAM)this);
}

static入れないとコンパイル通らんかった気がするけどよくわからん。つかEnumWindowsProcにaaaaはいらなかったのか・・・?
そしてEnumWindowsは::EnumWindowsにすべきなんだろうか。
オブジェクト云々?このへんの知識が足りない・・・。

クラス無しメイン直呼びだと

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);
EnumWindows(&EnumWindowsProc, (LPARAM)this);

で通る。
あと、while文で回してれば、特にPCに触ってなければいつでも同じ順番でハンドルが取得されるもんだと思ってたらどうやら違うらしい。
カレンダー
03 2025/04 05
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
フリーエリア
最新CM
[06/02 Sai]
[04/23 Sai]
[02/02 tuku]
[11/06 sai]
[10/13 Sai]
最新TB
プロフィール
HN:
なりゆき流
性別:
非公開
趣味:
ネトゲ、読書(漫画とか漫画とか漫画とか)
自己紹介:
日々をだらだらと生きております。
バーコード
ブログ内検索
アクセス解析

HTML & CSS Designed by ittuan

忍者ブログ │ [PR]