我試圖撰寫一個 dll 來攔截一個視窗的大小,但我不明白在這種情況下如何正確地指定 lParam。
從docs:
HCBT_MOVESIZE:指定一個長指標,指向一個包含視窗坐標的RECT結構。 視窗的坐標。通過改變該結構中的值 結構中的值,CBTProc鉤子程序可以設定視窗的最終坐標。
當前代碼:
#include "pch.h"/span>
#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: // 一個視窗即將被移動或調整大小。
/*
對于對應于以下CBT鉤碼的操作,回傳值必須是0,以允許該操作,或1,以阻止該操作。
HCBT_ACTIVATE
HCBT_CREATEWND
HCBT_DESTROWND
HCBT_MINMAX
HCBT_MOVESIZE
HCBT_SETFOCUS
hcbt_syscommand
*/
/*
switch(LOWORD(lParam)) //
{
case EVENT_SYSTEM_MOVESIZESTART:
return 1; // Prevent
}
*/
}
return 0;
}
uj5u.com熱心網友回復:
在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: // 一個視窗即將被移動或調整大小。
{
HWND hwnd = reinterpret_cast<HWND>(wParam)。
RECT *rc = reinterpret_cast<RECT*>(lParam)。
//根據需要使用hwnd和*rc...。
if (should not resize)
return 1;
break;
}
...
}
return 0;
}
uj5u.com熱心網友回復:
LPARAM是一個指標大小的值。它可以容納任何適合指標的值。該值的含義通常取決于背景關系。
當處理HCBT_MOVESIZE回呼時它指定
一個指向RECT結構的長指標。
為了使用它,客戶端代碼需要將該值轉換成相應型別的值。在C 中,這是用一個cast來完成的,例如
switch(nCode)
{
case HCBT_MOVESIZE: {
auto pRect{ reinterpret_cast<RECT*> (lParam) };
//使用`pRect`來讀取或寫入矩形。
}
break。
// ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/320302.html
標籤:
