0

WPF ウィンドウで外部 .exe アプリケーションを起動する方法を教えてください。

コードの下では、WPF ウィンドウで Notepad.exe および WinWord.exe アプリケーションを開くことができますが、他のアプリケーションを開くことはできません。他の .exe アプリケーションを開こうとすると、別のウィンドウで開かれます。

public partial class Window1 : Window
{
    public IntPtr MainWindowHandle { get; set; }


    [DllImport("user32.dll", SetLastError = true)]
    private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent);


    //[DllImport("user32.dll", SetLastError = true)]
    //private static extern int GetWindowLong(IntPtr hWnd, int nIndex);

    public Window1()
    {
        InitializeComponent();

        try
        {
            //External exe inside WPF Window 
            System.Windows.Forms.Panel _pnlSched = new System.Windows.Forms.Panel();

            WindowsFormsHost windowsFormsHost1 = new WindowsFormsHost();

            windowsFormsHost1.Child = _pnlSched;

            _Grid.Children.Add(windowsFormsHost1);

            //_Grid.Children.Add(_pnlSched);

            ProcessStartInfo psi = new ProcessStartInfo(@"C:\Program Files\Atwin\Atwin2k2.exe");

            psi.WindowStyle = ProcessWindowStyle.Normal;

            Process PR = Process.Start(psi);

            PR.WaitForInputIdle(); // true if the associated process has reached an idle state.

            System.Threading.Thread.Sleep(3000);

            IntPtr hwd = PR.MainWindowHandle;
            SetParent(PR.MainWindowHandle, _pnlSched.Handle);  // loading exe to the wpf window.

        }
        catch (Exception ex)
        { 
            //Nothing...
        }
      }



}
4

2 に答える 2

0

この動作を引き起こす可能性のあることがいくつかあります。ここでは、私が今遭遇した 2 つの別々のことを示します。

vim.exe を使用しようとしたとき、タイプ ライブラリが登録されていないという例外が初めて発生したため、登録した後、VIM.EXE が正常に読み込まれました。これは、アプリケーションの動作である可能性があります。

Eclipse をロードしようとすると、例外はありませんでしたが、Eclipse.exe が WPF ウィンドウの外にロードされました。Spy++ を見ると、Windows が WPF ウィンドウの外で開く原因となった WM_ACTIVATEAPP メッセージが見つかりました。理由は次のとおりです。

http://support.microsoft.com/kb/89563

したがって、WPFで開こうとしているアプリケーションの種類によっては、アプリケーション固有の特定の制限があるため、すべてのアプリケーションが開くわけではありません。

于 2012-05-29T03:26:05.013 に答える
0

文字列 strReportPath = System.IO.Directory.GetCurrentDirectory();

        if (strReportPath.Substring(strReportPath.Length - 9) == "bin\\Debug")
        {
            strReportPath = strReportPath.Substring(0, strReportPath.Length - 10);
        }

        Process p = new Process();
        p.StartInfo = new ProcessStartInfo(strReportPath + @"\bin\Debug\drag.exe");
        p.Start();

//drag は sln 名です。

于 2014-04-02T07:50:07.197 に答える