Как сделать окно другого приложения прозрачным? - PullRequest
3 голосов
/ 20 февраля 2010

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

SetWindowLongPtr(WindowFromPoint(p), GWL_EXSTYLE, 
                 GetWindowLongPtr(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
SetLayeredWindowAttributes(WindowFromPoint(p), 0, (255 * 50) / 100, LWA_ALPHA);

где p - точка на экране (например, окно, которое я выбираю с помощью мыши)

Мне также интересно, есть ли способ сделать это непосредственно из Windows 7 (не обязательно программно). Я полагаю, что должен быть способ сделать это, так как каждое приложение визуализируется на своей собственной поверхности, и DWM объединяет их в окончательное изображение.

1 Ответ

2 голосов
/ 20 февраля 2010

Вы используете другой дескриптор окна для SetWindowLongPtr, чем тот, который вы используете для GetWindowLongPtr Это ошибка в вашем коде или просто опечатка в вашем вопросе?

Следующий код работает для меня на Windows Server 2003 и Windows 7

   POINT ptScreen = pt;
   ClientToScreen(pwnd->hdr.hwnd, &ptScreen);
   HWND hctl = WindowFromPoint(ptScreen);
   if (IsWindow(hctl))
      {
      LONG lExStyle = GetWindowLong(hctl, GWL_EXSTYLE);
      lExStyle ^= WS_EX_LAYERED;
      SetWindowLong(hctl, GWL_EXSTYLE, lExStyle);
      SetLayeredWindowAttributes(hctl, 0, 
          (lExStyle & WS_EX_LAYERED) ? (255 * 50) / 100 : 255, 
          LWA_ALPHA);
      }
   }

Однако это работает только в том случае, если WindowFromPoint возвращает окно верхнего уровня для приложения, если оно возвращает дочернее окно, тогда код не работает. Так что это работает, когда мышь находится над заголовком окна, которое я хочу сделать прозрачным, но обычно нигде больше. (проверено с помощью блокнота)

...