Дочерний процесс C # из устаревших проблем оконного приложения C ++ - PullRequest
0 голосов
/ 17 декабря 2009

У нас есть унаследованное приложение c ++, и мы расширяем его апплетами c #, которые вызываются с помощью COM из родительского приложения c ++. Они поднимают окна, которые не являются модальными. Более того, я думаю, что эти .NET-окна не являются правильными потомками приложения c ++, поскольку EnumChildWindows пропускает их, а EnumWindows их находит. Однако остается одно поведение, похожее на поведение ребенка: если вы закроете родительское приложение c ++, окно c # также закроется.

Моя основная проблема во всем этом заключается в том, что если пользователь вызывает один из этих апплетов c #, а затем непреднамеренно щелкает окно родительского приложения (c ++), окно c # переходит в фоновый режим. Если пользователь хочет вернуться к началу, он должен просто щелкнуть его значок на панели задач. К сожалению, по какой-то странной причине часто приходится щелкать значок панели задач три раза ! Первый раз должен привести скрытое окно к вершине, но это не так. Второй щелчок минимизирует скрытое окно, а третий успешно восстанавливает его.

Кто-нибудь еще сталкивался с этой ошибкой / функцией при преодолении устаревшего -> .NET разделить? Мне интересно, смогу ли я перехватить первый щелчок на значке панели задач для моего апплета C # и каким-то образом заставить его вернуться обратно к вершине. :-)

Я экспериментировал со следующим:

  [DllImport("User32.dll")]
  private static extern int ShowWindow(IntPtr hwnd, IntPtr nCmdShow);

но даже если я получу эту работу, мне все равно придется перехватить первый щелчок мышью. Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 17 декабря 2009

Будет ли это работать, если бы окна C # действительно были дочерними? Этого можно достичь, передав родительский HWND в качестве аргумента объекту C # COM, а затем используя PInvoke для вызова SetParent в окнах C #. (Я никогда не делал этого, но это звучит так же безопасно, как сражаться с ShowWindow и панелью задач?)

(Обратите внимание на комментарии в документации для SetParent, что вам также может понадобиться поиграться с флагами окна дочернего окна?)

(В зависимости от типа окна C # у него уже может быть свойство Handle, которое вы можете использовать; в противном случае вы можете вызвать вызов PInvoke для FindWindow, чтобы получить его дескриптор.)

0 голосов
/ 21 декабря 2009
 // Here's the code... 
 [DllImport("User32.dll")]
  static extern int GetForegroundWindow();
  [DllImport("User32.dll")]
  private static extern int SetParent(int hwndChild, int hwndParent);


  public void ShowMyFormAsChildOf ( int hwndParent )
  {
    MyForm form = new MyForm();
    form.Show(); // immediately after .Show(), it is the foreground window!
    SetWindowParent( hwndParent );
  }

  private void SetWindowParent(int parenthwnd)
  {
     if (0 != parenthwnd)
     {
        int handle = GetForegroundWindow();
        SetParent(handle, parenthwnd);
     }
  }
...