Каков наилучший способ захватить окно приложения в C #? - PullRequest
4 голосов
/ 12 ноября 2010

Я разработал простое приложение для создания оконных форм для захвата окон приложения видеочата (входящего, удаленного, и исходящего, локального).Для этого я использую неуправляемый код Windows API.Вот код захвата:

// Set Local Window
localHandle = FindWindow(null, "local");
// Backup parent window for local
prevLocalHandle = GetParent(localHandle);
SetParent(localHandle, this.pBoxLocal.Handle);
SetWindowLong(localHandle, GWL_STYLE, WS_VISIBLE + (WS_MAXIMIZE | WS_BORDER | WS_DISABLED));
MoveWindow(localHandle, 0, -TOP_BAR_HEIGHT, this.pBoxLocal.Width, this.pBoxLocal.Height + LOWER_BAR_HEIGHT, true);

// Set Remote Window
remoteHandle = FindWindow(null, "remote");
// Backup parent window for remote
prevRemoteHandle = GetParent(remoteHandle);
SetParent(remoteHandle, this.pBoxRemote.Handle);
SetWindowLong(remoteHandle, GWL_STYLE, WS_VISIBLE + (WS_MAXIMIZE | WS_BORDER | WS_DISABLED));
MoveWindow(remoteHandle, 0, -TOP_BAR_HEIGHT, this.pBoxRemote.Width, this.pBoxRemote.Height + LOWER_BAR_HEIGHT, true);

Вот код возврата:

// Return Windows
SetParent(localHandle, prevLocalHandle);
SetWindowLong(localHandle, GWL_STYLE, (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX));
MoveWindow(localHandle, 0, 0, NORMAL_WIDTH, NORMAL_HEIGHT, true);

SetParent(remoteHandle, prevRemoteHandle);
SetWindowLong(remoteHandle, GWL_STYLE, (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX));
MoveWindow(remoteHandle, 0, 0, NORMAL_WIDTH, NORMAL_HEIGHT, true);

Цель состоит в том, чтобы перейти от этого: alt text

К этому:

alt text

А потом снова!:)

В настоящее время у меня есть две проблемы с моим подходом:

  • прежде всего, когда я возвращаю окна в приложение видеочата, иногда черноеПрямоугольник слева в моем верхнем левом углу экрана.Он исчезает, когда я обновляю область.

  • секунда и, самое главное, бывают случаи, когда при захвате окна приложения я также фиксирую его панели инструментов (хотя измеренияпоставка только те, которые касаются области видео окна).

Есть ли лучший способ сделать это?Даже если это просто лучшие функции!Помните: я хочу получить окна приложения видеочата и впоследствии вернуть их.

Заранее благодарен за любые советы!

1 Ответ

0 голосов
/ 06 ноября 2012

Хорошо, первая проблема, которую вы заявили, легко исправить.Вы можете просто вызвать Refresh () при возврате окна.Однако, если вы имели в виду, что на вашем главном рабочем столе есть черный прямоугольник, а не окно, вы можете использовать http://msdn.microsoft.com/en-us/library/bb776346(VS.85).aspx, что позволит вам обновить весь рабочий стол.

Что касается второго вопроса, который выу вас уже есть проблемы с методом Window Long, почему бы просто не удалить все границы, я думаю, что может произойти, если у границы может быть «ThickFrame», который вы указываете в своих методах возврата, но не методы захвата, поэтому это может быть причинойвы получаете панели инструментов и границы.Вы можете проверить это, вызвав GetWindowLong, хранящий это значение и увидев, что там, таким образом, вы можете точно знать, что удалить.

Хотя я не уверен в том, для чего используется это приложение.Я считаю, что то, что вы делаете, может быть единственным способом сделать это, поскольку вы манипулируете внешними экранами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...