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

在dll中我创建了两个接口函数,一个是画图,另一个是在图上画点。因为图比较大,我在图上画点时需要获得窗口滚动条位置,怎样获得主应用程序的窗口句柄呢?还有,画图和画点的CDC* pDC怎样获得呢?

第1个回答  2010-10-24
用FindWindow API函数,或者你在调用画点函数时传一个窗口句柄也可以。
第2个回答  2010-11-02
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个回答  2010-10-27
HWND hWnd; // 消息发送窗口

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

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

窗口 调用 动态库的SetHwnd 函数,将窗口句柄传给动态库, pDC 获得的方式也可以这样本回答被网友采纳

在dll中怎样获得主应用程序句柄
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);...

怎么根据DLL的HMODULE获取宿主应用程序的窗口句柄
应该可以用:HWND GetForegroundWindow(void);MSDN里的解释:GetForegroundWindow This function returns the handle to the foreground window—the window with which the user is currently working.HWND GetForegroundWindow(void);Return Values The handle to the foreground window indicates success.百度...

在DLL中如何获得主程序里的各种消息
GetParent(),获得主句柄,就可以操作程序了 或者在dll导出一个消息处理函数。。主程序在收到消息时转发调用这个函数就可以了

E语言如何取程序句柄?
Dll命令:获得程序句柄 ※ 获取一个应用程序或动态链接库的模块句柄 返回值类型:整数型 Dll库文件名:kernel32.dll 在Dll库中的命令名:GetModuleHandleA 参数:模块名 数据类型:整数型 ※ 指定模块名,这通常是与模块的文件名相同的一个名字。例如,NOTEPAD.EXE程序的模块文件名就叫作NOTEPAD。只有在当...

dll怎样调用主程序的函数
第一种方法:将主程序的窗口句柄传递到DLL中去,通过发送自定义消息传递参数 第二种方法:主程序启动一个线程去主动获得DLL中的数据。第三种方法:创建回调函数,通过该回调函数传递参数。

易语言 DLL注入后如何获得DLL所在的窗口句柄和线程ID
句柄 = 窗口.取窗口句柄 ()ID = 取窗口进程ID (窗口.取窗口句柄 ())

C# 根据进程ID获取进程主窗口句柄
\/\/\/ 获得拥有输入焦点的窗口的句柄 \/\/\/ \/\/\/ <returns>拥有焦点的那个窗口的句柄。如没有窗口拥有输入焦点,则返回零<\/returns> [DllImport("user32.DLL", EntryPoint="GetFocus",SetLastError=true,CharSet=CharSet.Unicode, ExactSpelling=true,CallingConvention=CallingConvention.StdCall)]public static...

...Function LoadLibrary来载入动态链接库并获取句柄?
当成功加载后,程序就可以访问库中储存的资源了。函数的返回值是一个Long型,如果加载成功,它会返回对应DLL模块的句柄;若失败,返回零,此时可以检查GetLastError来获取错误信息。参数部分如下:lpLibFileName: 类型为String,你需要提供要载入的DLL文件的名称。这个名称的查找顺序与CreateProcess函数中设置的...

系统中的DLL文件怎么用?
程序可根据DLL文件中的指令打开、启用、查询、禁用和关闭驱动程序。打开一个程序的安装目录,在这里面可以看到一些dll的一些文件。如果在它的上面双击的话会在它的旁边提示:如果是想要查看它可以下载安装一个叫exescope的自定义应用软件的工具。右边有一个更多,点击一下“更多”,可以看到它的默认安装路径...

易语言中句柄取句柄是什么
取自己程序里的句柄的话可以使用组件名.取窗口句柄()如果要取外部的句柄的话可以使用API函数:WindowFromPoint返回值:整数型包含在user32.dll里两个参数:xPoint 整数型yPoint 整数型 然后注册一个热键,命令写:窗口句柄=WindowFromPoint(取鼠标水平位置(),取鼠标垂直位置()) 可以取出鼠标处一个...

相似回答