2015-04-07 2 views
2

Я пытаюсь разместить .exe в моем приложении .net (главным образом программное обеспечение для просмотра видео), однако некоторые приложения не позволяют мне использовать их меню или некоторые элементы управления. У кого-нибудь была эта проблема раньше или какая-либо идея, почему это может произойти?Хостинг процесса в форме C# .Net отключает кнопки процесса

Вот мой код для размещения приложения:

#region Methods/Consts for Embedding a Window 
    [DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId", SetLastError = true, 
     CharSet = CharSet.Unicode, ExactSpelling = true, 
     CallingConvention = CallingConvention.StdCall)] 
    private static extern long GetWindowThreadProcessId(long hWnd, long lpdwProcessId); 

    [DllImport("user32.dll", SetLastError = true)] 
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

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

    [DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)] 
    private static extern long GetWindowLong(IntPtr hwnd, int nIndex); 

    [DllImport("user32.dll")] 
    static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); 

    [DllImport("user32.dll", SetLastError = true)] 
    private static extern long SetWindowPos(IntPtr hwnd, long hWndInsertAfter, long x, long y, long cx, long cy, long wFlags); 

    [DllImport("user32.dll", SetLastError = true)] 
    private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint); 

    [DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)] 
    private static extern bool PostMessage(IntPtr hwnd, uint Msg, int wParam, int lParam); 

    private const int SWP_NOOWNERZORDER = 0x200; 
    private const int SWP_NOREDRAW = 0x8; 
    private const int SWP_NOZORDER = 0x4; 
    private const int SWP_SHOWWINDOW = 0x0040; 
    private const int WS_EX_MDICHILD = 0x40; 
    private const int SWP_FRAMECHANGED = 0x20; 
    private const int SWP_NOACTIVATE = 0x10; 
    private const int SWP_ASYNCWINDOWPOS = 0x4000; 
    private const int SWP_NOMOVE = 0x2; 
    private const int SWP_NOSIZE = 0x1; 
    private const int GWL_STYLE = (-16); 
    private const int WS_VISIBLE = 0x10000000; 
    private const int WM_CLOSE = 0x10; 
    private const int WS_CHILD = 0x40000000; 
    private const int WS_MAXIMIZE = 0x01000000; 
    #endregion 

    #region Variables 
    private IntPtr hostedProcessHandle; 
    private Process hostedProcess = null; 
    private ProcessStartInfo hostedPSI = new ProcessStartInfo(); 
    #endregion 

    //Helper method to start a process contained within the form 
    private void HostProcess(string processPath) 
    { 
     //Start the process located at processPath 
     hostedPSI.FileName = processPath; 
     hostedPSI.Arguments = ""; 
     hostedPSI.WindowStyle = ProcessWindowStyle.Maximized; 
     hostedProcess = System.Diagnostics.Process.Start(hostedPSI); 

     //Stop watch is used to calculate time out period. 
     Stopwatch sw = new Stopwatch(); 
     sw.Start(); 
     //Loop to aquire application handle. Exit loop if the time out period is past. 
     do 
     { 
      hostedProcessHandle = hostedProcess.MainWindowHandle; 
      if (sw.ElapsedMilliseconds > 10000) throw new TimeoutException(); 
     } while (hostedProcessHandle == new IntPtr(0)); 

     //Host the process in the forms panel. 
     SetParent(hostedProcessHandle, this.panel1.Handle); 
     SetWindowLong(hostedProcessHandle, GWL_STYLE, WS_VISIBLE + WS_MAXIMIZE); 
     MoveWindow(hostedProcessHandle, 10, 10, this.panel1.Width - 20, this.panel1.Height - 20, true); 

    } 

    private void CloseHostedProcess() 
    { 
     hostedProcess.Kill(); 
    } 

Вот снимок экрана моего тестового приложения хостинг VLC, Некоторые из меню и кнопок, как вы можете видеть неактивны и не работает:

Это проблема не только с VLC - Я вижу этот вопрос при размещении других приложений тоже.

Просто обновление. Если я щелкнул правой кнопкой мыши по VLC -> Play -> Добавить и воспроизвести видео вручную, панель меню снова работает. Однако элементы управления видео внизу внизу все еще не работают! Они меняют цвет при перекатывании, но щелчок по ним все равно не работает!

ответ

0

Причина, по которой я столкнулся с проблемами, заключается в том, что TeamViewer работал в фоновом режиме. В настоящее время я пытаюсь выяснить, почему это вызывает у меня проблемы, но прекращение процесса TeamViewer, похоже, исправляет мою проблему.

Смежные вопросы