在dll中怎样获得主应用程序句柄

2025-03-06 21:54:03
推荐回答(3个)
回答1:

用FindWindow API函数,或者你在调用画点函数时传一个窗口句柄也可以。

回答2:

1.做DLL尽量不要用MFC,如果包含了MFC才能用CDC 类,所以建议使用HDC这是原始句柄,否则在DLL内用CDC这类会使DLL很大.传递句柄:pDC->m_hDC

2.窗口句柄用HWND,直接传入this->m_hWnd,没必要使用CWnd类

事实上不用传DC的,直接传HWND后,使用以下函数得到HDC即可:
HDC hDestDC = ::GetDC(HWND hWnd);//传入窗口句柄即可.
HDC hDC = ::CreateCompatibleDC(hDestDC);//这样做内存DC即可.
//这里绘图之类的相关............
::ReleaseDC(hDestDC);
::DeleteDC(hDC);

3.DLL建议做成类方便.
#define DLL_FUNCTION __declspec(dllexport)
class DLL_FUNCTION CDrawEx
{
public:
Draw(HWND hWnd);
//.....
};

//给个函数参考:
void CImgList::Draw(HDC hDC)
{
int nYpos = 4;
HBITMAP bmMonochrome = CreateCompatibleBitmap(hDC, 480,200);
RECT rtItem;
rtItem.left = 0;rtItem.top = 0;
rtItem.right = 480; rtItem.bottom = 200;

if(bmMonochrome){
HDC hMemDC = CreateCompatibleDC(hDC);
HBITMAP OldBitmap = (HBITMAP)SelectObject(hMemDC, bmMonochrome);
FillRect(hMemDC, &m_rtBmSize, (HBRUSH)GetStockObject(WHITE_BRUSH) );
SetBkMode(hMemDC, TRANSPARENT);
SetTextColor(hMemDC, RGB(0,0,0));
int m_nItem = 200;
for(int nCur = m_nItem ; nCur < m_nItem + MAX_ITEM; nCur++){
MoveToEx(hMemDC, 0, rtItem.top, NULL);
LineTo(hMemDC, 480, rtItem.top);
DrawText(hMemDC, m_szData[nCur], wcslen(m_szData[nCur]), &rtItem, DT_CENTER | DT_VCENTER);
OffsetRect(&rtItem, 0, ITEM_HEIGHT);
}
// printf("top:%d\n", m_nTop);
BitBlt(hDC,0, 0, m_rtClient.right, m_rtClient.bottom, hMemDC, 0, m_nOffset, SRCCOPY);

SelectObject(hMemDC, OldBitmap);
DeleteObject(bmMonochrome );
DeleteDC(hMemDC);
}
}

回答3:

HWND hWnd; // 消息发送窗口

class __declspec(dllexport) CXXXDLL
{
public:
CXXXDLL();
~CXXXDLL();
public:
void SetHwnd(HWND hWnd); //设置接收消息的窗口句柄
}

void CXXXDLL::SetHwnd(HWND handleWnd)
{
hWnd = handleWnd;
}

窗口 调用 动态库的SetHwnd 函数,将窗口句柄传给动态库, pDC 获得的方式也可以这样