एक खिड़की पारदर्शी सेट करें

Nov 24 2020

मैं ब्लूस्टैक्स खिड़की को पारदर्शी सेट करने की कोशिश कर रहा हूं :

DWORD MakeWindowTransparent(HWND hWnd, unsigned char factor)
{
    /* First, see if we can get the API call we need. If we've tried
     * once, we don't need to try again. */
    if (!initialized)
    {
        HMODULE hDLL = LoadLibrary(L"user32");

        pSetLayeredWindowAttributes =
            (PSLWA)GetProcAddress(hDLL, "SetLayeredWindowAttributes");

        initialized = TRUE;
    }

    if (pSetLayeredWindowAttributes == NULL)
        return FALSE;

    /* Windows need to be layered to be made transparent. This is done
     * by modifying the extended style bits to contain WS_EX_LAYARED. */
    SetLastError(0);

    auto winlong = SetWindowLong(hWnd,
    GWL_EXSTYLE,
    GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);

    if ((winlong == 0) && (GetLastError() != 0)) { 
        auto error = GetLastErrorAsString(); 
        return FALSE;
    } 

    if (!pSetLayeredWindowAttributes(hWnd,RGB(255, 255, 255),factor, LWA_COLORKEY | LWA_ALPHA))
    { 
        auto error = GetLastErrorAsString(); 
        return FALSE; 
    } 

    return TRUE;
}


int main() {
  HWND hWnd = FindWindowA(NULL, L"BlueStacks");
  MakeWindowTransparent(hWnd, 0);
}

BlueStacks में चला सकते हैं openglऔर directx, मैं, ऊपर कोड का परीक्षण किया है दोनों मोड का उपयोग कर।

MakeWindowTransparent 0 लौट रहा है

pSetLayeredWindowAttributes auto error = GetLastErrorAsString();से त्रुटि आई है: wrong parameter

मैंने अन्य OpenGL खिड़कियों के साथ कोड का परीक्षण किया है, और यह किसी भी त्रुटि में विराम नहीं देता है, खिड़की भी सही ढंग से पारदर्शी हो गई है।

कुछ जानकारी जो मैंने खिड़की के बारे में एकत्र की है:

किसी भी मदद की सराहना करें।

जवाब

1 VladFeinstein Nov 24 2020 at 06:18

आप दोनों झंडे का उपयोग क्यों कर रहे हैं LWA_COLORKEY | LWA_ALPHA? यदि आप रंग निर्दिष्ट कर रहे हैं RGB(255, 255, 255), तो उपयोग करें LWA_COLORKEY

इसके अलावा, आप क्यों गड़बड़ कर रहे हैं GetProcAddress? SetLayeredWindowAttributesविंडोज 2000 से शुरू होता है; क्या आप इससे पुराने प्लेटफ़ॉर्म को लक्षित कर रहे हैं?

मैं ब्लूस्टैक्स से परिचित नहीं हूं , लेकिन एक खिड़की को पारदर्शी बनाने के लिए सेटलैरेडविंडोएट्यूटेज केवल उस समय का काम कर रहा है जो सुझाव देता है कि SetLayeredWindowAttributesसाथ काम नहीं करता है Direct3D; क्या आप जानते हैं कि ब्लूस्टैक्स उपयोग करता है Direct3D?

OpenGLइसे देखने के लिए : पारदर्शी पृष्ठभूमि के साथ ओपनजीएल प्रतिपादन संदर्भ कैसे बनाएं?

अद्यतन मैं उस ब्लूस्टैक्स के साथ खेल रहा था , और लगा कि आप इसे फिर से दूसरी विंडो में भेज सकते हैं (यह अनुशंसित नहीं है, क्योंकि आपको कुछ किनारे मामलों को संभालने की आवश्यकता होगी)। वैसे भी, मैंने एक मौजूदा Notepadविंडो का उपयोग किया है और उस पर अल्फ़ा को सेट करने में सक्षम था, और इससे बच्चे ब्लूस्टैक्स विंडो प्रभावित हुई :

int main() {
  HWND hWnd = FindWindow(NULL, L"BlueStacks");
  HWND hWndN = FindWindow(NULL, L"Untitled - Notepad");
  ::SetParent(hWnd, hWndN);

  auto winlong1 = SetWindowLongPtr(hWnd, GWL_EXSTYLE, 0);
  auto winlong2 = SetWindowLongPtr(hWnd, GWL_STYLE, WS_CHILD | WS_VISIBLE);
  ::SetWindowPos(hWnd, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOZORDER | SWP_NOREDRAW | SWP_NOACTIVATE);

  MakeWindowTransparent(hWndN, 200);
}

मैंने छुटकारा पाने के लिए अपने फ़ंक्शन को भी साफ़ कर दिया है GetProcAddress:

DWORD MakeWindowTransparent(HWND hWnd, unsigned char factor)
{
  auto winlong = SetWindowLong(hWnd,
    GWL_EXSTYLE,
    GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);

  if ((winlong == 0) && (GetLastError() != 0)) {
    return FALSE;
  }

  if (!SetLayeredWindowAttributes(hWnd, 0, factor, LWA_ALPHA))
  {
    return FALSE;
  }

  return TRUE;
}