WMAファイルアーティスト名・タイトルの一括編集GUIプログラム(32/64bit)

icon 項目のみ表示/展開表示の切り替え

概要

本プログラムの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

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