C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: SystemParametersInfoのBeep音設定


(過去ログ 87 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■52127 / inTopicNo.1)  SystemParametersInfoのBeep音設定
  
□投稿者/ とっぱっ (1回)-(2010/08/01(Sun) 13:56:39)

分類:[C#] 

C#で、SystemParametersInfoを使ってフォームからBEEP音の設定するものを作成しているのですが
SPI_SETBEEPが正常に動かない(ウィッチウインド上で値がかわらない)ので困っているのですが
どなたかアドバイスをお願いいたします^^;

フォーム側のプログラム--------------------------------------------------------------

        BeepSetting BeepObj1 = new BeepSetting();

        private void button1_Click(object sender, EventArgs e)
        {
            
            if (BeepObj1.BeepProperty == 0)
            {
                MessageBox.Show("ビープ音は無効に設定されています");
            }else{
                MessageBox.Show("ビープ音は有効に設定されています");
            }
            
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            if (BeepObj1.BeepProperty == 0)
            {
                BeepObj1.BeepProperty = 1;
                MessageBox.Show("ビープ音を有効にしました");
            }
            else
            {
                BeepObj1.BeepProperty = 0;
                MessageBox.Show("ビープ音を無効にしました");
            }
        }

BeepSetting側のプログラム--------------------------------------------------------------

    public class BeepSetting
    {
        private const int SPI_GETBEEP = 1;  // ビープ音のON_OFFを取得
        private const int SPI_SETBEEP = 2;  // ビープ音のON_OFFを設定
        private const int SPIF_UPDATEINIFILE = 0x1;  // 更新する
        private const int SPIF_SENDWININICHANGE = 0x2; // 全てのアプリケーションに通知して更新する
        private const int SPIF_SENDCHANGE = 2;
        
        // システムに関するパラメータを取得/設定するAPI関数
        [DllImport("user32")]
        private extern static int SystemParametersInfo
            (int uiAction,
            int uiParam,
            int pvParam,
            int fuWinIni
            );

        public int BeepAlive = 1;

        public int BeepProperty
        {
            set
            {
                SystemParametersInfo(SPI_SETBEEP, value, 0, SPIF_SENDCHANGE);
            }
           get
            {
                SystemParametersInfo(SPI_GETBEEP, 0, BeepAlive, SPIF_SENDCHANGE);

                return this.BeepAlive;
            } 

        }
    }

引用返信 編集キー/
■52128 / inTopicNo.2)  Re[1]: SystemParametersInfoのBeep音設定
□投稿者/ Hongliang (678回)-(2010/08/01(Sun) 14:30:20)
2010/08/01(Sun) 14:34:06 編集(投稿者)
> [DllImport("user32")]
> private extern static int SystemParametersInfo
> (int uiAction,
>  int uiParam,
>  int pvParam,
>  int fuWinIni
> );
SystemParametersInfo の第三引数 pvParam は PVOID 型であり、これを int で宣言するのは問題があります。
ポインタ型は IntPtr で宣言するか、あるいは参照型や参照渡しを使って値を渡すようにしなければなりません。
今回の場合、SPI_SETBEEP するときには IntPtr 型を使って IntPtr.Zero を渡し、
SPI_GETBEEP するときには out bool(または out int)を使って値を受け取れるように、
SystemParametersInfo の宣言をオーバーロードするのが簡単でしょう。

[DllImport(...)] ... SystemParametersInfo(..., ..., IntPtr pvParam, ...);
[DllImport(...)] ... SystemParametersInfo(..., ..., out bool pvParam, ...);

ほかにも、BeepAlive の意味が分かりませんし、
BeepProperty は bool 型で表現すべきではないでしょうか。
(このプロパティ名もどうかと思います)

あと、SPIF_SENDCHANGE 単独では意味がなかったような気がします。
// ユーザのシステムグローバルな設定を勝手に変えちゃっていいのかしらー?

引用返信 編集キー/
■52136 / inTopicNo.3)  Re[2]: SystemParametersInfoのBeep音設定
□投稿者/ とっぱっ (2回)-(2010/08/02(Mon) 02:08:01)
No52128 (Hongliang さん) に返信
> 2010/08/01(Sun) 14:34:06 編集(投稿者)
> 
Hongliang さん的確なアドバイスありがとうございました。

        //SPI_SETBEEPアクション用
        [DllImport("user32")] private extern static int SystemParametersInfo
            (int uiAction,
             int uiParam, 
             IntPtr pvParam 
            );

        //SPI_GETBEEPアクション用
        [DllImport("user32")] private extern static int SystemParametersInfo
            (int uiAction,
             int uiParam, 
             out bool pvParam
            );

        public void set_BeepProperty(int Value)
        {
            SystemParametersInfo(SPI_SETBEEP, Value, IntPtr.Zero);
        }

        public void get_BeepProperty(out bool Beep_onoff)
        {
            SystemParametersInfo(SPI_GETBEEP, 0, out Beep_onoff);
        } 

