山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他WMAファイルアーティスト名・タイトルの一括編集GUIプログラム(32/64bit)
概要
本プログラムのEXEファイルにWMAファイルをドラッグ&ドロップまたは、起動時にWMAファイルを指定すると、タイトル、アルバムタイトル、アーティスト等をダイアログボックスのエディットボックス表示します。
エディットボックスの値を編集した場合、OKをクリックするとWMAファイルを変更します。
テスト環境
コンパイラ
Visual C++ 2008/2013 Express 32/64bit UNICODE実行環境
Windows XP Professional Service Pack 3 32bit(Virtual Box上の仮想マシーン)Windows 7 Enterprise Service Pack 1 64bit
動作例
本プログラムを起動した状態
プログラムソースの概要
gwmap2.cpp
_tWinMain
起動前にドラッグ&ドロップされた場合、そのファイル名を保存します。その後ダイアログボックスを表示します。DlgProc1
ダイアログの初期化時にDlgProc1関数にWM_INITDIALOGメッセージが発生するので、ファイル名をダイアログボックスに表示します。ドラッグ&ドロップ
本プログラム起動時に引数があった場合は、リストボックスにその内容を設定します。 ファイルがドラッグ&ドラッグされるとDlgProc1関数にWM_DROPFILESメッセージが発生するので、DragQueryFile関数で最初にファイルの個数を取得し、次にファイル名を取得します。 取得されたファイル名は、リストボックスに登録します。初期値ボタン
ボタンがクリックされると、DlgProc1関数にWM_COMMANDメッセージが発生するので、初期値ボタンのメッセージの場合、リストボックスに登録されているファイルを順番に検索し、最初に有効なアーティスト名等が見つかったものを初期値としてエディットボックスにその内容を登録します。アーティスト複写ボタン
ボタンがクリックされると、DlgProc1関数にWM_COMMANDメッセージが発生するので、アーティスト複写ボタンのメッセージの場合、エディットボックスの参加アーティスト又はアーティストのうち有効なものを有効でない方へコピーする。OKボタン
OKボタンがクリックされると、DlgProc1関数にWM_COMMANDメッセージが発生するので、OKボタンのメッセージの場合、ダイアログボックスの各エディットボックスの文字列を取得し、WMAファイルを変更します。wma_title_get
GetAttributeByName APIでWMAファイルからタイトル等から取得しダイアログボックスのエディットボックスの内容を変更します。wma_title_chg
ダイアログボックスのエディットボックスの内容を取得しSetAttribute APIでWMAファイルを変更します。ソースコード
gwmap2.cpp
// ドラッグ&ドロップされたWMAファイルのアルバムタイトル・アーティスト名を同じ名称で変更する。
// 初期値ボタンをクリックすると最初に有効な名称が設定されているファイルのアーティスト・アルバム名等をエディットボックスにコピーする。
// アーティスト複製をクリックするとエディットボックスの参加アーティスト又はアーティストのうち有効なものを有効でない方へコピーする。
// OKボタンをクリックすると変更を適用する。
#include <windows.h>
#include <tchar.h>
#include <wmsdk.h>
#include <stdio.h>
#include "resource.h"
#pragma comment(lib,"wmvcore.lib")
// ファイル名を指定するコモンダイアログを表示
BOOL GetFileName(TCHAR* fname,int sz);
// ダイアログボックスのプロシージャー
LRESULT CALLBACK DlgProc1(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
// WMAファイルのタイトル・アルバムタイトル・アーティスト名等をダイアログボックスに表示する
bool wma_title_get(IWMMetadataEditor* pEditor,TCHAR* fname);
// WMAファイルのタイトル・アルバムタイトル・アーティスト名等を変更する
bool wma_title_chg(IWMMetadataEditor* pEditor,TCHAR* fname);
TCHAR* file=0;
HWND hDlg;
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;
}
if(DialogBox(hInstance, TEXT("DLG1"), 0, (DLGPROC)DlgProc1)){
}
return 0;
}
// ファイル名を指定するコモンダイアログを表示
BOOL GetFileName(TCHAR* fname,int sz){
OPENFILENAME o;
fname[0]=_T('\0');
ZeroMemory(&o,sizeof(o));
o.lStructSize=sizeof(o);
o.Flags=0;
o.lpstrFile=fname;
o.nMaxFile=sz;
o.lpstrFilter=_TEXT("wma\0");
o.nFilterIndex=1;
return GetOpenFileName(&o);
}
// ダイアログボックスのプロシージャー
LRESULT CALLBACK DlgProc1(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam){
IWMMetadataEditor* pEditor=NULL;
HRESULT hr;
TCHAR buf[MAX_PATH];
HDROP hDrop;
UINT fmax;
int i;
static bool edit=false;
switch (msg) {
case WM_INITDIALOG:
::hDlg=hDlg;
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){
}
}
MessageBox(hDlg, _TEXT("変換しました"), _TEXT("メッセージ"), MB_OK);
EndDialog(hDlg, TRUE);
return TRUE;
case IDC_SET:
fmax = (UINT)SendMessage(GetDlgItem(hDlg, IDC_LISTBOX1), LB_GETCOUNT, 0, 0);
for (i = 0; i < (int)fmax; i++){
hr = WMCreateEditor(&pEditor); // オブジェクトを作成
SendMessage(GetDlgItem(hDlg, IDC_LISTBOX1), LB_GETTEXT, i, (LPARAM)buf);
if (wma_title_get(pEditor, buf) == true){
break;
}
}
return TRUE;
case IDC_ACPY:{
TCHAR author[1024];
GetWindowText(GetDlgItem(hDlg, IDC_ALBUM_ARTIST), buf, sizeof(buf) / sizeof(TCHAR));
GetWindowText(GetDlgItem(hDlg, IDC_AUTHOR), author, sizeof(author) / sizeof(TCHAR));
if (_tcsstr(author, _TEXT("アーティスト情報なし"))){
SetWindowText(GetDlgItem(hDlg, IDC_AUTHOR), buf);
}else{
if(author[0]){
SetWindowText(GetDlgItem(hDlg, IDC_ALBUM_ARTIST), author);
}else
SetWindowText(GetDlgItem(hDlg, IDC_AUTHOR), buf);
}
return TRUE;
}
case IDCANCEL:
EndDialog(hDlg,FALSE);
return FALSE;
case IDC_TITLE:
case IDC_AUTHOR:
case IDC_ALBUM_ARTIST:
case IDC_ALBUM_TITLE:
case IDC_TRACK_NUMBER:
if(HIWORD(wParam)==EN_UPDATE){ // エディットボックスが変更されたときに発生する
edit=true; // 編集された場合にtrue
}
return FALSE;
default:
return FALSE;
}
default:
return FALSE;
}
return TRUE;
}
// WMAファイルのアルバムタイトル・アーティスト名等をダイアログボックスに表示する
bool wma_title_get(IWMMetadataEditor* pEditor,TCHAR* fname){
bool flag=true;
HRESULT hr;
IWMHeaderInfo3* pHeaderInfo=NULL;
hr=pEditor->Open(fname);
if(FAILED(hr)){
MessageBox(::hDlg,fname,_TEXT("ファイルが開けません"),MB_OK);
return false;
}
pEditor->QueryInterface(IID_IWMHeaderInfo3,(void**)&pHeaderInfo);
WORD wStreamNum = 0;
WMT_ATTR_DATATYPE Type;
WORD cbLength=0;
TCHAR* getname;
TCHAR pwszTitle[1024];
WM_PICTURE* pP=0;
// 参加アーティストを取得
Type=WMT_TYPE_STRING;
getname=_TEXT("Author");
pwszTitle[0]=_T('\0');
hr=pHeaderInfo->GetAttributeByName(&wStreamNum,getname,&Type, NULL, &cbLength );
hr = pHeaderInfo->GetAttributeByName( &wStreamNum, getname, &Type,(BYTE *) pwszTitle, &cbLength );
SetWindowText(GetDlgItem(::hDlg,IDC_AUTHOR),pwszTitle);
// アルバムアーティストを取得
Type=WMT_TYPE_STRING;
getname=_TEXT("WM/AlbumArtist");
pwszTitle[0]=_T('\0');
hr=pHeaderInfo->GetAttributeByName(&wStreamNum,getname,&Type, NULL, &cbLength );
hr = pHeaderInfo->GetAttributeByName( &wStreamNum, getname, &Type,(BYTE *) pwszTitle, &cbLength );
SetWindowText(GetDlgItem(::hDlg,IDC_ALBUM_ARTIST),pwszTitle);
// アルバムタイトルを取得
Type=WMT_TYPE_STRING;
getname=_TEXT("WM/AlbumTitle");
pwszTitle[0]=_T('\0');
hr=pHeaderInfo->GetAttributeByName(&wStreamNum,getname,&Type, NULL, &cbLength );
hr = pHeaderInfo->GetAttributeByName( &wStreamNum, getname, &Type,(BYTE *) pwszTitle, &cbLength );
SetWindowText(GetDlgItem(::hDlg,IDC_ALBUM_TITLE),pwszTitle);
pHeaderInfo->Release();
pEditor->Close();
return flag;
}
// 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=0;
TCHAR* getname;
TCHAR pwszTitle[1024];
WM_PICTURE* pP=0;
// 参加アーティストを変更
Type=WMT_TYPE_STRING;
getname=_TEXT("Author");
GetWindowText(GetDlgItem(::hDlg,IDC_AUTHOR),pwszTitle,sizeof(pwszTitle)/sizeof(TCHAR));
cbLength = (WORD)_tcslen(pwszTitle)*sizeof(TCHAR);
hr = pHeaderInfo->SetAttribute( wStreamNum, getname, Type,(BYTE *) pwszTitle, cbLength );
// アルバムアーティストを変更
Type=WMT_TYPE_STRING;
getname=_TEXT("WM/AlbumArtist");
GetWindowText(GetDlgItem(::hDlg,IDC_ALBUM_ARTIST),pwszTitle,sizeof(pwszTitle)/sizeof(TCHAR));
cbLength = (WORD)_tcslen(pwszTitle)*sizeof(TCHAR);
hr = pHeaderInfo->SetAttribute( wStreamNum, getname, Type,(BYTE *) pwszTitle, cbLength );
// アルバムタイトルを変更
Type=WMT_TYPE_STRING;
getname=_TEXT("WM/AlbumTitle");
GetWindowText(GetDlgItem(::hDlg,IDC_ALBUM_TITLE),pwszTitle,sizeof(pwszTitle)/sizeof(TCHAR));
cbLength = (WORD)_tcslen(pwszTitle)*sizeof(TCHAR);
hr = pHeaderInfo->SetAttribute( wStreamNum, getname, Type,(BYTE *) pwszTitle, cbLength );
pHeaderInfo->Release();
pEditor->Flush();
return flag;
}
resource.h
#define IDC_TITLE 2001
#define IDC_AUTHOR 2002
#define IDC_ALBUM_ARTIST 2003
#define IDC_ALBUM_TITLE 2004
#define IDC_TRACK_NUMBER 2005
#define IDC_LISTBOX1 2006
#define IDC_SET 2007
#define IDC_ACPY 2008
resource.rc
#include <windows.h>
#include "resource.h"
DLG1 DIALOG DISCARDABLE 0, 0, 320, 285
STYLE DS_MODALFRAME | WS_POPUP
CAPTION "WMAファイルプロパティ変更"
FONT 9, "MS Pゴシック"
BEGIN
CONTROL "参加アーティスト(Author)", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 8, 96, 14
CONTROL "", IDC_AUTHOR, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 110, 7, 203, 14
CONTROL "アルバムアーティスト(WM/AlbumArtist)", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 29, 96, 28
CONTROL "", IDC_ALBUM_ARTIST, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 110, 28, 203, 14
CONTROL "アルバム(WM/AlbumTitle)", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 57, 96, 28
CONTROL "", IDC_ALBUM_TITLE, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 110, 56, 203, 14
LTEXT "ここへファイルをドラッグドロップしてください", -1, 7, 78, 168, 10
CONTROL "ListBox", IDC_LISTBOX1, "LISTBOX", WS_CHILD | WS_VISIBLE | WS_VSCROLL | LBS_DISABLENOSCROLL, 7, 92, 306, 163
DEFPUSHBUTTON "OK(&O)",IDOK,46,268,50,14
PUSHBUTTON "キャンセル(&C)",IDCANCEL,103,268,50,14
PUSHBUTTON "初期値(&S)", IDC_SET,167, 268, 50, 14
PUSHBUTTON "アーティスト複製(&A)", IDC_ACPY, 224, 268, 50, 14
END
Copyright (C) 2012 山本ワールド All Rights Reserved.