Exemplo n.º 1
0
        private static IntPtr MessageCallback(int nCode, IntPtr wParam, ref WinApi.MSG lParam)
        {
            if (nCode == 0 && lParam.message == WinApi.WM_DROPFILES)
            {
                IntPtr   hDrop = lParam.wParam;
                uint     num   = WinApi.DragQueryFile(hDrop, 0xFFFFFFFF, null, 0);
                string[] files = new string[num];

                uint          bufferSize = 1024;
                StringBuilder path       = new StringBuilder((int)bufferSize);
                for (uint i = 0; i < num; i++)
                {
                    //uint size = WinApi.DragQueryFile(hDrop, i, path, bufferSize);
                    WinApi.DragQueryFile(hDrop, i, path, bufferSize);
                    files[i]    = path.ToString();
                    path.Length = 0;
                }

                WinApi.DragFinish(hDrop);

                IntPtr hwnd = lParam.hwnd;
                if (hwnd != IntPtr.Zero)
                {
                    int instanceCount = 0;

                    // 存在するインスタンス内を検索
                    foreach (UniWinApi uniwin in instances)
                    {
                        // 該当するウィンドウであった場合
                        if (uniwin.hWnd == hwnd)
                        {
                            // ファイルドロップ時のイベントを実行
                            if (uniwin.OnFilesDropped != null)
                            {
                                uniwin.OnFilesDropped(files);
                            }
                            instanceCount++;
                        }
                    }

                    // もしインスタンスが見つからなければおかしいのでログ出力
                    if (instanceCount < 1)
                    {
                        Debug.Log("File dropped, but no UniWinApi instances were found.");
                    }
                }
            }
            return(WinApi.CallNextHookEx(IntPtr.Zero, nCode, wParam, ref lParam));
        }