#include <stdio.h>
#include <Windows.h>
// 定数
#define SW_TITLE (1) // タイトルバーの取得
#define SW_CLASS (2) // クラス名の取得
// 独自の構造体を宣言
typedef struct enum_param_t {
LPTSTR lpBuff; // 先頭ポインタ位置
LPTSTR lpTail; // 現在ポインタ位置
LPTSTR lpStop; // 最終ポインタ位置
UINT swOption; // 汎用オプション値
} enum_param_t;
// ウインドウのふるいにかける処理
BOOL MyIsTopWindow( HWND hWnd, LPTSTR lpTitle, LPTSTR lpClass )
{
if ( IsWindowVisible(hWnd) ){ // 可視状態か
if ( GetWindow(hWnd,GW_OWNER) == NULL ){ // トップレベルウィンドウか
if ( lstrlen(lpTitle) > 0 ){ // キャプションを持っているか
if ( lstrcmp(lpClass,TEXT("Progman")) != 0 ){ // シェルでないか
return TRUE;
}
}
}
}
return FALSE;
}
// ちょっとだけ書き換えました。
BOOL CALLBACK EnumWndProc( HWND hWnd, LPARAM lParam )
{
enum_param_t *p = (enum_param_t *)lParam; // ここで構造体を受け取る
TCHAR szWindowName[ 128 ];
TCHAR szClassName[ 128 ];
//ウィンドウテキストの取得
GetWindowText( hWnd, szWindowName, sizeof(szWindowName) );
//ウィンドウクラス名の取得
GetClassName( hWnd, szClassName, sizeof(szClassName) );
// 取得した情報を文字列に取得
if ( MyIsTopWindow(hWnd,szWindowName,szClassName) ){
LPTSTR lpBuff;
// ここで swOption で処理分岐
switch ( p->swOption ){
case SW_TITLE: lpBuff = szWindowName; break; // タイトルバーの取得
case SW_CLASS: lpBuff = szClassName; break; // クラス名の取得
default: return TRUE;
}
// バッファの残り容量をチェック
if ( (p->lpTail + lstrlen(lpBuff) + 1) < p->lpStop ){
p->lpTail += wsprintf( p->lpTail, TEXT("%s\n"), lpBuff );
}
}
return TRUE;
}
// 文字列をクリップボードにコピー
BOOL MyClipboardCopy( HWND hWnd, LPCTSTR lpText )
{
HGLOBAL hMem; // 設定用のメモリ変数
LPTSTR lpBuff; // 複写用のポインタ
DWORD dwSize; // 複写元の長さ
// クリップボードのデータ内容
dwSize = (lstrlen(lpText) + 1); // '\0' 文字分を加算
// データ内容のメモリを確保
if ( (hMem = GlobalAlloc((GHND|GMEM_SHARE),dwSize)) != NULL ){
if ( (lpBuff = (LPTSTR)GlobalLock(hMem)) != NULL ){
// ここでテキストデータを lpBuff にコピー
lstrcpy( lpBuff, lpText );
GlobalUnlock( hMem );
// クリップボードにデータを設定
if ( OpenClipboard(hWnd) ){
EmptyClipboard();
SetClipboardData( CF_TEXT, hMem );
CloseClipboard();
return TRUE;
}
}
GlobalFree( hMem ); // ロックできない時は解放
}
return FALSE;
}
// メイン関数
int main( void )
{
TCHAR szText[ 32 * 1024 ]; // タイトルバー(32 KB)
enum_param_t prm; // 構造体を宣言
// 構造体の初期化
prm.lpBuff = szText;
prm.lpTail = szText; // ここが書き込み位置
prm.lpStop = szText + sizeof( szText );
prm.swOption = SW_TITLE; // 機能拡張用のオプション(自由に値をセット)
// ウインドウの列挙開始
EnumWindows( EnumWndProc, (LPARAM)&prm );
// 特に必要がないなら削除(printf() でも文字列として表示可能)
MessageBox( NULL, szText, "起動中のWindow", MB_OK );
// クリップボードにコピー
if ( !MyClipboardCopy(NULL,szText) ){
printf( "クリップボードにコピーできませんでした。\n" );
}
return 0;
}
以上。
お礼
すばらしいです。 動作は、希望通りです。 まだ理解するまでに時間が掛かりそうですが、がんばります。 本当にありがとうございました。