PlaySound を Windows Forms Application (.NET) で使用するには?

解決


NORI  2007-03-30 08:00:14  No: 64812

はじめまして。  

  Windows Forms Application (.NET)  でアニメーションを作成してます。その中でドアが開閉した際、開閉音を付けたいのですが、それが出来なくて困ってます。
  
  visual .net C++  2003  のフレームワークには、音を再生するクラスはなく、windows  のクラスを使用することで(PlaySound)出来る事、そして実際  Console Application (.NET) では再生できました。(.cpp file のみ作成、WinMM.Lib  は  Linker->Input->Additional Dependencies にて添付)

  しかし、Windows Forms Application (.NET)上だと、どこに  #include <windows.h>  と  #using <mscorlib.dll>  を宣言すれば良いのかが分かりません。(.cpp file なのか  .h file  なのか)

  おそらく、そのせいで、 
Form1.h(21): error C2065: 'SND_FILENAME' : undeclared identifier 
Form1.h(21): error C3861: 'PlaySound': identifier not found, even with argument-dependent lookup 
のエラーが発生するのだと思っているのですが。 

  ちなみに今は、Form1.h  の一番上に 
#include "stdafx.h" 
#include "Form1.h" 
#include <windows.h> 
#using <mscorlib.dll> 
using namespace mySomething; 
の順に宣言してます。 

  何かご存知でしたら、よろしくお願いします。


Blue  2007-03-30 09:30:35  No: 64813

普通に
>ちなみに今は、Form1.h  の一番上に 

>#include "Form1.h" 
はおかしいのでは?

Form1.hでForm1.hを#include?


NORI  2007-03-30 10:16:18  No: 64814

失礼しました。

  正しくは、Form1.cpp  の一番上に 
#include "stdafx.h" 
#include "Form1.h" 
#include <windows.h> 
#using <mscorlib.dll> 
using namespace mySomething; を、

  Form1.h  には何も宣言していません。(初期設定のまま、使用してます。)


Blue  2007-03-30 10:28:52  No: 64815

デフォルトのソースに追加したのは

#include "stdafx.h" 
#include "Form1.h" 
#include <windows.h> 
#using <mscorlib.dll> 
using namespace mySomething; 

すべてでしょうか?


Blue  2007-03-30 12:04:49  No: 64816

もしかしたら、/clrオプションがpureのままでビルドしているとか?
http://msdn2.microsoft.com/ja-jp/library/k8d11d4s(VS.80).aspx

ただし、VS2003を持っているわけではないので間違っているかも。


NORI  2007-03-31 00:11:42  No: 64817

ご返事、ありがとうございます。

  ->デフォルトのソースに追加したのは

    #include "stdafx.h" 
    #include "Form1.h" 
    #include <windows.h> 
    #using <mscorlib.dll> 
    using namespace mySomething; 

  ->すべてでしょうか?

  はい、これらのみです。

  −>もしかしたら、/clrオプションがpureのままでビルドしているとか?
  
  これについては、知らなかったので、設定を見てみると、
/clr (Common Language Runtime Compilation)  は、visual.net 2003 には無い見たいです。私のソフトは英語版なので、
http://msdn2.microsoft.com/en-us/library/ms235211(VS.80).aspx
を参考に確認したのですが。


Blue  2007-03-31 00:23:51  No: 64818

>はい、これらのみです。
いや、デフォルトのソースはそのままびるどできる状態なので、

#include <windows.h>

だけを入れればいいと思うのですけどね。


NORI  2007-03-31 00:49:31  No: 64819

Form1.cpp  の一番上に宣言すべきですよね?

  ご指摘の通り、 Form1.cpp  の一番上に 

#include "stdafx.h" 
#include "Form1.h" 
#include <windows.h> 

