Esempio n. 1
0
        /// <summary>
        /// 起動中の同一アプリケーションに対して指定されたデータを送信します。
        /// </summary>
        /// <param name="args">送信するデータ</param>
        /// <returns>処理されたかどうかを示す値</returns>
        private bool TrySendArgs(IEnumerable <string> args)
        {
            // HACK: ウィンドウハンドルの取得
            // 本アプリは MainWindow が非表示であるため Process.MainWindowHandle からハンドルを取得できない。
            // すべてのハンドルを列挙し、ウィンドウテキストから特定を試みる。
            var target = HWND.NULL;

            if (User32_Gdi.EnumWindows(
                    new User32_Gdi.WNDENUMPROC((hWnd, _) =>
            {
                try
                {
                    var lpString = new StringBuilder(256);
                    User32_Gdi.GetWindowText(hWnd, lpString, lpString.Capacity);
                    if (lpString.ToString().Contains(Workspace.WINDOW_TITLE) == false)
                    {
                        return(true);
                    }
                    target = hWnd;
                    return(false);
                }
                catch
                {
                    return(true);
                }
            }),
                    IntPtr.Zero))
            {
                return(false);
            }

            // 引数を送信する
            var structure = new COPYDATASTRUCT();

            structure.dwData = IntPtr.Zero;
            structure.lpData = args.Any() ? string.Join("|", args) : string.Empty;
            structure.cbData = Encoding.UTF8.GetByteCount(structure.lpData) + 1;
            var lParam = Marshal.AllocHGlobal(Marshal.SizeOf(structure));

            Marshal.StructureToPtr(structure, lParam, false);
            User32_Gdi.SendMessage(target, (uint)User32_Gdi.WindowMessage.WM_COPYDATA, Process.GetCurrentProcess().Handle, lParam);
            return(true);
        }
Esempio n. 2
0
        private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            switch ((User32_Gdi.WindowMessage)msg)
            {
            case User32_Gdi.WindowMessage.WM_DRAWCLIPBOARD:
                User32_Gdi.SendMessage(this._nextHandle, (uint)msg, wParam, lParam);
                this.OnDrawClipboard();
                handled = true;
                break;

            case User32_Gdi.WindowMessage.WM_CHANGECBCHAIN:
                if (wParam == this._nextHandle)
                {
                    this._nextHandle = lParam;
                }
                else
                {
                    User32_Gdi.SendMessage(this._nextHandle, (uint)msg, wParam, lParam);
                }
                handled = true;
                break;
            }
            return(IntPtr.Zero);
        }