概要

複数のWMAファイルのタイトル、アルバムタイトル、アーティストを全角英数から半角英数に変換するプログラムです。複数のWMAファイルアーティスト名・タイトル変更プログラム(32/64bit) のGUI版となります。
WMAファイルは本プログラムにファイルをドラックドロップして指定します。
ドラッグドロップ後にOKボタンをクリックすると変換されます。
複数ファイルの同時変更に対応します。

変更履歴

2014.04.30 初版
2014.05.07 EXEファイル実行前にドラッグ&ドロップした場合のファイル名にダブルコーテーションが付加される場合に対応。

テスト環境

コンパイラ

Visual C++ 2008/2013 Express 32/64bit マルチバイト/UNICODE

実行環境

Windows XP Professional Service Pack 3 32bit(Virtual Box上の仮想マシーン)
Windows 7 Enterprise Service Pack 1 64bit

動作例

本プログラムを起動した状態

プログラムソースの概要

gwmachg.cpp

_tWinMain

_tWinMain関数よりダイアログボックスを表示します。

DlgProc1

ダイアログの初期化時にDlgProc1関数にWM_INITDIALOGメッセージが発生し、DragAcceptFiles APIを読み出すことによりファイルのドラッグ&ドラッグの受付を許可します。
ドラッグ&ドロップ
本プログラム起動時に引数があった場合は、リストボックスにその内容を設定します。
ファイルがドラッグ&ドラッグされるとDlgProc1関数にWM_DROPFILESメッセージが発生するので、DragQueryFile関数で最初にファイルの個数を取得し、次にファイル名を取得します。
取得されたファイル名は、リストボックスに登録します。
OKボタン
ボタンがクリックされると、DlgProc1関数にWM_COMMANDメッセージが発生するので、OKボタンのメッセージの場合、リストボックスの内容を取得しファイル名とします。

wma_title_chg

WMAファイルのタイトル・アルバムタイトル・アーティスト名を全角から半角に変換します。

ソースコード

gwmachg.cpp

// ドラッグ&ドロップされたWMAファイルのタイトル・アルバムタイトル・アーティスト名を全角から半角に変換する。
// 複数ファイルに対応(フォルダーのドラッグ&ドロップは無視する)
// 

#include <windows.h>
#include <tchar.h>
#include <wmsdk.h>
#include "resource.h"

#pragma comment(lib,"wmvcore.lib")

LRESULT CALLBACK DlgProc1(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);	// ダイアログボックスのプロシージャー
bool wma_title_chg(IWMMetadataEditor* pEditor,TCHAR* fname); // WMAファイルのタイトル・アルバムタイトル・アーティスト名を全角から半角に変換する
bool zen2han(TCHAR* s);//	全角文字を半角に変換する 変換された文字があった場合はtrueを返す

TCHAR* file=0;

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInst,TCHAR* lpszCmdLine, int nCmdShow){
	TCHAR f[MAX_PATH];
	if(lpszCmdLine[0]){
		if(lpszCmdLine[0]==_T('\"')){
			_tcscpy_s(f,sizeof(f)/sizeof(TCHAR),lpszCmdLine+1);
			f[ _tcslen(f) -1]=_T('\0');
			file=f;
		}else
			file=lpszCmdLine;
	}
	DialogBox(hInstance, TEXT("DLG1"), 0, (DLGPROC)DlgProc1);
	return 0;
}

// ダイアログボックスのプロシージャー

LRESULT CALLBACK DlgProc1(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam){
	TCHAR buf[MAX_PATH];
	HDROP hDrop;
	UINT fmax;
	HRESULT hr;
	IWMMetadataEditor* pEditor=NULL;
	int	i;
	switch (msg) {
		case WM_INITDIALOG:
			DragAcceptFiles(hDlg, TRUE);
			if(file)
				SendMessage(GetDlgItem(hDlg,IDC_LISTBOX1) , LB_ADDSTRING , 0 , (LPARAM)file);
			return TRUE;
		case WM_DROPFILES:
			hDrop = (HDROP)wParam;
			fmax = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0);
			for(i = 0; i < (int)fmax; i++) {
				DragQueryFile(hDrop, i, buf, sizeof(buf)/sizeof(TCHAR));
				SendMessage(GetDlgItem(hDlg,IDC_LISTBOX1) , LB_ADDSTRING , 0 , (LPARAM)buf);
			}
			DragFinish(hDrop);
			break;
		case WM_COMMAND:
			switch (LOWORD(wParam)) {
				case IDOK:
					fmax=(UINT)SendMessage(GetDlgItem(hDlg,IDC_LISTBOX1) ,LB_GETCOUNT,0,0);
					hr=WMCreateEditor(&pEditor);	// オブジェクトを作成
					for(i = 0; i < (int)fmax; i++){
						SendMessage(GetDlgItem(hDlg,IDC_LISTBOX1) ,LB_GETTEXT,i,(LPARAM)buf);
						if(wma_title_chg(pEditor,buf)==true){

						}
					}
					EndDialog(hDlg, TRUE);
					return TRUE;
				case IDCANCEL:
					EndDialog(hDlg,FALSE);
					return FALSE;
				default:
					return FALSE;
			}
			default:
				return FALSE;
	}
	return TRUE;
}