のように修正し、問題解決しました^^v

ただ・・・プロパティ化しようと考えたのですが、

    /*   public bool BeepProperty
        {
            set
            {
 @               SystemParametersInfo(SPI_SETBEEP, value, IntPtr.Zero);  //  value が bool型になってしまう。   
            }
           get
            {
                bool Beep_onoff = false
 A               SystemParametersInfo(SPI_GETBEEP, 0, Beep_onoff);

                return Beepon_off;
            } 

        } */  

@   部分でvalue がBOOL型になってしまい型変換できない
A  Get処理ではBeep_onoffの参照渡し、値渡しができない(引数を取れないため)

そのため、プロパティ化できませんでした・・・。

あと・・・プロパティ名の命名規則的なものがあれば、教えてください。まったくの独学なので・・
その辺わからないんです;−;


引用返信 編集キー/
■52144 / inTopicNo.4)  Re[3]: SystemParametersInfoのBeep音設定
□投稿者/ Hongliang (679回)-(2010/08/02(Mon) 11:46:09)
> //SPI_SETBEEPアクション用
> [DllImport("user32")] private extern static int SystemParametersInfo
> (int uiAction,
>  int uiParam, 
>  IntPtr pvParam 
>  );
第四引数が足りてませんよ。もう一つのオーバーロードの方も。

> (1) SystemParametersInfo(SPI_SETBEEP, value, IntPtr.Zero);  //  value が bool型になってしまう。
> (1) 部分でvalue がBOOL型になってしまい型変換できない
(a) value が true かどうかをチェックして 1 または 0 を与える
(b) SystemParametersInfo の宣言の第二引数を int の代わりに bool にする
のいずれかで解決できますね。

>     bool Beep_onoff = false
> (2) SystemParametersInfo(SPI_GETBEEP, 0, Beep_onoff);
>     return Beepon_off;
> (2) Get処理ではBeep_onoffの参照渡し、値渡しができない(引数を取れないため)
意味が分かりません。引数を取れないためってどういうことでしょう?

> あと・・・プロパティ名の命名規則的なものがあれば、教えてください。まったくの独学なので・・
> その辺わからないんです;−;
MSDN ではここです。
http://msdn.microsoft.com/ja-jp/library/ms229012.aspx
でも今回のは規則とかではなく。
このプロパティは「ビープが有効かどうか」なんだから BeepEnabled あたりにした方が分かりやすいって程度の話です。

引用返信 編集キー/
■52192 / inTopicNo.5)  Re[4]: SystemParametersInfoのBeep音設定
□投稿者/ とっぱっ (3回)-(2010/08/03(Tue) 05:53:51)
No52144 (Hongliang さん) に返信

できました!^^v ありがとうございます。

//SPI_SETBEEPアクション用
[DllImport("user32")]
private extern static int SystemParametersInfo
(int uiAction,
int uiParam,
IntPtr pvParam,
int fWinIni
);

//SPI_GETBEEPアクション用
[DllImport("user32")]
private extern static int SystemParametersInfo
(int uiAction,
int uiParam,
ref bool pvParamm,
int fWinIni
);

public bool BeepEnabled
{
set
{
if(value == false)
{
SystemParametersInfo(SPI_SETBEEP, 0, IntPtr.Zero,0);
}else{
SystemParametersInfo(SPI_SETBEEP, 1, IntPtr.Zero,0);
}
}
get
{
bool BeepEnabed = false;
SystemParametersInfo(SPI_GETBEEP, 0, ref BeepEnabed, 0);
return BeepEnabed;
}

}


> > //SPI_SETBEEPアクション用
>>[DllImport("user32")] private extern static int SystemParametersInfo
>>(int uiAction,
>> int uiParam,
>> IntPtr pvParam
>> );
> 第四引数が足りてませんよ。もう一つのオーバーロードの方も。

勝手に省略してしまいました。修正しました。

>
>> bool Beep_onoff = false
>>(2) SystemParametersInfo(SPI_GETBEEP, 0, Beep_onoff);
>> return Beepon_off;
>>(2) Get処理ではBeep_onoffの参照渡し、値渡しができない(引数を取れないため)
> 意味が分かりません。引数を取れないためってどういうことでしょう?

読んだ本に getアクセサが get_BeepEnabled(){…} というメソッドになる。
とあったので、getアクセサでは引数はとれないのかなぁと・・・。
この場合、引数を渡す必要ないですね。



引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -