मैं एक विंडो को आकार बदलने से रोकने के लिए एक डीएल लिखने की कोशिश कर रहा हूं, लेकिन मैं समझ नहीं पा रहा हूं कि इस मामले में एलपरम को सही तरीके से कैसे निर्दिष्ट किया जाए।

docs< से /ए>:

HCBT_MOVESIZE: एक RECT संरचना के लिए एक लंबा पॉइंटर निर्दिष्ट करता है जिसमें विंडो के निर्देशांक होते हैं। संरचना में मूल्यों को बदलकर, एक सीबीटीपीआरसी हुक प्रक्रिया विंडो के अंतिम निर्देशांक सेट कर सकती है।

वर्तमान कोड:

#include "pch.h"
#include <Windows.h>

extern "C" __declspec(dllexport) LRESULT CALLBACK CBTProc(
    _In_ int    nCode,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam
)
{
    if (nCode < 0) return CallNextHookEx(nullptr, nCode, wParam, lParam);
    
    switch(nCode)
    {
    case HCBT_MOVESIZE: // A window is about to be moved or sized.

        /*
            For operations corresponding to the following CBT hook codes, the return value must be 0 to allow the operation, or 1 to prevent it.
            HCBT_ACTIVATE
            HCBT_CREATEWND
            HCBT_DESTROYWND
            HCBT_MINMAX
            HCBT_MOVESIZE
            HCBT_SETFOCUS
            HCBT_SYSCOMMAND
        */

        /*
        switch(LOWORD(lParam)) //
        {
        case EVENT_SYSTEM_MOVESIZESTART:
            return 1; // Prevent
        }
        */
    }
    return 0;
}
1
user14761342 3 सितंबर 2021, 08:14

2 जवाब

सबसे बढ़िया उत्तर

HCBT_MOVESIZE के मामले में, lParam में RECT का मेमोरी एड्रेस होता है, इसलिए बस lParam को RECT* पॉइंटर पर टाइप करें, जैसे:

extern "C" __declspec(dllexport) LRESULT CALLBACK CBTProc(
    _In_ int    nCode,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam
)
{
    if (nCode < 0) return CallNextHookEx(nullptr, nCode, wParam, lParam);
    
    switch(nCode)
    {
        case HCBT_MOVESIZE: // A window is about to be moved or sized.
        {
            HWND hwnd = reinterpret_cast<HWND>(wParam);
            RECT *rc = reinterpret_cast<RECT*>(lParam);

            // use hwnd and *rc as needed...

            if (should not resize)
                return 1;

            break;
        }

        ...
    }

    return 0;
}
1
Remy Lebeau 3 सितंबर 2021, 18:24

LPARAM एक सूचक के आकार का मान है। यह किसी भी मान को धारण कर सकता है जो एक सूचक में फिट बैठता है। मूल्य का अर्थ आमतौर पर संदर्भ पर निर्भर करता है।

HCBT_MOVESIZE कॉलबैक यह निर्दिष्ट करता है

RECT के लिए एक लंबा सूचक संरचना

इसका उपयोग करने के लिए, क्लाइंट कोड को मान को संबंधित प्रकार के मान में बदलने की आवश्यकता होती है। सी ++ में यह एक कास्ट का उपयोग करके किया जाता है, उदा।

switch(nCode)
{
case HCBT_MOVESIZE: {
    auto pRect{ reinterpret_cast<RECT*>(lParam) };
    // Use `pRect` to read from or write to the rectangle
}
    break;

// ...
}
0
IInspectable 3 सितंबर 2021, 07:09