WIn32 SwitchToThisWindow, ShowWindow и SetActiveWindow - PullRequest
1 голос
/ 23 февраля 2010

У меня есть приложение VB 6 MDI. Он отвечает на устаревшую функцию SwitchToThisWindow, но не на функции ShowWindow и SetActiveWindow. Я знаю, что ShowWindow и SetActiveWindow объявлены правильно, потому что я могу использовать их с любым другим приложением.

РЕДАКТИРОВАТЬ: Моя цель не состоит в том, чтобы использовать эти функции, просто переключить фокус с моего приложения на приложение VB 6. Так что, если у вас есть альтернативные методы, я весь в ушах.

Ответы [ 4 ]

1 голос
/ 23 февраля 2010

После активации родителя вам нужно будет отправить WM_MDIACTIVATE сообщение , чтобы активировать конкретное дочернее окно MDI. Захватить ручку дочернего окна MDI должно быть непросто.

1 голос
/ 24 февраля 2010

Вы можете определить, свернуто ли окно, используя IsIconic(hWnd), а затем отправить ShowWindow(hWnd, SW_RESTORE), чтобы восстановить свернутое окно.Наконец, используйте SetForegroundWindow(hWnd), чтобы вывести окно вперед.

Вот несколько превосходных VB6 от Карла Петерсона, которые сделают все для вас.

1 голос
/ 23 февраля 2010

SetActiveWindow будет работать только с окнами, которые прикреплены к текущему потоку, поэтому вы не можете использовать его для активации другого приложения.

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

0 голосов
/ 26 февраля 2010

Вы можете использовать часть кода из моего ответа здесь: Правильный способ (в .NET) переключить фокус на другое приложение , просто измените объявление активного окна на установленную функцию окна переднего плана, Вы также можете попробовать использовать различные перечисления для функции ShowWindow.

Visual Basic 6 определение

 Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Long) As Long 

Visual Basic .NET определение

 Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Integer) As Integer 

C # определение

[DllImport("user32.dll")] public static extern int SetForegroundWindow(int hwnd)  

Если ваша цель не состоит в том, чтобы использовать импорт user32.dll, то вы в значительной степени облажались, потому что, поскольку ваше приложение не имеет доступа к целевому приложению, чтобы сфокусировать его, вам нужно будет использовать windows.

АЛЬТЕРНАТИВНО вы можете использовать какую-то систему межпроцессного взаимодействия (ключевые слова: .net remoting) и кодировать фрагмент фокуса в целевом приложении, а затем из вашего приложения просто отправить сообщение фокуса вашему второе приложение

...