Блюз для обновления слоев Windows в Windows XP

#c# #.net #.net-2.0

#c# #.net #.net-2.0

Вопрос:

У меня есть приложение NET 2.0 Winforms, частично основанное на этом коде. Он обеспечивает прозрачность формы с помощью UpdateLayeredWindow API. Он отлично работает в Vista и Windows 7, но не работает в Windows XP.

Я сузил поиск до UpdateLayeredWindow сбоя с последней ошибкой 8 (недостаточно памяти). Во время экспериментов я также обнаружил, что замена (желаемая) ULW_ALPHA на ULW_COLORKEY или ULW_OPAQUE работает в XP, но дает неправильный эффект (изображение отображается, но прозрачность неправильная).

Мне интересно, не так ли что-то в том, как растровое изображение PNG загружается и обрабатывается NET внутренне, и что в этом есть что-то, что UpdateLayeredWindow не нравится.

Ответ №1:

Похоже, что это работает, но многоуровневые окна на самом деле не видны, я предполагаю, что настройки непрозрачности неверны. С помощью кода, на который вы ссылались, изменение строки 67 в LayeredForm.cs с «BlendOp = 255» на «BlendOp = 0» устраняет проблему для меня (работает в Windows XP SP3).

Комментарии:

1. Удивительно просто! Спасибо, чувак! Слишком много часов было потрачено на это сегодня, а вы спасли положение. Блестяще.