using namespace mySomething; と、宣言した場合、(即ち、デフォルト設定に  #include <windows.h>   のみを追加したのみ。)同じエラーが発生し、コンパイルを完了することができません。

error C3861: 'PlaySound': identifier not found, even with argument-dependent lookup
error C2065: 'SND_FILENAME' : undeclared identifier
error C2065: 'SND_SYNC' : undeclared identifier
error C3861: 'PlaySound': identifier not found, even with argument-dependent lookup

エラーコードはPlaySound  及びそのパラメーターを認識できないと言っているので、Form.h  file  上に何か宣言しなくてはいけないのでしょうか?
例えば  

#pragma once

//ここに何か  PlaySound  に関する  #include file  又は  #using file 

namespace myProject
{
  using namespace System;
  using namespace System::ComponentModel;
  using namespace System::Collections;
  using namespace System::Windows::Forms;
  using namespace System::Data;
  using namespace System::Drawing;
          //もしくはここに何か  PlaySound  に関する  using namespace 

が、必要なのでしょうか?

  ご迷惑お掛けして、申し訳御座いません。


Blue  2007-03-31 00:53:20  No: 64820

>PlaySound  
は実際どのソースで使っているのでしょうか?
Form1.cppではない?

Form1.hなら

#include "Form1.h"

の上にかくか、Form1.hの#pragma once の下 #include <windows.h>を記述すれば
いいです。
(というか、インクルードの仕方とかはC言語の基礎なんだけど。)


NORI  2007-03-31 01:17:06  No: 64821

PlaySound  は Form1.h の中で

  private: System::Void button1_Click(System::Object *  sender,     System::EventArgs *  e)
{    
    PlaySound("mySound1.wav", Handle, SND_FILENAME |SND_SYNC);
}

のような感じで、使ってます。

  ご指摘のように、 #include <windows.h>  を  Form1.hの#pragma once の下に宣言したところ、違うエラーが発生しました。

error C2039: 'GetObjectA' : is not a member of 'System::Resources::ResourceManager'  (2 lines)

error C2039: 'GetObjectA' : is not a member of 'System::Resources::ResourceManager'
        stdafx.cpp(0) : see declaration of 'System::Resources::ResourceManager'  (18 lines)

にプラス前回のエラー
error C3861: 'PlaySound': identifier not found, even with argument-dependent lookup
error C2065: 'SND_FILENAME' : undeclared identifier
error C2065: 'SND_SYNC' : undeclared identifier
error C3861: 'PlaySound': identifier not found, even with argument-dependent lookup

  依然、どこかのサイトで、このエラーは  .NET と  WINDOWS  のシステムが内部で衝突をするので起こると、見たような気がするのですが、そうなのでしょうか?

  C++  から始めたので。Cも勉強すべきなんですね。


Blue  2007-03-31 01:29:05  No: 64822

VS2005 +最新のPlatform SDKでは
>NET と  WINDOWS  のシステムが内部で衝突をするので起こる
ことがないようにできているのですが、
それ以前はできていないのですかね。

PlaySoundしか使わないのであれば、
C#やVB.NETのようにDllImportを使うとか。

参考:http://dobon.net/vb/dotnet/programing/playsystemsound.html#playsound
# .NET Framework2.0ならSystem.Media.SystemSoundsというクラスがあるらしいが。


Blue  2007-03-31 01:31:20  No: 64823

一応
http://support.microsoft.com/kb/888267/ja
ってのがありました。


みけにゃん  URL  2007-03-31 07:25:42  No: 64824

#include <mmsystem.h>(リンクにwinmm.lib必要)を追加して
sndPlaySoundでも良さそうな気がします・・・・・・。

.netは使ってない(VC++6.0)なのでこんな回答ですけれど
参考にしてみてください。

http://www.kumei.ne.jp/c_lang/sdk4/sdk_342.htm


NORI  2007-04-02 09:41:51  No: 64825

Blueさん、 みけにゃんさん、  お陰で解決することが出来ました。有難う御座いました。

  正解は、

  WinMM.Lib  を  Linker->Input->Additional Dependencies にて添付

Form1.cpp  デフォルトのまま。
#include "stdafx.h" 
#include "Form1.h" 
#include <windows.h> 

  Form1.h
#pragma once
#include <windows.h>
#include <Mmsystem.h>
#ifdef GetObject
#pragma message("Undefine the GetObject function for your managed code.")
#pragma push_macro("GetObject")
#undef GetObject
#endif
namespace myProgect

でした。

  プログラムの中で.NETはのフレームワークのライブラリーのファンクション  の一つ、GetObjectを使い、イメージを取り出しているのですが、PlaySound  も同じくWINDOWSのライブラリーのGetObjectを使いWAVファイルを取り出しているようで、両方とも同じ名前のファンクションということで、システムが認識できなかったみたいです。this見たいな働きをするのが、#ifdef〜〜〜#endifのようです。

  貴重なお時間割いて頂き、本当に有難う御座いました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加