怎样怎么获得其他进程句柄某一进程窗口的句柄

查看: 1038|回复: 9
如何获取运行程序全屏窗口的句柄?
阅读权限20
注册会员, 积分 110, 距离下一级还需 40 积分
如何获取一个运行程序全屏窗口的句柄(如:PPT程序在全屏状态下)?如何代码操作让一个PPT程序的窗口全屏显示并能够向该全屏窗口发送消息?
由于要用到一点windows编程方向的知识,但又没有怎么学过windows编程,望大神能给出较详细的解答. 初入此站,积分不够,身价不足3驿站币,但真心求教.
百度一下你就知道
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限70
银牌会员, 积分 2634, 距离下一级还需 366 积分
又要白发了吗,是不是只要是在论坛里发一些太过于入门级的问题就不会有人理睬,哎。。。
2# 说的是一种方法,也可以使用 FindWindow 来查找目标窗口,都可以实现的
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
新手上路, 积分 20, 距离下一级还需 30 积分
GetActiveWindow( );
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限20
注册会员, 积分 110, 距离下一级还需 40 积分
又要白发了吗,是不是只要是在论坛里发一些太过于入门级的问题就不会有人理睬,哎。。。
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限20
注册会员, 积分 110, 距离下一级还需 40 积分
GetActiveWindow( );
谢谢,给我提供了切入点
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限20
注册会员, 积分 110, 距离下一级还需 40 积分
2# 说的是一种方法,也可以使用 FindWindow 来查找目标窗口,都可以实现的
全屏窗口如何通过FindWindow来找,无法知道全屏窗口的标题或者其它窗口信息来传给FindWindow,PPT全屏放映下的窗口和非全屏放映下的窗口应该不是同一个窗口吧?
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
新手上路, 积分 17, 距离下一级还需 33 积分
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限70
银牌会员, 积分 2634, 距离下一级还需 366 积分
全屏窗口如何通过FindWindow来找,无法知道全屏窗口的标题或者其它窗口信息来传给FindWindow,PPT全屏放 ...
事先使用 spy++ 看下就知道了,正因为不是一个窗口,所以类的名字什么的都不同,所以 sp++ 就能区分啦
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限20
注册会员, 积分 110, 距离下一级还需 40 积分
事先使用 spy++ 看下就知道了,正因为不是一个窗口,所以类的名字什么的都不同,所以 sp++ 就能区分啦
一开始主要是不知道当窗口全屏时如何调出spy++来查看全屏窗口的信息(任务栏被隐藏了不知道如何调出spy++)才提了这个问题,突然发现可以先通过快捷键调出任务管理器窗口来让底部任务栏显示出来,这时候就可以用spy++来查看全屏窗口信息了。之前一直用的就是FindWindow来获取句柄的,由于以为全屏状态下无法调出spy++来查看全屏窗口的信息便猜可能有什么专门的函数可以获取全屏窗口的句柄.&&智伤捉急啊!不管怎么说还是谢谢了!
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
新手上路, 积分 15, 距离下一级还需 35 积分
bool IsForegroundFullscreen ()
& & & & bool bFullscreen =//存放当前激活窗口是否是全屏的,true表示是,false表示不是
& & & & HWND hW
& & & & RECT rcA
& & & & RECT rcD
& & & & hWnd = GetForegroundWindow ();//获取当前正在与用户交互的当前激活窗口句柄
& & & & if ((hWnd != GetDesktopWindow ()) && (hWnd != GetShellWindow ()))//如果当前激活窗口不是桌面窗口,也不是控制台窗口
& & & & & & & & GetWindowRect (hWnd, &rcApp);//获取当前激活窗口的坐标
& & & & & & & & GetWindowRect (GetDesktopWindow(), &rcDesk);//根据桌面窗口句柄,获取整个屏幕的坐标
& & & & & & & & if (rcApp.left &= rcDesk.left && //如果当前激活窗口的坐标完全覆盖住桌面窗口,就表示当前激活窗口是全屏的
& & & & & & & & & & & & rcApp.top &= rcDesk.top &&
& & & & & & & & & & & & rcApp.right &= rcDesk.right &&
& & & & & & & & & & & & rcApp.bottom &= rcDesk.bottom)
& & & & & & & & {
& & & & & & & & & & & & TCHAR szTemp[100];
& & & & & & & & & & & & if (GetClassName (hWnd, szTemp, sizeof (szTemp)) & 0)//如果获取当前激活窗口的类名成功
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & if (strcmp(szTemp, &WorkerW&) != 0)//如果不是桌面窗口的类名,就认为当前激活窗口是全屏窗口
& & & & & & & & & & & & & & & & & & & & bFullscreen =
& & & & & & & & & & & & }
& & & & & & & & & & & & else bFullscreen =//如果获取失败,就认为当前激活窗口是全屏窗口
& & & & & & & & }
& & & & }//如果当前激活窗口是桌面窗口,或者是控制台窗口,就直接返回不是全屏
& & & & return bF
网上的判断全屏的方式。
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
Powered by Discuz! X3.413:43 提问
如何取出有效的窗口句柄
我的程序中用CreateProcess打开了一个第三方应用,我想给这个应用程序发消息(postmessage或sendmessage),但是取不到有效的窗口句柄,用findwindow有时能取到,有时又取不到,很着急啊,不知道怎么弄才好,关键这个进程ID下有很多窗口,如何判断哪个才是可以响应消息的窗口呢?
按赞数排序
findwindow按照窗口类找。
找不到可能是还没有加载出来,加上定时器或者死循环判断,等主窗口出来。
楼主这个问题解决了没,我也碰到同样的问题,但是我的问题更棘手,我通过进程ID获取到的句柄好像不是窗口正在的句柄,我要获取的第三方软件类名工具抓
取到每次都有变动,而且登录窗口还没标题,只能通过进程来获取ID,一直没有找到到我想要的窗口句柄。
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐文章-1213&
AfxGetMainWnd
AfxGetMainWnd获取自身窗口句柄
HWND hWnd = AfxGetMainWnd()-&m_hW
GetTopWindow
函数功能:该函数检查与特定父窗口相联的子窗口z序(Z序:垂直屏幕的方向,即叠放次序),并返回在z序顶部的子窗口的句柄。函数原型:HWND GetTopWindow(HWND hWnd);参数:  hWnd:被查序的父窗口的句柄。如果该参数为NULL,函数返回Z序顶部的窗口句柄。返回值:&&& 如果函数成功,返回值为在Z序顶部的子窗口句柄。如果指定的窗口无子窗口,返回值为NULL。
GetForegroundWindow函数功能:该函数返回当前系统的前台窗口的窗口句柄。函数原型:HWND GetForegroundWindow(VOID)  返回值:函数返回前台窗回的句柄。
GetActiveWindow
函数功能:该函数可以获得与调用该方法的线程的消息队列相关的活动窗口的窗口句柄(就是取得当前进程的活动窗口的窗口句柄)。
函数原型:HWND GetActiveWindow(VOID)
返回值:返回值是与调用线程的消息队列相关的活动窗口的句柄。否则,返回值为NULL。
GetSafeHwnd
函数功能:获取某个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数。通过下面的例子来看其理由:  CWnd *pwnd = FindWindow(&ExploreWClass&,NULL); //希望找到资源管理器
  HWND hwnd = pwnd-&m_ //得到它的HWND
  这样的代码当开始得到的pwnd为空的时候就会出现一个&General protection error&,并关闭应用程序,因为一般不能对一个NULL指针访问其成员,如果用下面的代码:
  CWnd *pwnd = FindWindow(&ExploreWClass&,NULL); //希望找到资源管理器
  HWND hwnd = pwnd-&GetSafeHwnd(); //得到它的HWND
  就不会出现问题,因为尽管当pwnd是NULL时,GetSafeHwnd仍然可以用,只是返回NULL
