山本ワールド
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)
概要
複数のWMAファイルのタイトル、アルバムタイトル、アーティストを全角英数から半角英数に変換するプログラムです。複数のWMAファイルアーティスト名・タイトル変更プログラム(32/64bit) のGUI版となります。
          WMAファイルは本プログラムにファイルをドラックドロップして指定します。
          ドラッグドロップ後にOKボタンをクリックすると変換されます。
          複数ファイルの同時変更に対応します。
変更履歴
          2014.04.30 初版
2014.05.07 EXEファイル実行前にドラッグ&ドロップした場合のファイル名にダブルコーテーションが付加される場合に対応。
        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
        Copyright (C) 2012 山本ワールド All Rights Reserved.
      
      
    