山本ワールド
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
動作例
本プログラムを起動した状態
プログラムソースの概要
gwmap.cpp
_tWinMain
起動前にドラッグ&ドロップされた場合、そのファイル名を保存します。起動前にドラッグ&ドロップされなかった場合は、ファイル入力のコモンダイアログボックスを表示ファイル名の取得します。DlgProc1
ダイアログの初期化時にDlgProc1関数にWM_INITDIALOGメッセージが発生するので、ファイル名をダイアログボックスに表示します。その後、WMAファイルのタイトル名等を取得し、ダイアログボックスに表示します。エディットボックスが編集された場合
WM_COMMANDメッセージが発生するので、HIWORD(wParam)==EN_UPDATEである場合、エディットボックスが変更されたことを示すメッセージとなるので、編集されたことをedit変数に保存します。OKボタン
ボタンがクリックされると、DlgProc1関数にWM_COMMANDメッセージが発生するので、OKボタンのメッセージの場合、ダイアログボックスの各エディットボックスの文字列を取得し、WMAファイルを変更します。wma_title_get
ダイアログボックスのエディットボックスの内容を取得しSetAttribute APIでWMAファイルを変更します。wma_title_chg
WMAファイルのタイトル・アルバムタイトル・アーティスト名を全角から半角に変換します。ソースコード
gwmap.cpp
// ドラッグ&ドロップ又は起動時に指定したWMAファイルのタイトル・アルバムタイトル・アーティスト名等を編集する
#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;
}else{
if (GetFileName(f, sizeof(f) / sizeof(TCHAR)) == FALSE){
return - 1;
}
file=f;
}
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 files(*.wma)\0\0");
o.lpstrDefExt = _TEXT("wma");
o.lpstrTitle = _TEXT("WMAファイルを指定");
o.nFilterIndex = 1;
return GetOpenFileName(&o);
}
// ダイアログボックスのプロシージャー
LRESULT CALLBACK DlgProc1(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam){
IWMMetadataEditor* pEditor=NULL;
HRESULT hr;
static bool edit=false;
switch (msg) {
case WM_INITDIALOG:
::hDlg=hDlg;
SetWindowText(hDlg,file);
hr = WMCreateEditor(&pEditor); // オブジェクトを作成
if(wma_title_get(pEditor, file)==false)
EndDialog(hDlg, TRUE);
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
if(edit==true){
hr = WMCreateEditor(&pEditor); // オブジェクトを作成
wma_title_chg(pEditor, file);
}
EndDialog(hDlg, TRUE);
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("Title");
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_TITLE),pwszTitle);
// 参加アーティストを取得
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);
// トラック番号を取得
Type=WMT_TYPE_STRING;
getname=_TEXT("WM/TrackNumber");
pwszTitle[0]=_T('\0');
hr=pHeaderInfo->GetAttributeByName(&wStreamNum,getname,&Type, NULL, &cbLength );
hr = pHeaderInfo->GetAttributeByName( &wStreamNum, getname, &Type,(BYTE *) pwszTitle, &cbLength );
if (Type == WMT_TYPE_DWORD){
DWORD v = *((DWORD *)pwszTitle);
_stprintf_s(pwszTitle, sizeof(pwszTitle) / sizeof(TCHAR), _TEXT("%i"), v);
}
SetWindowText(GetDlgItem(::hDlg,IDC_TRACK_NUMBER),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("Title");
GetWindowText(GetDlgItem(::hDlg,IDC_TITLE),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("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 );
// トラック番号を変更
Type = WMT_TYPE_STRING;
getname=_TEXT("WM/TrackNumber");
GetWindowText(GetDlgItem(::hDlg,IDC_TRACK_NUMBER),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
resource.rc
#include <windows.h>
#include "resource.h"
DLG1 DIALOG DISCARDABLE 0, 0, 320, 185
STYLE DS_MODALFRAME | WS_POPUP
CAPTION "WMAファイルプロパティ変更"
FONT 9, "MS Pゴシック"
BEGIN
CONTROL "タイトル(Title)", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 8, 96, 14
CONTROL "", IDC_TITLE, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 110, 7, 203, 14
CONTROL "参加アーティスト(Author)", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 29, 96, 14
CONTROL "", IDC_AUTHOR, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 110, 28, 203, 14
CONTROL "アルバムアーティスト(WM/AlbumArtist)", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 50, 96, 28
CONTROL "", IDC_ALBUM_ARTIST, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 110, 49, 203, 14
CONTROL "アルバム(WM/AlbumTitle)", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 71, 96, 28
CONTROL "", IDC_ALBUM_TITLE, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 110, 70, 203, 14
CONTROL "トラック番号(WM/TrackNumber)", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 92, 96, 28
CONTROL "", IDC_TRACK_NUMBER, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 110, 91, 203, 14
DEFPUSHBUTTON "OK(&O)",IDOK,85,168,50,14
PUSHBUTTON "キャンセル(&C)",IDCANCEL,185,168,50,14
END
Copyright (C) 2012 山本ワールド All Rights Reserved.