DLL中创建窗口,实现窗口消息处理

HeartHeart 2007-07-19 03:27:29
问题描述:我创建了一DLL工程,需要在DLL中创建一个窗口,然后实现其窗口消息处理。用InitMsgWindow注册窗口类、创建窗口,经过调试,创建窗口成功(g_wndMsg不为空,GetLastError返回0)。在窗口消息处理函数MyWinProc中需要对自定义消息SCS_MSG_DVBDATA等做处理。在DLL导出函数中模拟了一个函数MyFun,不断向窗口发送自定义消息和WM_TIMER消息。可是问题出来了,为何在调试过程中MyWinProc函数不响应呢?或者说窗口捕获不到任何消息了。请高手指教!急!!

HWND g_wndMsg;//用于保存消息窗口的句柄
BOOL InitMsgWindow()
{
//注册消息处理窗口类
WNDCLASS wc;
wc.style = CS_NOCLOSE|CS_HREDRAW | CS_VREDRAW; //窗口类型
wc.lpfnWndProc = (WNDPROC)MyWinProc; //消息处理的回调函数
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = AfxGetApp()->m_hInstance;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground = (HBRUSH )GetStockObject(BLACK_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "MsgWindow";
if (!::RegisterClass(&wc))
return FALSE;
//创建消息处理窗口
g_wndMsg = ::CreateWindow("MsgWindow","",WS_OVERLAPPEDWINDOW,0,0,50,50,NULL,NULL,AfxGetApp()->m_hInstance,NULL);
long err = ::GetLastError();
if(!g_wndMsg)
return FALSE;
}

//窗口消息处理函数
LRESULT CALLBACK MyWinProc( HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam )
{
switch(message) {
case SCS_MSG_DVBDATA:
{
break;
}
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}
}

//DLL导出函数:
void MyFun()
{
for(int i=0;i<100;i++){
PostMessage(g_wndMsg,SCS_MSG_DVBDATA,NULL,NULL);
PostMessage(g_wndMsg,WM_TIMER,NULL,NULL);
}
}
...全文
1676 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
nicolashwh 2010-12-01
  • 打赏
  • 举报
回复
PreTranslateMessage
罗嘉贇 2009-10-28
  • 打赏
  • 举报
回复
你所要注意的是 窗口类 和 CreateWindow 里面的 实例参数m_hInstance 这个参数要写DLL 的值,而不是 exe。
罗嘉贇 2009-10-28
  • 打赏
  • 举报
回复
你所要注意的是 窗口类 和 CreateWindow 里面的 实例参数m_hInstance 这个参数要写DLL 的值,而不是 exe。
yuchengtong 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fzergling 的回复:]
在你的DLL Attach的时候创建一个线程,里面加个消息循环
DllMain(){
case Attach:
createthread(...,proc,...)
break;
}

DWORD Proc(LPVOID pParam)
{
...
CreateWindow();

while(getMessage())
{
...//处理消息
}
...
}
[/Quote]正解
Fzergling 2009-10-27
  • 打赏
  • 举报
回复
在你的DLL Attach的时候创建一个线程,里面加个消息循环
DllMain(){
case Attach:
createthread(...,proc,...)
break;
}

DWORD Proc(LPVOID pParam)
{
...
CreateWindow();

while(getMessage())
{
...//处理消息
}
...
}
-小仙- 2009-10-26
  • 打赏
  • 举报
回复
good
、make
TADICAN 2009-10-26
  • 打赏
  • 举报
回复
上面的代码有问题,把hwnd换成你的wndMsg
TADICAN 2009-10-26
  • 打赏
  • 举报
回复


ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);

MSG msg;
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}

加到 if(!g_wndMsg)
return FALSE;
后面看看
wltg2001 2009-10-25
  • 打赏
  • 举报
回复
没有消息循环,如何获取消息啊?
BIGDOG 2009-10-25
  • 打赏
  • 举报
回复 1
我也遇到同样的问题 请问是如何解决的啊? 谢谢
Cat_Of_9Life 2007-07-19
  • 打赏
  • 举报
回复
pass
龙凤呈祥焱 2007-07-19
  • 打赏
  • 举报
回复
回复在你另一个贴子里。
建议你先看一下《windows程序设计》特别要搞清楚消息机制这一部分。非常重要。
HeartHeart 2007-07-19
  • 打赏
  • 举报
回复
我是新手,请多指教。
龙凤呈祥焱 2007-07-19
  • 打赏
  • 举报
回复
先寒一个。
MyWinProc是消息处理函数。
消息循环是
while ( GetMessage(0, 0, 0, &msg) ) {
DispatchMessage(&msg);
}
这样的东东。必须在创建了窗口后就开始消息循环。
HeartHeart 2007-07-19
  • 打赏
  • 举报
回复
up,就在MyWinProc里啊。不对嘛?
龙凤呈祥焱 2007-07-19
  • 打赏
  • 举报
回复
消息循环在哪儿?

15,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