收录日期:2019/11/19 16:31:21 时间: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;
}
这玩意理论上似乎不牢靠。
直接参考任务栏上有哪些窗口不就行了

跪求水晶报表师傅一位 。本人诚心找师傅 ! 初学水晶报表 公司需要 。希望有人可以教我 感谢! 想点击Html的Button控件后将左框架中的TextBox.text传到右框架中该按钮所响应的页面中,我要怎么做呢?请各位高手帮帮忙! 如何用汇编语言实现关机,是通过向某个寄存器中赋特定的值来实现关机吗? 关于查询距离最近的时间记录! datagridview添加空行的问题 请问rdlc报表怎么设置默认横向打印 reportviewer 2008 如何用css:不重复平铺背景图片!!!!!!!!!!!!!!!! 请问,JAVA如何解密MS CAPI CryptEncryptMessage生成的数字信封 请问各位高手,Delphi2007的一个窗体能添加多少控件?? 怎样在Sql server 查询分析器中写SQL去直接跟新Access中的数据?? linux mysql登陆出错 mysql升级方法 关于mysql和jdbc的弱弱的问题 怎么获得IIS的版本号啊 关于记录事件的问题? 2003 系统,双硬盘,有阵列的,C盘是系统盘,D\\E盘是数据,如何重新安装才不破坏D/E的盘的数据 各取相同字段頭兩個數据的問題 C++做数据查询,如何使用外部查询语句~!!! 如何分组显示数据?(比较复杂) 为什么好多人做网站都选择php,而不选择jsp呢??? 音乐播放器的主控程序 MSsqlserver与sybase数据迁移问题 急问!一句动态sql总是报错:缺失表达式 一个地址对应多个应用程序 无法找到页面 蛋贴 test ActiveX控件执行权限问题 逆迭代法(反幂法)求特征向量算法 窗体创建向导创建的窗体出现问题! 求大家帮忙!!!拜托了,(struts标签库taglib不好用) 请问,fastreport 3.27,数据报表,字段中记录中间包含空格和换行符,如何把空格和换行符都去掉后再打印在报表上呢?这样可以节省纸张。