Управление другими окнами из приложения C # - PullRequest
3 голосов
/ 09 октября 2009

Я пишу приложение на C #, которое объединит контроль над несколькими приложениями (WMP, Google Earth и т. Д.). Для приложений, которые я не пишу сам, я запускаю как процесс, поэтому у меня есть их дескрипторы (handle = Process.Start ("C: \ what.exe"); это код, я считаю).

Чтобы он работал гладко, мне нужно иметь возможность контролировать свернутое / развернутое состояние каждого окна, включая те, которые я запустил с помощью Process.Start (). Я видел несколько методов, которые утверждают, что делают это, обычно требующие импорта user32.dll и применения ShowWindow (handle, state).

Я задаю два вопроса. Это лучший способ сделать это? Я новичок в программировании .NET / Windows (из * nix). Кроме того, я не смог заставить его работать, есть ли какие-то причуды, которые бы поймали новичка?

(К вашему сведению: VS 2008 в Windows 7 RTM)

Ответы [ 3 ]

2 голосов
/ 09 октября 2009

Получение дескриптора процесса, вероятно, неправильный дескриптор, если вы ищете дескриптор окна.

В те дни, когда я работал на VB6, я использовал библиотеки, которые позволяли вам находить окна по названию, затем оттуда вы могли передавать сообщения в min / max / close / activ и т. Д., Но я не делал ничего подобного с момента перехода на .Net хотя я уверен, что для .Net

существуют те же типы библиотек

Ответ на комментарий:
Да, я вижу, что есть свойство GetMainWindowHandle, так что это один шаг вниз. Далее вам нужно изучить сообщения Windows, здесь вы отправляете «сообщение» для выполнения различных действий Windows. У меня нет удобного кода обмена сообщениями, но он достаточно прост, если вы знаете коды для каждого сообщения.

1 голос
/ 10 октября 2009

Если вам нужен более естественный API для этого, вы можете сделать хуже, чем White. Он в основном предназначен для функционального тестирования (и основан на API-интерфейсах Windows Accessibility, упомянутых Джимом), но должен служить вашим целям. Посмотрите эту страницу о работе с windows . Вы, вероятно, напишите что-то вроде:

var application = Application.Attach(processID);
var window = application.GetWindow(windowName);
window.DisplayState = DisplayState.Minimized;
1 голос
/ 10 октября 2009

Вы также можете проверить API-интерфейсы Windows Accessibility . Они широко используются в Microsoft для автоматизации тестов пользовательского интерфейса.

...