У меня есть форма, по которой я выполняю переходы, используя следующие вызовы функций:
SetWindowLong(Handle, GWL_EXSTYLE, (IntPtr)(GetWindowLong(Handle, GWL_EXSTYLE) ^ WS_EX_LAYERED ^ WS_EX_TRANSPARENT));
SetLayeredWindowAttributes(Handle, 0, 0xFF, LWA_ALPHA);
Это работает нормально, однако, когда я пытаюсь скрыть это окно с помощью свойства System.Windows.Forms.Form.Opacity, я получаю следующее исключение:
System.ComponentModel.Win32Exception (0x80004005): The parameter is not valid
at System.Windows.Forms.Form.UpdateLayered()
at System.Windows.Forms.Form.set_Opacity(Double value)
Как я могу достичь обоих целей одновременно?
@jdweng Установка третьего параметра на 0x7F, к сожалению, ничего не изменила.
Вы ищете что-то вроде это?
Код pinvoke сбивает с толку Winforms, он не знает, что вы создали многоуровневое окно. Вам просто это вообще не нужно, просто установки свойства Opacity достаточно, чтобы Winforms установил exstyle и сделал этот вызов SetLayeredWindowAttributes (). Если это попытка устранить мерцание, убедитесь, что для непрозрачности не установлено значение 1 (также известное как 100 в окне свойств), измените его значение между 0 и 0,99.





Следующие работы над формой окна
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication30
{
public partial class Form1 : Form
{
[DllImport("user32.dll", SetLastError = true)]
static extern System.UInt32 GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll", EntryPoint = "SetWindowLong")]
private static extern int SetWindowLong32(IntPtr hWnd, int nIndex, uint dwNewLong);
[DllImport("user32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
static extern int SetLayeredWindowAttributes(IntPtr hWnd, int crKey, byte bAlpha, uint dwFlags);
public const int GWL_EXSTYLE = -20;
public const uint WS_EX_LAYERED = 0x80000;
public const uint LWA_ALPHA = 0x2;
public const uint LWA_COLORKEY = 0x1;
public Form1()
{
InitializeComponent();
IntPtr Handle = this.Handle;
UInt32 windowLong = GetWindowLong(Handle, GWL_EXSTYLE);
SetWindowLong32(Handle, GWL_EXSTYLE, (uint)(windowLong ^ WS_EX_LAYERED));
SetLayeredWindowAttributes(Handle, 0, 128, LWA_ALPHA);
}
}
}
Похоже, третий параметр должен быть 0x80. См .: pinvoke.net/default.aspx/user32/SetLayeredWindowAttributes.h tml