

お世話になります。  
表題のとおりなんですが、C#でウィンドウメッセージを受信したときに、イベントを発生させたいと考えています。  
とりあえず、ウィンドウメッセージを受信する処理とイベントクラスの作成はできたのですが、イベントを発生させる方法がよくわかりません。  
下記のコードでは、コンパイルエラーが起きてしまうようです。  
アドバイスを頂けないでしょうか。  
よろしくお願いします。

[code]

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WndMessage{
        public class WndMessage{
    
            // メッセージ処理関数用デリゲート
            private delegate int D_MyWndProc(IntPtr hwnd, int msg, int wParam, int lParam);
    
            // ウィンドウをサブクラス化するAPI
            private static int GWL_WNDPROC = -4;
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "GetWindowLongA")]
            extern static int GetWindowLong(IntPtr hwnd, int nIndex);
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetWindowLongA")]
            extern static int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewLong);
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetWindowLongA")]
            extern static int SetWindowLong(IntPtr hwnd, int nIndex, D_MyWndProc dwNewLong);
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "CallWindowProcA")]
            extern static int CallWindowProc(int lpPrevWndFunc, IntPtr hwnd, int msg, int wParam, int lParam);
    
            // デフォルトのメッセージ処理関数
            private static int lngWnP;
    
            // 独自メッセージの処理を開始
            public void StartReceiveMessage(IntPtr hwnd){
                lngWnP = GetWindowLong(hwnd, GWL_WNDPROC);
                SetWindowLong(hwnd, GWL_WNDPROC, MyWndProc);
            }
    
            // 独自メッセージの処理を終了
            public void ExitReceiveMessage(IntPtr hwnd){
                SetWindowLong(hwnd, GWL_WNDPROC, lngWnP);
            }
    
            // ウィンドウに来たメッセージを振り分ける関数
            private static int MyWndProc(IntPtr hwnd, int msg, int wParam, int lParam){
                return CallWindowProc(lngWnP, hwnd, msg, wParam, lParam);
            }
    
            public class MessageEventArgs : EventArgs {
                private readonly int msg;
                private readonly int lParam;
                private readonly int wParam;
    
                public MessageEventArgs(int msg, int lParam, int wParam){
                    this.msg = msg;
                    this.lParam = lParam;
                    this.wParam = wParam;
                }
    
                public int msg{
                    get { return msg; }
                }
    
                public int lParam{
                    get { return lParam; }
                }
    
                public int wParam{
                    get { return wParam; }
                }
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2018-07-03T00:29:28.903
45249
2018-07-03T07:36:45.590
2018-07-03T01:48:35.547
29034
question
c#
C#でウィンドウメッセージ受信時にイベントを発生させたい


> error CS0102: 型 'WndMessage.MessageEventArgs' は 'msg' の定義を既に含んでいます。

`private readonly int msg;` フィールドと `public int msg{ get { return msg; } }`
プロパティとで名前が重複しています。フィールド、プロパティ、メソッド等で同名の識別子を使用することはできません。

* * *

>
[code]

>     private static int lngWnP;
>  
[/code]

ここに限らず、ウィンドウプロシージャを`int`で保持していますが64bit環境で破綻します。`IntPtr`を使用するとともに`Get/SetWindowLongPtr`も検討してください。


CC BY-SA 4.0
2018-07-03T07:36:45.590
45260
2018-07-03T07:36:45.590
4236
45249
answer