FindWindow()函数 传窗口类名 获取 窗口句柄 没反应 ?

嘻嘻666 2016-11-22 02:41:56
Window SDK 中的函数原型为:
HWND FindWindow(
LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);


窗口的类名




调用 FindWindow函数 返回值是0;


这是调试的结果


...全文
417 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
对话框的类名可以为空,只要有对话框的标题名就好了。 通过对话框的标题名来获取句柄就可以, 在OnInitDialog函数中设置对话框标题SetWindowTex()
嘻嘻666 2016-11-22
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
推荐使用Spy4Win软件,将狗头拖到你关心的窗口上,使用其自带的功能:生成一段C++代码用来获取对应窗口句柄。
我试试
赵4老师 2016-11-22
  • 打赏
  • 举报
回复
推荐使用Spy4Win软件,将狗头拖到你关心的窗口上,使用其自带的功能:生成一段C++代码用来获取对应窗口句柄。
嘻嘻666 2016-11-22
  • 打赏
  • 举报
回复
大神说的 方法 具体化操作是怎样? spy++里面 能看得到窗口的句柄 那个能用吗?
嘻嘻666 2016-11-22
  • 打赏
  • 举报
回复


空的

上午忙活了那么久,修改窗口类名 下午竟然不能用!!!。
嘻嘻666 2016-11-22
  • 打赏
  • 举报
回复
也不行 , FindWindowEx()函数说明里也有这句话。 会是哪里出了错?
凌乱哥 2016-11-22
  • 打赏
  • 举报
回复
不应该啊,那你看看你那个hWnd2变量是不是空的。我这边试了完全没问题:
zgl7903 2016-11-22
  • 打赏
  • 举报
回复
试试用 FindWindowEx FindWindow 有这样的说明 The FindWindow function retrieves a handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows.
sxqinge 2016-11-22
  • 打赏
  • 举报
回复
你这种情况我也碰到过,没能解决,后来没办法了,就把创建窗口的句柄给保存了作为值去传递
嘻嘻666 2016-11-22
  • 打赏
  • 举报
回复
试了


还是不行

sxqinge 2016-11-22
  • 打赏
  • 举报
回复
字符串用 _T("") 试试看
函数功能 在窗口列表中寻找与指定条件相符的第一个子窗口 。 该函数获得一个窗口句柄,该窗口类名窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。 参数; (1)hwndParent:要查找的子窗口所在的父窗口句柄(如果设置了hwndParent,则表示从这个hwndParent指向的父窗口中搜索子窗口)。 如果hwndParent为 0 ,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口。 (2)hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndParent窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。 (3)lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。 (4)lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。 返回值 Long,找到的窗口句柄。如未找到相符窗口,则返回零。会设置GetLastError 如果函数成功,返回值为具有指定类名窗口名的窗口句柄。如果函数失败,返回值为NULL。 若想获得更多错误信息,请调用GetLastError函数
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. 主窗口一般都有子窗口(这个不是一定的,但是具有普遍性)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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