怎样在线程中显示一个窗口,然后再关闭它,要求在窗口显示期间,主线程不能处理任何消息。就像模态窗口一样?

wyj 2000-03-18 06:12:00
...全文
252 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzw 2000-03-19
  • 打赏
  • 举报
回复
我想不能处理任何消息并不是你的本意吧?起码重画消息应该处理吧!:-)
此处你不想处理的消息我猜想应该是来自用户的输入,有一个办法,就是在线程要
弹出窗口时,把主窗口上的各种可能接收输入的窗口给Disable掉.这样就可以起到
你要的效果了.
我也碰到过你这样的问题,可能需求不一样,我是在线程中弹出错误信息,此时主线程
不能再有任何操作,唯有DISABLE了.
不知猜测你的用意是否正确,见笑了.
Lin 2000-03-19
  • 打赏
  • 举报
回复
To wyj:
这好象不是使用多线程的目的? 如果非要这样, 很有可能连你的弹出窗口也响应不了任何消息, 除非弹出窗口有自己的消息循环.
wyj 2000-03-18
  • 打赏
  • 举报
回复
有道理,多谢.这麽说是没有办法了?如果真的没有办法的话,那就在主线程中实现吧,可是又应该怎样做呢?
lu0 2000-03-18
  • 打赏
  • 举报
回复
线程驱动是在KERNEL MODE实现的.也就是说用户线程不能阻止切换线程.
所以如果不自己加LOCK.就不能阻止主线程获得信息.
见MSDN的线程同步章节.包括挂起主线程.
torent 2000-03-18
  • 打赏
  • 举报
回复
好像没这么简单!
你是否将每一行代码都加上synchronize呢?
gypb 2000-03-18
  • 打赏
  • 举报
回复
用synchronize不就得了
VC获得进程ID获得线程ID获得窗口句柄获得窗口获得进程名 1.窗口类名 窗口句柄 窗口标题 窗口句柄 HWND FindWindow( LPCTSTR lpClassName, //窗口类名 可用 VC或者VS自带的Spy++查看 LPCTSTR lpWindowName //窗口标题 ); 举例: 以 记事本为例, 记事本 窗口类名 为:NotePad, 窗口标题 视按具体情况而定,假设为"新建 文本文档.txt - 记事本" 窗口类名 窗口句柄 TCHAR lpClassName[]=TEXT("NotePad"); HWND hWnd=::FindWindow(lpClassName,NULL); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 窗口标题 窗口句柄 TCHAR lpWindowName[]=TEXT("新建 文本文档.txt - 记事本"); HWND hWnd=::FindWindow(NULL,lpWindowName); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 2.窗口句柄 进程ID 窗口句柄 线程ID 要使用到的函数: DWORD GetWindowThreadProcessId( HWND hWnd, //目标窗口句柄 LPDWORD lpdwProcessId //返回目标窗口对应进程ID ); 例子: DWORD dwProcId=0;//存放返回的进程ID DWORD dwThreadId=0;//存放返回的线程ID HWND hWnd=XXXX;//这里省略,可能用任务方式得到一个窗口的句柄.比如用1的方法. dwThreadId=GetWindowThreadProcessId(hWnd,&dwProcId);//同时得到进程ID和线程ID. 3.窗口HAND CWnd 用CWnd::FromHandle(HWND hWnd)函数.很多类都有这个函数. 4.进程名 进程ID (注:进程名,即在"任务管理器"看到的名字) 用CCheckObject类(详细实现源文件); 例子: 以记事本为例,进程名为 NOTEPAD.EXE (不一定是大写哦,得到任务管理器是显示而定); CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwProcId=ch.GetProcessId(Name); 5. 进程名 线程ID 例子: CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwThreadId=ch.GetThreadId(Name); 6. 进程名 窗口句柄 CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); HWND hWnd=ch.GetTargetWindowHanle(Name); 7. 其它说明 从CCheckObject类和上面的源码,不难写出从 进程ID 线程ID 进程ID 窗口句柄 线程ID--->窗口句柄 等等其它类似转换. 对于窗口,特点如下: A. 不能用进程ID,要用线程ID,因为一个进程可能有多个线程,每个线程都可能会有窗口. B. 窗口不会有WS_CHILD属性 C. 窗口没有父窗口 D. 窗口一般都有子窗口(这个不是一定的,但是具有普遍性)

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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