IsWindowVisible函数功能:该函数获得给定窗口的可视状态。
函数原型:BOOL IsWindowVisible(HWND hWnd);
  hWnd:被测试窗口的句柄。
返回值:&&& 如果指定的窗口及其父窗口具有WS_VISIBLE风格,返回值为非零;如果指定的窗口及其父窗口不具有WS_VISIBLE风格,返回值为零。由于返回值表明了窗口是否具有Ws_VISIBLE风格,因此,即使该窗口被其他窗口遮盖,函数返回值也为非零。备注:&&& 窗口的可视状态由WS_VISIBLE位指示。当设置了WS_VISIBLE位,窗口就可显示,而且只要窗口具有WS_VISIBLE风格,任何画在窗口的信息都将被显示。
IsWindow函数功能:该函数确定给定的窗口句柄是否标示一个已存在的窗口。 函数原型:BOOL IsWindow(HWND hWnd);参数:&&& hWnd:被测试窗口的句柄。返回值:&&& 如果窗口句柄标识了一个已存在的窗口,返回值为TURE;如果窗口句柄未标识一个已存在窗口,返回值为FALSE。
FindWindowHWND FindWindow(LPCSTR lpClassName,LPCSTR lpWindowName );参数:lpClassName
  指向一个以null结尾的、用来指定类名的字符串或一个可以确定类名字符串的原子。如果这个参数是一个原子,那么它必须是一个在调用此函数前已经通过GlobalAddAtom函数创建好的全局原子。这个原子(一个16bit的值),必须被放置在lpClassName的低位字节中,lpClassName的高位字节置零。
