#include // winmm.lib をリンクする #pragma comment(lib,"winmm") #define FILENAME "Windows XP Startup.wav" LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { HANDLE fh; DWORD dwFileSize,dwReadSize; static LPCSTR lpSound; switch(uMsg){ case WM_CREATE: fh=CreateFile(FILENAME,GENERIC_READ,0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(fh==INVALID_HANDLE_VALUE){ MessageBox(NULL,"ファイルが開けません",FILENAME,MB_OK); return -1; //WM_CREATE が -1 を返すとウィンドウ破棄 } dwFileSize=GetFileSize(fh,NULL); lpSound=(LPCSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwFileSize); ReadFile(fh,(LPVOID)lpSound,dwFileSize,&dwReadSize,NULL); CloseHandle(fh); return 0; case WM_DESTROY: PlaySound(NULL,NULL,0); HeapFree(GetProcessHeap(),0,(LPVOID)lpSound); PostQuitMessage(0); return 0; case WM_LBUTTONDOWN: //再生 PlaySound(lpSound,NULL,SND_MEMORY | SND_ASYNC | SND_LOOP); return 0; case WM_RBUTTONDOWN: //停止 PlaySound(NULL,NULL,0); return 0; } return DefWindowProc(hWnd,uMsg,wParam,lParam); } int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow) { WNDCLASS wc; MSG msg; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = __FILE__; if(!RegisterClass(&wc)) return 0; HWND hWnd=CreateWindow( __FILE__,"PlaySound関数によるWAVEファイル再生(メモリから)", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInstance,NULL); if(hWnd==NULL) return 0; BOOL bRet; while((bRet=GetMessage(&msg,NULL,0,0))!=0){ if(bRet==-1) break; DispatchMessage(&msg); } return (int)msg.wParam; }