none
Почему System.Diagnostics.Process.Star не делает активным открытое окно? RRS feed

  • Вопрос

  • Доброе утро

    Откываю файл документ во внешней программе

    System.Diagnostics.Process.Start(filePath);
    


    файл открывается но активным остается мое приложение. Как сделать чтобы активным было это открытое System.Diagnostics.Process.Start окно?

    4 ноября 2011 г. 3:08

Ответы

  • > Как сделать чтобы активным было это открытое System.Diagnostics.Process.Start окно?

     
    вызвать SetForegroundWindow
     
    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                var p = System.Diagnostics.Process.Start("notepad");
                var b = new Button
                {
                    Parent = this
                };
                b.Click += delegate
                {
                    SetForegroundWindow(p.MainWindowHandle);
                };
            }
    
            [DllImportAttribute("User32.dll")]
            private static extern IntPtr SetForegroundWindow(IntPtr hWnd);
        }
    }
    
    
    
    
    • Предложено в качестве ответа Malobukv 4 ноября 2011 г. 19:12
    • Помечено в качестве ответа a_basic_man 5 ноября 2011 г. 3:12
    4 ноября 2011 г. 11:15
  • попробовал так

    public void OpenFunc(string path)
            {
                var p = System.Diagnostics.Process.Start(path);
    
                try
                {
                    SetForegroundWindow(p.MainWindowHandle);
    
                    this.WindowState = System.Windows.WindowState.Minimized;
    
                    p.WaitForExit();
    
                    this.WindowState = System.Windows.WindowState.Normal;
                }
                catch { }
                
            }
    


     

    работает.
    • Помечено в качестве ответа Abolmasov Dmitry 7 ноября 2011 г. 9:40
    5 ноября 2011 г. 3:12