// WMAファイルのタイトル・アルバムタイトル・アーティスト名を全角から半角に変換する

bool wma_title_chg(IWMMetadataEditor* pEditor,TCHAR* fname){

	bool flag=false;
	HRESULT hr;
	IWMHeaderInfo3* pHeaderInfo=NULL;

	hr=pEditor->Open(fname);
	pEditor->QueryInterface(IID_IWMHeaderInfo3,(void**)&pHeaderInfo);

	WORD wStreamNum = 0;
	WMT_ATTR_DATATYPE Type;
	WORD cbLength;

	TCHAR* getname;
	TCHAR pwszTitle[1024];

	Type=WMT_TYPE_STRING;
	getname=_TEXT("Title");
	//	タイトルの文字数を取得
	hr=pHeaderInfo->GetAttributeByName(&wStreamNum,getname,&Type, NULL, &cbLength );
	if( ! FAILED(hr)){
		if( cbLength){
		//	タイトルを取得
			hr = pHeaderInfo->GetAttributeByName( &wStreamNum, getname, &Type,(BYTE *) pwszTitle, &cbLength );
			if( !FAILED( hr ) ){
				if(zen2han(pwszTitle)){
			//	タイトルを変更
					hr=pHeaderInfo->SetAttribute(wStreamNum,getname,Type, (BYTE*)pwszTitle, cbLength );
					flag=true;
				}
			}
		}
	}

	getname=_TEXT("WM/AlbumTitle");
	//	アルバムタイトル文字数を取得
	hr=pHeaderInfo->GetAttributeByName(&wStreamNum,getname,&Type, NULL, &cbLength );
	if(!FAILED(hr)){
		if( cbLength){
	//	アルバムタイトルを取得
			hr = pHeaderInfo->GetAttributeByName( &wStreamNum, getname, &Type,(BYTE *) pwszTitle, &cbLength );
			if( !FAILED( hr ) ){
				if(zen2han(pwszTitle)){
				//	アルバムタイトルを変更
					hr=pHeaderInfo->SetAttribute(wStreamNum,getname,Type, (BYTE*)pwszTitle, cbLength );
					flag=true;
				}
			}
		}
	}

	getname=_TEXT("WM/AlbumArtist");
	//	アーティストの文字数を取得
	hr=pHeaderInfo->GetAttributeByName(&wStreamNum,getname,&Type, NULL, &cbLength );
	if(!FAILED(hr)){
		if( cbLength){
			//	アーティストを取得
			hr = pHeaderInfo->GetAttributeByName( &wStreamNum, getname, &Type,(BYTE *) pwszTitle, &cbLength );
			if( !FAILED( hr ) ){
				if(zen2han(pwszTitle)){
				//	アーティストを変更
					hr=pHeaderInfo->SetAttribute(wStreamNum,getname,Type, (BYTE*)pwszTitle, cbLength );
					flag=true;
				}
			}
		}
	}
	pHeaderInfo->Release();
	if(flag==true){
	//	変更を保存
		pEditor->Flush();
	}
	pEditor->Close();
	return flag;
}

//	全角文字を半角に変換する 変換された文字があった場合はtrueを返す

bool zen2han(TCHAR* s){
	bool f=false;
	TCHAR* p=s;

	while(*p){
		if(0xff01<=*p  && *p<=0xff5d){	//	全角数字英字記号の場合
			*p-=0xff00-0x20;
			f=true;
		}else if(*p==_T(' ')){
			*p=_T(' ');
			f=true;
		}
		++p;
	}
	return f;
}

resource.h

#define IDC_LISTBOX1 2001

resource.rc

#include <windows.h>
#include "resource.h"


DLG1 DIALOG DISCARDABLE  0, 0, 174, 185
STYLE DS_MODALFRAME | WS_POPUP
CAPTION "WMAタイトル半角変換"
FONT 9, "MS Pゴシック"
BEGIN
	CONTROL "ListBox", IDC_LISTBOX1, "LISTBOX", WS_CHILD | WS_VISIBLE | WS_VSCROLL | LBS_DISABLENOSCROLL , 7, 26, 160, 128
	LTEXT			"ここへファイルをドラッグドロップしてください",-1,7,7,168,10
	DEFPUSHBUTTON	"OK",IDOK,62,168,50,14
END

実行ファイルとソースファイルのダウンロード