自分にて試行錯誤したところ、windowメッセージを取得することで欲しい機能を実装することができました。
下記に実装したコードを記しておきます。
C#
1class test : EditorWindow
2{
3 [DllImport("user32.dll", EntryPoint = "SetWindowLong")]
4 private static extern int SetWindowLong32(HandleRef hWnd, int nIndex, int dwNewLong);
5 [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")]
6 private static extern IntPtr SetWindowLongPtr64(HandleRef hWnd, int nIndex, IntPtr dwNewLong);
7
8
9
10 [DllImport("user32.dll", EntryPoint = "DefWindowProcA")]
11 private static extern IntPtr DefWindowProc(IntPtr hWnd, uint wMsg, IntPtr wParam, IntPtr lParam);
12
13 [DllImport("user32.dll")]
14 private static extern System.IntPtr GetActiveWindow();
15
16 private HandleRef hMainWindow;
17 private IntPtr oldWndProcPtr;
18 private IntPtr newWndProcPtr;
19 private WndProcDelegate newWndProc;
20
21 // P/Invokeの定義 (pinvoke.net参照)
22 public static IntPtr SetWindowLongPtr(HandleRef hWnd, int nIndex, IntPtr dwNewLong)
23 {
24 if (IntPtr.Size == 8)
25 return SetWindowLongPtr64(hWnd, nIndex, dwNewLong);
26 else
27 {
28 return new IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong.ToInt32()));
29 }
30 }
31
32 const int WM_DEVICECHANGE = 0x0219;
33
34 [StructLayout(LayoutKind.Sequential)]
35 struct DEV_BROADCAST_VOLUME
36 {
37 public uint dbch_Size;
38 public uint dbch_Devicetype;
39 public uint dbch_Reserved;
40 public uint dbch_Unitmask;
41 public ushort dbch_Flags;
42 }
43
44 private IntPtr wndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
45 {
46 if (msg == WM_DEVICECHANGE)
47 {
48 switch ((int)wParam)
49 {
50 case 0x8000:
51 Debug.Log("デバイスが挿入され利用可能になりました。");
52 DEV_BROADCAST_VOLUME device = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(lParam, typeof(DEV_BROADCAST_VOLUME));
53 uint deviceNum = device.dbch_Unitmask;
54 char deviceLet = (char)0;
55 for (int i = 0;i < 26; i++)
56 {
57 if (deviceNum == 0x01) deviceLet = (char)(i + 0x41);
58 deviceNum >>= 1;
59 }
60 Debug.Log(deviceLet.ToString());
61
62 break;
63 case 0x0007:
64 //Debug.Log("デバイスが追加または削除されました。");
65 break;
66 case 0x8004:
67 //Debug.Log("デバイスが削除されました。");
68 break;
69 default:
70 //Debug.Log("wndProc msg:0x" + msg.ToString("x4") + " wParam:0x" + wParam.ToString("x4") + " lParam:0x" + lParam.ToString("x4"));
71 break;
72 }
73
74 }
75 return DefWindowProc(hWnd, msg, wParam, lParam);
76 }
77
78 /// 終了
79 ~test()
80 {
81 Term();
82 }
83
84 /// 初期化(EditorWindowをShowした後にコール)
85 public void Init()
86 {
87 // ウインドウプロシージャをフックする
88 hMainWindow = new HandleRef(null, GetActiveWindow());
89 newWndProc = new WndProcDelegate(wndProc);
90 newWndProcPtr = Marshal.GetFunctionPointerForDelegate(newWndProc);
91 oldWndProcPtr = SetWindowLongPtr(hMainWindow, -4, newWndProcPtr);
92
93 }
94 public void Term()
95 {
96 SetWindowLongPtr(hMainWindow, -4, oldWndProcPtr);
97 hMainWindow = new HandleRef(null, IntPtr.Zero);
98 oldWndProcPtr = IntPtr.Zero;
99 newWndProcPtr = IntPtr.Zero;
100 newWndProc = null;
101 }
102
103 void OnGUI()
104 {
105 // ウィンドウハンドルが切り替わったので初期化
106 if (hMainWindow.Handle == IntPtr.Zero)
107 {
108 Init();
109 }
110 }
111}
上記のようにクラスを宣言し、Start関数内で下記のように呼ぶとウィンドウメッセージを取得できました。
私の力不足でお騒がせしました。
c#
1void Start()
2{
3 parent = ScriptableObject.CreateInstance<test>();
4 parent.Init();
5}