我正在尝试为Windows 10制作一个临时的屏幕键盘,并且需要透明的背景,以使用户使用起来更加方便(按键已经是透明的)。但是,我不知道如何使背景透明。
任何帮助将不胜感激。
我相信我本质上是在下面的this thread中寻找代码的更新版本:
using System;
using System.Runtime.InteropServices;
using UnityEngine;
public class TransparentWindow : MonoBehaviour
{
[SerializeField]
private Material m_Material;
private struct MARGINS
{
public int cxLeftWidth;
public int cxRightWidth;
public int cyTopHeight;
public int cyBottomHeight;
}
[DllImport("user32.dll")]
private static extern IntPtr GetActiveWindow();
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);
[DllImport("user32.dll")]
static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll", EntryPoint = "SetLayeredWindowAttributes")]
static extern int SetLayeredWindowAttributes(IntPtr hwnd, int crKey, byte bAlpha, int dwFlags);
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
private static extern int SetWindowPos(IntPtr hwnd, int hwndInsertAfter, int x, int y, int cx, int cy, int uFlags);
[DllImport("Dwmapi.dll")]
private static extern uint DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS margins);
const int GWL_STYLE = -16;
const uint WS_POPUP = 0x80000000;
const uint WS_VISIBLE = 0x10000000;
const int HWND_TOPMOST = -1;
void Start()
{
// You really don't want to enable this in the editor, but it works there..
int fWidth = Screen.width;
int fHeight = Screen.height;
var margins = new MARGINS() { cxLeftWidth = -1 };
var hwnd = GetActiveWindow();
SetWindowLong(hwnd, GWL_STYLE, WS_POPUP | WS_VISIBLE);
// Transparent windows with click through
SetWindowLong(hwnd, -20, 524288 | 32);//GWL_EXSTYLE=-20; WS_EX_LAYERED=524288=&h80000, WS_EX_TRANSPARENT=32=0x00000020L
SetLayeredWindowAttributes(hwnd, 0, 255, 2);// Transparency=51=20%, LWA_ALPHA=2
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, fWidth, fHeight, 32 | 64); //SWP_FRAMECHANGED = 0x0020 (32); //SWP_SHOWWINDOW = 0x0040 (64)
DwmExtendFrameIntoClientArea(hwnd, ref margins);
}
void OnRenderImage(RenderTexture from, RenderTexture to)
{
Graphics.Blit(from, to, m_Material);
}
}
给出的代码无效,因此我认为它已经过时了。我不知道如何自己更新它,因为它有点超出我的技能范围。当我将代码上传到Unity时,它只是说代码中有错误,并且它不是有效的脚本。但是,当我打开脚本时,没有错误出现。
我希望能够对键盘后面的任何东西(例如桌面)有一个相对较好的视野,但实际上我只是看到一个黑色的平面。
更新: 显然,错误消息是由于我的脚本与班级名称不同而引起的。昨天我花了4个多小时来尝试修复该错误消息,而这个命名事件就是其中的原因:(。感谢Ruzihm。无论如何,现在错误消息消失了,当我运行或构建程序时,我的透明窗口材料就来了向上:深粉红色,然后我将Unity版本改回了2018.2.16f1,但没有成功,然后删除了#if!Unity Editor行,以使透明度在编辑器中可以完美地工作,但在我构建它时却没有。请注意,在构建和在编辑器中运行时,单击进入确实起作用。
答案 0 :(得分:0)
从评论中发现,当相机的清除标志设置为solid color
并将粉红色透明窗口材料替换为白色透明材料时,此问题已解决。