Все ответы

  • в частности файлы djvu-формата не хотят активного состояния

    4 ноября 2011 г. 8:59
  • > Как сделать чтобы активным было это открытое System.Diagnostics.Process.Start окно?

     
    вызвать SetForegroundWindow
     
    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                var p = System.Diagnostics.Process.Start("notepad");
                var b = new Button
                {
                    Parent = this
                };
                b.Click += delegate
                {
                    SetForegroundWindow(p.MainWindowHandle);
                };
            }
    
            [DllImportAttribute("User32.dll")]
            private static extern IntPtr SetForegroundWindow(IntPtr hWnd);
        }
    }
    
    
    
    
    • Предложено в качестве ответа Malobukv 4 ноября 2011 г. 19:12
    • Помечено в качестве ответа a_basic_man 5 ноября 2011 г. 3:12
    4 ноября 2011 г. 11:15
  • не знаю как WindowsForms, а в  WPF открытое окно все еще остается позади моего приложения. 

    5 ноября 2011 г. 2:58
  • попробовал так

    public void OpenFunc(string path)
            {
                var p = System.Diagnostics.Process.Start(path);
    
                try
                {
                    SetForegroundWindow(p.MainWindowHandle);
    
                    this.WindowState = System.Windows.WindowState.Minimized;
    
                    p.WaitForExit();
    
                    this.WindowState = System.Windows.WindowState.Normal;
                }
                catch { }
                
            }
    


     

    работает.
    • Помечено в качестве ответа Abolmasov Dmitry 7 ноября 2011 г. 9:40
    5 ноября 2011 г. 3:12
  • > var p = System.Diagnostics.Process.Start(path); try { SetForegroundWindow(p.MainWindowHandle); ...


    лучше подождать пока процесс полностью запустится.

    var p = System.Diagnostics.Process.Start(path); 
    ...
    if(p.WaitForInputIdle(1000))
    {
        ...
    }

     



    • Изменено Malobukv 5 ноября 2011 г. 3:41
    5 ноября 2011 г. 3:37
  • не совсем понял. Ждать для чего? Чтобы свернуть свое окно?

    5 ноября 2011 г. 3:58
  • > Ждать для чего?

     
    чтобы не получить exception. см. MainWindowHandle (бывает, что дескриптор создается не сразу; чтобы дождаться надо вызвать WaitForInputIdle).

     

    5 ноября 2011 г. 4:16
  • ясно. Только у меня exception выходит когда второй документ djvu открывается в главном окне первого документа.
    5 ноября 2011 г. 4:40
  • Здравствуйте.

    А SetFocus (http://bytes.com/topic/c-sharp/answers/436986-process-setfocus) и SetActiveWindow (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646311(v=vs.85).aspx) пробовали? 

    P.S. Может быть поможет это -> http://www.firststeps.ru/mfc/winapi/win/r.php?92


    С Уважением, Михаил.
    7 ноября 2011 г. 5:54
  • делаю так

    System.Diagnostics.Process myProcess = System.Diagnostics.Process.Start(path);
                myProcess.Start();
    
    
                if (myProcess.WaitForInputIdle(2000))
                {
                    IntPtr hWnd = myProcess.Handle;
                    SetFocus(new HandleRef(null, hWnd));
                }
    
    [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
             public static extern IntPtr SetFocus(HandleRef hWnd);
    

     

    выводит ошибку

    System.InvalidOperationException was unhandled
      Message=Нет процессов, связанных с этим объектом.
      Source=System
      StackTrace:
           в System.Diagnostics.Process.EnsureState(State state)
           в System.Diagnostics.Process.EnsureState(State state)
           в System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited)
           в System.Diagnostics.Process.WaitForInputIdle(Int32 milliseconds)
           в E_Book_template_2._0.Book.OpenFunc(String path) в C:\Documents and Settings\Programmer\Мои документы\E-books\Gordeeva\Gordeeva_e_book\E_Book_template_2.0\Book.xaml.cs:строка 433
           в E_Book_template_2._0.Addons.listView_SelectionChanged(Object sender, SelectionChangedEventArgs e) в C:\Documents and Settings\Programmer\Мои документы\E-books\Gordeeva\Gordeeva_e_book\E_Book_template_2.0\Addons.xaml.cs:строка 42
           в System.Windows.Controls.SelectionChangedEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
           в System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
           в System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
           в System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
           в System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
           в System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
           в System.Windows.Controls.ListBox.OnSelectionChanged(SelectionChangedEventArgs e)
           в System.Windows.Controls.Primitives.Selector.InvokeSelectionChanged(List`1 unselectedItems, List`1 selectedItems)
           в System.Windows.Controls.Primitives.Selector.SelectionChanger.End()
           в System.Windows.Controls.Primitives.Selector.SelectionChanger.SelectJustThisItem(Object item, Boolean assumeInItemsCollection)
           в System.Windows.Controls.ListBox.MakeSingleSelection(ListBoxItem listItem)
           в System.Windows.Controls.ListBox.NotifyListItemClicked(ListBoxItem item, MouseButton mouseButton)
           в System.Windows.Controls.ListBoxItem.HandleMouseButtonDown(MouseButton mouseButton)
           в System.Windows.Controls.ListBoxItem.OnMouseLeftButtonDown(MouseButtonEventArgs e)
           в System.Windows.UIElement.OnMouseLeftButtonDownThunk(Object sender, MouseButtonEventArgs e)
           в System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
           в System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
           в System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
           в System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
           в System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
           в System.Windows.UIElement.OnMouseDownThunk(Object sender, MouseButtonEventArgs e)
           в System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
           в System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
           в System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
           в System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
           в System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
           в System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
           в System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
           в System.Windows.Input.InputManager.ProcessStagingArea()
           в System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
           в System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
           в System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
           в System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
           в System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
           в MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
           в MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
           в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
           в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
           в System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
           в MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
           в MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
           в System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
           в System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
           в System.Windows.Threading.Dispatcher.Run()
           в System.Windows.Application.RunDispatcher(Object ignore)
           в System.Windows.Application.RunInternal(Window window)
           в System.Windows.Application.Run(Window window)
           в System.Windows.Application.Run()
           в E_Book_template_2._0.App.Main() в C:\Documents and Settings\Programmer\Мои документы\E-books\Gordeeva\Gordeeva_e_book\E_Book_template_2.0\obj\x86\Debug\App.g.cs:строка 0
           в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
           в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
           в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           в System.Threading.ThreadHelper.ThreadStart()
      InnerException:

    на строке

    if

     

    (myProcess.WaitForInputIdle(2000))

     

     
    7 ноября 2011 г. 7:00
  • myProcess.Start();
     

    убрал, результат тот же

    7 ноября 2011 г. 7:06
  • myProcess.Start();
     

    убрал, результат тот же


    в смысле мое окно активно
    7 ноября 2011 г. 7:09
  • Здравствуйте.

    Вы решили данную проблему? Ответы выше, там где вы написали, что работает - являются решением, или же проблема сохраняется?


    Для связи [mail]
    7 ноября 2011 г. 9:43
  • здравствуйте. Да, этот ответ является решением.

    Но хотелось бы более лучшего решения - без сворачивания окна.

    7 ноября 2011 г. 9:58