Делаем фон прозрачным - PullRequest
1 голос
/ 03 июня 2019

enter image description here Я пытаюсь сделать самодельную экранную клавиатуру для Windows 10 и хочу, чтобы фон был прозрачным, чтобы сделать его более удобным для пользователя (клавиши уже прозрачны). Однако я понятия не имею, как сделать фон прозрачным.

Любая помощь будет принята с благодарностью.

Я полагаю, что я по сути ищу обновленную версию кода в этой теме , показанной ниже:

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. В любом случае, теперь, когда сообщение об ошибке исчезло, когда я запускаю или собираю программу, мой материал прозрачного окна просто приходит up: темно-розовый. Затем я изменил свою версию Unity на 2018.2.16f1, но безуспешно. Затем я удалил строку #if! Unity Editor, чтобы прозрачность отлично работала в редакторе, но не при его сборке. Обратите внимание, что переход по клику работает, когда я его собираю и когда запускаю в редакторе.

1 Ответ

0 голосов
/ 04 июня 2019

Как выяснилось в комментариях, проблема была исправлена, когда флажки очистки камеры были установлены на solid color, а розовый прозрачный материал окна был заменен на белый прозрачный материал.

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