请教一下DLL远程线程注入后的一个问题,困扰很多天了

4965257 2020-03-22 12:27:07
注入代码就不贴了,标准模板。
创建远程线程后加载自己的DLL成功返回,注入程序关闭。

接下来就是DLL中的代码,我并没有导出函数。

在DLL_PROCESS_ATTACH中创建了一个线程用于在寄宿程序中干自己的事。

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
DisableThreadLibraryCalls(hModule);
hThread = CreateThread(NULL, 0, ThreadFunc, 0, 0, &ThreadId);
break;
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}


线程中代码:
DWORD WINAPI ThreadFunc(LPVOID p)
{

hwnd = FindWindow(NULL, TEXT("Test"));

SetTimer(hwnd, 1, 1000, TimeProc);

TextBox = CreateWindow(TEXT("static"), NULL, WS_CHILD | WS_VISIBLE | SS_SUNKEN | SS_CENTER | SS_CENTERIMAGE, 114, 3, 80, 30, hwnd, (HMENU)1, hIns, NULL);

while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;


}


问题来了,这个static文本框控件在加入消息循环后能正常显示,我设置一个Timer让它显示时间也是正常。

但是我用鼠标点击了它之后程序就处于假死状态,任何操作都无效,但文本框的时间更新依然正常。

可我在创建static文本框控件的时候并没有赋予它响应点击的事件啊?

(WS_CHILD | WS_VISIBLE | SS_SUNKEN | SS_CENTER | SS_CENTERIMAGE)

只有切换到别的程序后切换回来程序才恢复到正常状态,我怀疑是消息循环出了问题,但一直找不到问题所在?
...全文
615 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2020-03-23
  • 打赏
  • 举报
回复
引用 10 楼 4965257 的回复:
[quote=引用 8 楼 zgl7903 的回复:] [quote=引用 6 楼 4965257 的回复:] [quote=引用 1 楼 zgl7903 的回复:] 把线程中的 while 消息循环屏蔽了看看, 估计是和App的消息泵冲突了
屏蔽了消息循环那创建的文本框控件不就没了[/quote] 有试过么? 确定么? [/quote] 试过呀,如果注释掉消息循环,直接return的话线程不就执行完了?创建的文本框一闪就没了。[/quote] CreateWindow 创建的窗口, 如果没有销毁它,怎么会一闪就没了?
许文君 2020-03-23
  • 打赏
  • 举报
回复
引用 10 楼 4965257 的回复:
[quote=引用 8 楼 zgl7903 的回复:] [quote=引用 6 楼 4965257 的回复:] [quote=引用 1 楼 zgl7903 的回复:] 把线程中的 while 消息循环屏蔽了看看, 估计是和App的消息泵冲突了
屏蔽了消息循环那创建的文本框控件不就没了[/quote] 有试过么? 确定么? [/quote] 试过呀,如果注释掉消息循环,直接return的话线程不就执行完了?创建的文本框一闪就没了。[/quote] 我觉得,你这其实就是一个问题,在远程线程下,因为不是ui线程,所以创建的控件没有消息循环,而如果弄个消息循环,和主线程的消息循环冲突了。所以这个控件放到主线程去创建试试, 你可以先试试settimer看看回调函数是否在主线程内运行。
4965257 2020-03-23
  • 打赏
  • 举报
回复
引用 8 楼 zgl7903 的回复:
[quote=引用 6 楼 4965257 的回复:] [quote=引用 1 楼 zgl7903 的回复:] 把线程中的 while 消息循环屏蔽了看看, 估计是和App的消息泵冲突了
屏蔽了消息循环那创建的文本框控件不就没了[/quote] 有试过么? 确定么? [/quote] 试过呀,如果注释掉消息循环,直接return的话线程不就执行完了?创建的文本框一闪就没了。
4965257 2020-03-23
  • 打赏
  • 举报
回复
引用 7 楼 许文君 的回复:
你是远程注入dll然后dll创建窗体吗?感觉怎么有点奇怪,窗体为啥不放到主线程里去创建非要单独起个线程,而且还要再起一个消息循环,他主窗体没有消息循环吗?
远程线程注入怎么进它的主线程? 主窗口是一个模态对话框,注入后创建static框显示时间。
zgl7903 2020-03-23
  • 打赏
  • 举报
回复
引用 6 楼 4965257 的回复:
[quote=引用 1 楼 zgl7903 的回复:] 把线程中的 while 消息循环屏蔽了看看, 估计是和App的消息泵冲突了
屏蔽了消息循环那创建的文本框控件不就没了[/quote] 有试过么? 确定么?
许文君 2020-03-23
  • 打赏
  • 举报
回复
你是远程注入dll然后dll创建窗体吗?感觉怎么有点奇怪,窗体为啥不放到主线程里去创建非要单独起个线程,而且还要再起一个消息循环,他主窗体没有消息循环吗?
4965257 2020-03-23
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
把线程中的 while 消息循环屏蔽了看看, 估计是和App的消息泵冲突了
屏蔽了消息循环那创建的文本框控件不就没了
4965257 2020-03-23
  • 打赏
  • 举报
回复
感谢大家的回复,对的,把CreateWindow放进主窗口消息中解决了我的困惑,所有创建的控件消息都正常了。而自己创建的线程中处理其他事情即可。
schlafenhamster 2020-03-23
  • 打赏
  • 举报
回复
用 CreateWindow() 无父窗口
schlafenhamster 2020-03-23
  • 打赏
  • 举报
回复
In a multithreaded application, any thread can call the CreateWindow() API to create a window. There are no restrictions on which thread(s) can create windows.

It is important to note that the message loop and window procedure for the window must be in the thread that created the window. If a different thread creates the window, the window won't get messages from DispatchMessage(), but will get messages from other sources. Therefore, the window will appear but won't show activation or repaint, cannot be moved, won't receive mouse messages, and so on.
gouyanfen 2020-03-23
  • 打赏
  • 举报
回复
因为他是注入的,创建的线程创建的窗口,这个问题需要把创建窗口代码放在主程序的消息线程中,就可以解决,不是dll注入创建新线程可以完美解决的。
zgl7903 2020-03-22
  • 打赏
  • 举报
回复
把线程中的 while 消息循环屏蔽了看看, 估计是和App的消息泵冲突了

4965257 2020-03-22
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster的回复:
父窗口 是 谁 ?
父窗口是一个模态窗口
schlafenhamster 2020-03-22
  • 打赏
  • 举报
回复
父窗口 是 谁 ?
4965257 2020-03-22
  • 打赏
  • 举报
回复
引用 2 楼 schlafenhamster的回复:
SS_NOTIFY ?
没有加这个风格,按理就不会有这个事件啊,为什么会假死?切换窗口才恢复
schlafenhamster 2020-03-22
  • 打赏
  • 举报
回复
SS_NOTIFY ?

15,472

社区成员

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

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