適当に日々あったこととか書いてます。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
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使えってことか?気づかんかった・・・。
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使えってことか?気づかんかった・・・。
PR
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に触ってなければいつでも同じ順番でハンドルが取得されるもんだと思ってたらどうやら違うらしい。
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に触ってなければいつでも同じ順番でハンドルが取得されるもんだと思ってたらどうやら違うらしい。
SHORT GetKeyState(
int nVirtKey // 仮想キーコード
);
指定された仮想キーの状態を取得します。状態とは、キーが押されているか、押されていないか、トグルになっているかどうか( オンとオフの 2 つがあり、キーを押すたびに入れ替わります)を表します。
<パラメータ>
・nVirtKey
[入力]仮想キーコードを指定します。
希望の仮想キーが文字キーまたは数字キー(A~Z、a~z、0~9)である場合、nVirtKey にその文字の ASCII コードを指定しなければなりません。他のキーの場合は、仮想キーコードを指定しなければなりません。
ヨーロッパなどの英語以外のキーボードレイアウトを使っている場合、A~Z と 0~9 の各範囲に相当する ASCII コードは、アクセント付きを含め、ほとんどの文字を表すために使われています。
たとえば、ドイツ語のキーボードレイアウトでは、ASCII の「O」(0x4F)の値に相当する仮想キーは「o」キーを意味しますが、VK_OEM_1 は「ウムラウト(¨)付きの o」キーを意味します。
<戻り値>
戻り値は、指定された仮想キーの状態を表します。各値は次のことを意味します。
最上位ビット(0x0080?)が 1 のときはキーが押されていることを、0 のときはキーが押されていないことを示します。
最下位ビット(0x0001)が 1 のときはキーがトグル状態にあることを示します。
たとえば、CapsLock キーが ON になっているときは、トグル状態になります。
最下位ビットが 0 のときはキーが OFF になっていて、トグルが解除されていることを示します。
キーボードにトグルキーのインジケータランプが用意されている場合、キーがトグル状態になっているとランプは点灯し、トグル解除状態ではランプは消灯します。
<解説>
スレッドがメッセージキューからキーメッセージを読み出すたびに、この関数が返すキーの状態は変化します。
キーの状態は、ハードウェアによる割り込みレベルの状態を反映しません。
割り込みレベルの情報を取得するには、GetAsyncKeyState 関数を使ってください。
アプリケーションは、キーボード入力メッセージに応じて GetKeyState を呼び出します。この関数は、入力メッセージが生成されたときのキーの状態を取得します。
すべての仮想キーの状態を取得するには、GetKeyboardState 関数を使います。
<対応情報>
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/cc364676.aspx
<使用メモ>
最上位ビットって書かれてるけど、実際取得すると
0x0000(初回)→0x0081(押す)→0x0081(押してる)→0x0001(放す)
ってなってる気がする(while文で永久ループで取得し続けた場合)。
int nVirtKey // 仮想キーコード
);
指定された仮想キーの状態を取得します。状態とは、キーが押されているか、押されていないか、トグルになっているかどうか( オンとオフの 2 つがあり、キーを押すたびに入れ替わります)を表します。
<パラメータ>
・nVirtKey
[入力]仮想キーコードを指定します。
希望の仮想キーが文字キーまたは数字キー(A~Z、a~z、0~9)である場合、nVirtKey にその文字の ASCII コードを指定しなければなりません。他のキーの場合は、仮想キーコードを指定しなければなりません。
ヨーロッパなどの英語以外のキーボードレイアウトを使っている場合、A~Z と 0~9 の各範囲に相当する ASCII コードは、アクセント付きを含め、ほとんどの文字を表すために使われています。
たとえば、ドイツ語のキーボードレイアウトでは、ASCII の「O」(0x4F)の値に相当する仮想キーは「o」キーを意味しますが、VK_OEM_1 は「ウムラウト(¨)付きの o」キーを意味します。
<戻り値>
戻り値は、指定された仮想キーの状態を表します。各値は次のことを意味します。
最上位ビット(0x0080?)が 1 のときはキーが押されていることを、0 のときはキーが押されていないことを示します。
最下位ビット(0x0001)が 1 のときはキーがトグル状態にあることを示します。
たとえば、CapsLock キーが ON になっているときは、トグル状態になります。
最下位ビットが 0 のときはキーが OFF になっていて、トグルが解除されていることを示します。
キーボードにトグルキーのインジケータランプが用意されている場合、キーがトグル状態になっているとランプは点灯し、トグル解除状態ではランプは消灯します。
<解説>
スレッドがメッセージキューからキーメッセージを読み出すたびに、この関数が返すキーの状態は変化します。
キーの状態は、ハードウェアによる割り込みレベルの状態を反映しません。
割り込みレベルの情報を取得するには、GetAsyncKeyState 関数を使ってください。
アプリケーションは、キーボード入力メッセージに応じて GetKeyState を呼び出します。この関数は、入力メッセージが生成されたときのキーの状態を取得します。
すべての仮想キーの状態を取得するには、GetKeyboardState 関数を使います。
<対応情報>
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/cc364676.aspx
<使用メモ>
最上位ビットって書かれてるけど、実際取得すると
0x0000(初回)→0x0081(押す)→0x0081(押してる)→0x0001(放す)
ってなってる気がする(while文で永久ループで取得し続けた場合)。
SHORT GetAsyncKeyState(
int vKey // 仮想キーコード
);
関数呼び出し時にキーが押されているかどうか、また、前回の GetAsyncKeyState 関数呼び出し以降にキーが押されたかどうかを判定します。
<パラメータ>
・vKey
[入力]最大 256 とおりの仮想キーコードのいずれかを指定します。
Windows NT/2000:特定のキーの左キーと右キーを区別できます。詳細については、「解説」を参照してください。
<戻り値>
関数が成功すると、前回の GetAsyncKeyState 関数呼び出し以降にキーが押されたかどうか、およびキーが現在押されているかどうかを示す値が返ります。
最上位ビット(0x8000)がセットされたときは現在そのキーが押されていることを示し、最下位ビット(0x0001)がセットされたときは前回の GetAsyncKeyState 関数呼び出し以降にそのキーが押されたことを示します。
他のスレッド( またはプロセス)のウィンドウがキーボードフォーカスを備えている場合は、0 が返ります。
Windows 95:Windows 95 は、左キーと右キーを区別するための定数をサポートしていません。これらの定数を指定して GetAsyncKeyState を呼び出すと、0 が返ります。
<解説>
GetAsyncKeyState 関数は、マウスボタンの状態も取得できます。
ただしこの関数は、物理的なボタンのマップ先である論理的なマウスボタンの状態ではなく、物理的なマウスボタンの状態を取得します。
たとえば、GetAsyncKeyState(VK_LBUTTON) を呼び出すと、そのボタンが論理的な左ボタンと右ボタンのどちらに割り当てられているかにかかわりなく(後者は「左利き用」の割り当て)、常に物理的な左ボタンの状態を返します。
物理的なマウスボタンと論理的なマウスボタンの対応を調べるには、次の呼び出しを行います。
GetSystemMetrics(SM_SWAPBUTTON)
この呼び出しは、マウスボタンの左右が入れ替わっているときに TRUE を返します。
vKey パラメータの値として、VK_SHIFT、VK_CONTROL、VK_MENU の各仮想キーコード定数を指定できます。この場合、左右を区別することなく、Shift、Ctrl、Alt の各キーの状態を取得できます。
<対応情報>
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/cc364583.aspx
<使用メモ>
キーボード押されたときの情報検出に使用。
でも別のアプリとかで同じ関数が使われてたら、入力情報はまともに検出できなくなる可能性が高い・・・のか?
少なくとも同時に動作させたらどっちかしか検出できなかった。
もしかしたら他のアプリの使われ方次第でどっちかが動作不良起こす?
0x0000(初回)→0x8001(押す)→0x8000(押し続ける)→0x0000(放す)→0x0001(押してすぐ放す)→0x0000(次に取得)
int vKey // 仮想キーコード
);
関数呼び出し時にキーが押されているかどうか、また、前回の GetAsyncKeyState 関数呼び出し以降にキーが押されたかどうかを判定します。
<パラメータ>
・vKey
[入力]最大 256 とおりの仮想キーコードのいずれかを指定します。
Windows NT/2000:特定のキーの左キーと右キーを区別できます。詳細については、「解説」を参照してください。
<戻り値>
関数が成功すると、前回の GetAsyncKeyState 関数呼び出し以降にキーが押されたかどうか、およびキーが現在押されているかどうかを示す値が返ります。
最上位ビット(0x8000)がセットされたときは現在そのキーが押されていることを示し、最下位ビット(0x0001)がセットされたときは前回の GetAsyncKeyState 関数呼び出し以降にそのキーが押されたことを示します。
他のスレッド( またはプロセス)のウィンドウがキーボードフォーカスを備えている場合は、0 が返ります。
Windows 95:Windows 95 は、左キーと右キーを区別するための定数をサポートしていません。これらの定数を指定して GetAsyncKeyState を呼び出すと、0 が返ります。
<解説>
GetAsyncKeyState 関数は、マウスボタンの状態も取得できます。
ただしこの関数は、物理的なボタンのマップ先である論理的なマウスボタンの状態ではなく、物理的なマウスボタンの状態を取得します。
たとえば、GetAsyncKeyState(VK_LBUTTON) を呼び出すと、そのボタンが論理的な左ボタンと右ボタンのどちらに割り当てられているかにかかわりなく(後者は「左利き用」の割り当て)、常に物理的な左ボタンの状態を返します。
物理的なマウスボタンと論理的なマウスボタンの対応を調べるには、次の呼び出しを行います。
GetSystemMetrics(SM_SWAPBUTTON)
この呼び出しは、マウスボタンの左右が入れ替わっているときに TRUE を返します。
vKey パラメータの値として、VK_SHIFT、VK_CONTROL、VK_MENU の各仮想キーコード定数を指定できます。この場合、左右を区別することなく、Shift、Ctrl、Alt の各キーの状態を取得できます。
<対応情報>
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/cc364583.aspx
<使用メモ>
キーボード押されたときの情報検出に使用。
でも別のアプリとかで同じ関数が使われてたら、入力情報はまともに検出できなくなる可能性が高い・・・のか?
少なくとも同時に動作させたらどっちかしか検出できなかった。
もしかしたら他のアプリの使われ方次第でどっちかが動作不良起こす?
0x0000(初回)→0x8001(押す)→0x8000(押し続ける)→0x0000(放す)→0x0001(押してすぐ放す)→0x0000(次に取得)
BOOL GetAltTabInfo(
HWND hwnd,
int iItem,
PALTTABINFO pati,
LPTSTR pszItemText,
UINT cchItemText
);
指定したウィンドウがアプリケーション切り替え(ALT+TAB)ウィンドウの場合、そのウィンドウのステータス情報を取得します。
<パラメータ>
・hwnd
ステータス情報を取得するウィンドウのハンドルを指定します。このウィンドウは、アプリケーション切り替えウィンドウでなければなりません。
・iItem
アプリケーション切り替えウィンドウ内のアイコンのインデックスを指定します。pszItemText に NULL 以外を指定すると、対応する項目の名前が pszItemText の指す文字列にコピーされます。このパラメータに -1 を指定すると、項目の名前はコピーされません。
・pati
ステータス情報を受け取る 構造体へのポインタを指定します。
・pszItemText
項目の名前を受け取る文字列へのポインタを指定します。NULL を指定すると、項目の名前はコピーされません。
・cchItemText
pszItemText が指すバッファのサイズをバイト単位で指定します。
<戻り値>
関数が成功すると、0 以外の値が返ります。
関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、 関数を使います。
<解説>
アプリケーション切り替えウィンドウを使って、実行中の別のアプリケーションウィンドウに切り替えることができます。
アプリケーション切り替えウィンドウを表示するには、ALT+TAB を押します。
リストからアプリケーションを選ぶには、ALT キーを押しながら TAB キーを押すと、リスト内の項目を移動します。SHIFT キーを同時に押すと、リスト内を逆に移動することができます。
引用:ttp://msdn.microsoft.com/ja-jp/library/cc410863.aspx
<使用メモ>
とりあえずXPでアプリ切替のハンドル取得して入れてみたけど関数失敗の0が帰ってきてた模様。結局使わずに終了。
拡張エラーは未取得なんで未確認。
HWND hwnd,
int iItem,
PALTTABINFO pati,
LPTSTR pszItemText,
UINT cchItemText
);
指定したウィンドウがアプリケーション切り替え(ALT+TAB)ウィンドウの場合、そのウィンドウのステータス情報を取得します。
<パラメータ>
・hwnd
ステータス情報を取得するウィンドウのハンドルを指定します。このウィンドウは、アプリケーション切り替えウィンドウでなければなりません。
・iItem
アプリケーション切り替えウィンドウ内のアイコンのインデックスを指定します。pszItemText に NULL 以外を指定すると、対応する項目の名前が pszItemText の指す文字列にコピーされます。このパラメータに -1 を指定すると、項目の名前はコピーされません。
・pati
ステータス情報を受け取る 構造体へのポインタを指定します。
・pszItemText
項目の名前を受け取る文字列へのポインタを指定します。NULL を指定すると、項目の名前はコピーされません。
・cchItemText
pszItemText が指すバッファのサイズをバイト単位で指定します。
<戻り値>
関数が成功すると、0 以外の値が返ります。
関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、 関数を使います。
<解説>
アプリケーション切り替えウィンドウを使って、実行中の別のアプリケーションウィンドウに切り替えることができます。
アプリケーション切り替えウィンドウを表示するには、ALT+TAB を押します。
リストからアプリケーションを選ぶには、ALT キーを押しながら TAB キーを押すと、リスト内の項目を移動します。SHIFT キーを同時に押すと、リスト内を逆に移動することができます。
引用:ttp://msdn.microsoft.com/ja-jp/library/cc410863.aspx
<使用メモ>
とりあえずXPでアプリ切替のハンドル取得して入れてみたけど関数失敗の0が帰ってきてた模様。結局使わずに終了。
拡張エラーは未取得なんで未確認。