lpWindowName
  指向一个以null结尾的、用来指定窗口名(即窗口标题)的字符串。如果此参数为NULL,则匹配所有窗口名。返回值:如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。
  如果函数执行失败,则返回值为 NULL 。可以通过调用GetLastError函数获得更加详细的错误信息。SetWindowText:至于窗口标题的改变,我们可以通过SetWindowText来实现注:如果窗口本身属性是不显示标题的,这个函数的调用不会影响窗口属性。//Set title for application&s main frame window .AfxGetMainWnd ( ) && SetWindowText (_T("Application title") )
//Set title for View&s MDI child frame window .GetParentFrame ( ) && SetWindowText ("_T ("MDI Child Frame new title") )
//Set title for dialog&s push button control.GetDigitem (IDC_BUTTON) && SetWindowText (_T ("Button new title ") )
1、直接得句柄&&&&&&&& GetActiveWindow();&&&&&&& //得激活窗口句柄
&&&&&&& GetForegroundWindows();&&&&&&&&&& //的前台窗口句柄
&&&&&& AfxGetApp()-&GetMainWnd()-&GetSafeHwnd()&&&&& //很常规的,涉及到很多方法
2、枚举型的
&&&& HWND GetWindow(HWND hWnd, UINT uCmd );&&&&&&//要先有hWnd,然后指明uCmd 的关系
&&&& HWND FindWindowEx(&HWND hwndParent,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&HWND hwndChildAfter,&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& LPCTSTR lpszClass, L
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& PCTSTR zWindow);&&&
&&&& //由类名和窗口标题得句柄,可能不只一个,所以不唯一确定
3、其他参数的句柄
&&&& 进程ID:
&&& MARK:由句柄得ID可以用GetWindowThreadProcessId()
&&& 而由ID的句柄只能枚举+比较了
历遍全部窗体,并取得他们对应的HWND进一步取得对应PID,符合已知PID的就是了,当然可能要判断一下窗体状态了,如果进程只有一个窗体那就不用了。
例:如果要在列表框里显示所有的窗口BOOL CALLBACK EnumWindowsProc(&& HWND hwnd,&&&&&& // handle to parent window&& LPARAM lParam&&& // application-defined value){char lpWinTitle[256];&&::GetWindowText(hwnd,lpWinTitle,256-1);&&CString m_strT&m_strTitle.Format("%s",lpWinTitle);CListBox *p_l = (CListBox *)lPif (!m_strTitle.IsEmpty()){&& p_l-&AddString(lpWinTitle);}return TRUE;}
调用EnumWindows(EnumWindowsProc, (LPARAM)GetDlgItem(IDC_LIST1));
阅读(...) 评论() &查看:9064|回复:9
怎么获取多个同样进程同样窗口标题的句柄?希望能给出实例代码参考,谢谢大家了。本人新手。
我的代码如下,结果获取到的都是同一个进程的ID,比如我开了3个进程取到的PID都是最后开的那个进程的PID。复制内容到剪贴板代码:char nTitle[100];
HWND Fhwnd[10];
DWORD Fpid[10];
BOOL CALLBACK lpEnumFunc (HWND hWnd,LPARAM lParam)
& && &&&char gTitle[100];
& && &&&CS
& && &&&::GetWindowText(hWnd,gTitle,sizeof(gTitle));
& && &&&str.Format(&%s&,gTitle);
& && &&&if (str.Find(&测试&) != -1)
& && && && && & strncat_s(nTitle,str,sizeof(str));
& && && && && &
& && && && && & Fhwnd[n]=::FindWindow(NULL,str);
& && && && && & GetWindowThreadProcessId(Fhwnd[n],&Fpid[n]);
& && && && && && && && &n++;
& && &&&return 1;
版规,发帖可获2无忧币
本帖最后由 CrossGrave 于
10:29 编辑
你这个函数怎么用的
引用:原帖由 向立天 于
10:28 发表
你这个函数怎么用的
枚举? EnumWindows不是枚举所有窗口吗?我现在能正确的获取到窗口的句柄,但是通过GetWindowThreadProcessId获取的PID是一样的
版规,回帖可获2无忧币
引用:原帖由 向立天 于
10:28 发表
你这个函数怎么用的
枚举? 我知道问题出在FindWindow上面这个取得的多个进程的句柄其实都是一个进程的句柄所以取得的PID都是一样的
版规,回帖可获2无忧币
看你定义了一个回调函数
不过没见你怎么调用啊
引用:原帖由 向立天 于
18:29 发表
看你定义了一个回调函数
不过没见你怎么调用啊 我调用了。在EnumWindows这个函数里面调用了,只不过没有贴出来,有没有办法获取多个同样窗口标题的PID号的方法,找了半天也没有找到实例代码啊?
版规,回帖可获2无忧币
仔细看了一下
::GetWindowText(hWnd,gTitle,sizeof(gTitle));
获取窗口标题
但是在这里
Fhwnd[n]=::FindWindow(NULL,str);
又重新获取窗口句柄
句柄不就是hWnd么
既然你的目标窗口都是同名的
那你再次获取肯定只能得到z序最高的啊
引用:原帖由 CrossGrave 于
10:23 发表
怎么获取多个同样进程同样窗口标题的句柄?希望能给出实例代码参考,谢谢大家了。本人新手。
我的代码如下,结果获取到的都是同一个进程的ID,比如我开了3个进程取到的PID都是最后开的那个进程的PID。char nTitle[100];
int&&... Fhwnd[n]=::FindWindow(NULL,str);
GetWindowThreadProcessId(Fhwnd[n],&Fpid[n]);以上两句改为Fhwnd[n] = hW
GetWindowThreadProcessId(Fhwnd[n],&Fpid[n]);
就行了,不要再调用FindWindow
版规,回帖可获2无忧币
本帖最后由 wem247 于
16:28 编辑
引用:原帖由 wem247 于
16:24 发表
Fhwnd[n]=::FindWindow(NULL,str);
GetWindowThreadProcessId(Fhwnd[n],&Fpid[n]);以上两句改为Fhwnd[n] = hW
GetWindowThreadProcessId(Fhwnd[n],&Fpid[n]);
就行了,不要再调用FindWindow ... 谢谢 我试试
版规,回帖可获2无忧币
引用:原帖由 wem247 于
16:24 发表
Fhwnd[n]=::FindWindow(NULL,str);
GetWindowThreadProcessId(Fhwnd[n],&Fpid[n]);以上两句改为Fhwnd[n] = hW
GetWindowThreadProcessId(Fhwnd[n],&Fpid[n]);
就行了,不要再调用FindWindow ... 谢谢,这样修改之后是成功的。
版规,回帖可获2无忧币姹備竴娈电敱杩涚▼鍙ユ焺鑾峰彇绐楀彛鍙ユ焺鐨勭▼搴忋}

我要回帖

更多关于 根据进程获取窗口句柄 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信