收录日期:2020/02/20 23:19:06 时间:2016/07/26 19:55:55 标签:界面
例如,写一个函数
HWND getMainWin(DWORD idProcess,int &type)

输入参数是一个进程的id。功能:

1.返回这个进程的主窗口(如果有的话)HWND,没有窗口,就返回NULL.
2.type作为返回的参数。如果主窗口是一个对话框,那么type写入1,如果是普通窗口,返回2,是MDI,返回3

以上的需求能做到么,有哪点是做不到的? 如果能做到,大概需要怎么做?

谢谢,请讨论和指教。100分。
输入参数是一个进程的id。功能:

1.返回这个进程的主窗口(如果有的话)HWND,没有窗口,就返回NULL.
2.type作为返回的参数。如果主窗口是一个对话框,那么type写入1,如果是普通窗口,返回2,是MDI,返回
==============================
对一个进程来说,它可能有多个窗口,而且这个多个窗口之间的关系并不一定是父子关系,这样的话,你所说的主窗口就无从谈起了,因为可能有多个窗口都算是主窗口。
EnumWindows + GetWindowThreadProcessId + GetClassName
要找出主窗口,有点难
to 1L:
因为是这样,我觉得不论dialog,sdi,mdi,创建了一个最顶层的窗口以后,其他的窗口在创建的时候一般都要指定父窗口。

假设程序里面其他的窗口对象在创建的时候,都严格指定了顶层窗口作为父窗口。
那么枚举函数之类的调用,第一个返回的是否可以肯定是这个顶层窗口呢?

请继续指教。
引用 3 楼 daishu59 的回复:
to 1L:
因为是这样,我觉得不论dialog,sdi,mdi,创建了一个最顶层的窗口以后,其他的窗口在创建的时候一般都要指定父窗口。

假设程序里面其他的窗口对象在创建的时候,都严格指定了顶层窗口作为父窗口。
那么枚举函数之类的调用,第一个返回的是否可以肯定是这个顶层窗口呢?

请继续指教。
引用 3 楼 daishu59 的回复:
to 1L:
因为是这样,我觉得不论dialog,sdi,mdi,创建了一个最顶层的窗口以后,其他的窗口在创建的时候一般都要指定父窗口。

假设程序里面其他的窗口对象在创建的时候,都严格指定了顶层窗口作为父窗口。
那么枚举函数之类的调用,第一个返回的是否可以肯定是这个顶层窗口呢?

请继续指教。

你这里所说是是一种假设的情况,但是实际上,很多程序并不是这样的。
如果基于你这种假设,那么上面说的:
EnumWindows + GetWindowThreadProcessId + GetClassName
这三个API基本上能满足你的要求,但是枚举窗口时第一个窗口是不是一定就是顶层窗口,这个可能不一定,没试过,不太好说。
EnumWindow以及它的参数WNDENUMPROC,似乎都不接受ProcessID啊。
我的问题是,如何枚举另一个进程id所指向的,窗口。

可以做到么。
引用 6 楼 daishu59 的回复:
EnumWindow以及它的参数WNDENUMPROC,似乎都不接受ProcessID啊。
我的问题是,如何枚举另一个进程id所指向的,窗口。

可以做到么。


BOOL EnumWindows(          WNDENUMPROC lpEnumFunc,
    LPARAM lParam
);

BOOL CALLBACK EnumWindowsProc(          HWND hwnd,
    LPARAM lParam
);

EnumWindows(EnumWindowsProc,(lParam)idProcess);
引用 6 楼 daishu59 的回复:
EnumWindow以及它的参数WNDENUMPROC,似乎都不接受ProcessID啊。
我的问题是,如何枚举另一个进程id所指向的,窗口。

可以做到么。


// 根据ID找到窗口句柄
typedef struct _WNDINFO_
{
HWND hWnd;
DWORD dwProcessId;
}WNDINFO, *PWNDINFO;

BOOL CALLBACK EnumWindowProc(HWND hWnd, LPARAM lParam)
{
WNDINFO* pInfo = (WNDINFO*)lParam;
DWORD dwProcessId = 0;
GetWindowThreadProcessId(hWnd, &dwProcessId);
if(dwProcessId == pInfo->dwProcessId)
{
pInfo->hWnd = hWnd;
return FALSE;
}
return TRUE;
}

HWND GetProcessMainHwnd(DWORD dwProcessId)
{
WNDINFO info = {0};
info.dwProcessId = dwProcessId;
EnumWindows(EnumWindowProc, (LPARAM)&info);
return info.hWnd;
}
这玩意理论上似乎不牢靠。
直接参考任务栏上有哪些窗口不就行了

在delphi中怎样对在编译时把应用程序分成几个dll或pbl便于网上升级?? 回答好这个问题,给你100分不知你嫌不嫌少? 各位哥哥,用“MFC应用程序”向导生成代码时出错如下:处理模板时文件出错:C:\\Program Files\\...\\2052\\frame.h,谁知道怎么解决呀 请大家推荐几本关于组建局域网的书! 用getchar()会不停地读入ascii码为-1的东西,何故? 祝大家新春快乐,散分~~ 请问如何调用资源文件中的位图文件 那有C语言通信和网络编程书籍??? ******在MFC里自定义的消息是如何产生的?****** 求购录制卡拉ok的设备 编写一个程序从5个整数中找出最小的数。 那有C语言通信和网络编程书籍??? 该买那本书好 一简单问题,大家帮忙 JSP连ACCESS用不用当什么驱动? 测试:初学者对于JDK的设置和在DOS下怎么使用bin中程序编译运行的一些问题,欢迎回答。也算是个小小的总结。 招聘asp全职程序员(济南) JSP连ACCESS用不用当什么驱动? 请教各位:已装win2000的机子能否再装NT4.0? question 求助分区的问题!衷心的感谢(急) Datagrid属性设置的问题 Process Viewer的问题 如何给cd加标注? 做一个堂堂正正的人,被人暗杀了也一样光荣!----可以把您的马甲列出来吗? 菜鸟请教大虾,我承诺给高人的分,怎么给阿??? 大伙帮帮忙 这是什么类型呀!好像和时间片有关! 我写了一个java文件,遇到这样的编译错误: 初学C的迷茫!真心求教.献出仅有的100分散分