/// <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); }
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); }