VC窗口句柄与向窗口送消息!高手进来下!
自己写了个测试程序,流程是这样的!先创建一个进程,然后使用EnumWindows来枚举找到这个进程在桌面的窗口句柄存于TWnd里面,然后向这个窗口句柄发送消息,::Sen...
自己写了个测试程序,流程是这样的!
先创建一个进程,然后使用EnumWindows来枚举找到这个进程在桌面的窗口句柄存于TWnd里面,
然后向这个窗口句柄发送消息,::SendMessage(TWnd,WM_CLOSE,0,0);为什么这个窗口不会关闭?
还有一个问题,我看Windows程序第二版里面有一个例子的一段代码是“获取鼠标所在处的窗口句柄”代码如下
C/C++ code
void CMainWindow::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_bCatchMouseDown)
{
// 将客户区坐标转换为屏幕坐标
::ClientToScreen(m_hWnd, &point);
// 取得鼠标所在处的窗口的句柄
HWND hWnd = ::WindowFromPoint(point);
if(hWnd == m_wndInfo.m_hWnd)
return;
// 擦除前一个窗口上的红色框架,取得新的目标窗口的信息,绘制框架
m_wndInfo.EraseFrame();
m_wndInfo.GetInfo(hWnd);
m_wndInfo.DrawFrame();
// 通过无效显示区域,使窗口客户区重画
::InvalidateRect(m_hWnd, &m_rcMsgBox, TRUE);
}
}
为什么上面这段代码获取到的窗口句柄,与我用EnumWindows枚举获取到的窗口句柄不一样呢(有些软件会一样),
举个例子:我把鼠标停在我打开的“暴风影音”窗口标题栏上,可以获取得它的窗口句柄0X1111111,但是我用EnumWindows
枚举获取的窗口句柄不是0X1111111,而是0X2222222,为什么呢?
还有个问题,在一个类中自定义消息,返回类型都是long的吗?看了好几个例子都是返回类型都是long ?
了解的朋友说下!关注的朋友帮顶下!谢谢了!
3.第三个问题明白了!谢谢
还有个问题!窗口句柄不是固定的吗?不同的程序获取后怎么会不一样呢? 展开
先创建一个进程,然后使用EnumWindows来枚举找到这个进程在桌面的窗口句柄存于TWnd里面,
然后向这个窗口句柄发送消息,::SendMessage(TWnd,WM_CLOSE,0,0);为什么这个窗口不会关闭?
还有一个问题,我看Windows程序第二版里面有一个例子的一段代码是“获取鼠标所在处的窗口句柄”代码如下
C/C++ code
void CMainWindow::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_bCatchMouseDown)
{
// 将客户区坐标转换为屏幕坐标
::ClientToScreen(m_hWnd, &point);
// 取得鼠标所在处的窗口的句柄
HWND hWnd = ::WindowFromPoint(point);
if(hWnd == m_wndInfo.m_hWnd)
return;
// 擦除前一个窗口上的红色框架,取得新的目标窗口的信息,绘制框架
m_wndInfo.EraseFrame();
m_wndInfo.GetInfo(hWnd);
m_wndInfo.DrawFrame();
// 通过无效显示区域,使窗口客户区重画
::InvalidateRect(m_hWnd, &m_rcMsgBox, TRUE);
}
}
为什么上面这段代码获取到的窗口句柄,与我用EnumWindows枚举获取到的窗口句柄不一样呢(有些软件会一样),
举个例子:我把鼠标停在我打开的“暴风影音”窗口标题栏上,可以获取得它的窗口句柄0X1111111,但是我用EnumWindows
枚举获取的窗口句柄不是0X1111111,而是0X2222222,为什么呢?
还有个问题,在一个类中自定义消息,返回类型都是long的吗?看了好几个例子都是返回类型都是long ?
了解的朋友说下!关注的朋友帮顶下!谢谢了!
3.第三个问题明白了!谢谢
还有个问题!窗口句柄不是固定的吗?不同的程序获取后怎么会不一样呢? 展开
3个回答
展开全部
::SendMessage(TWnd,WM_CLOSE,0,0);为什么这个窗口不会关闭?
两种情况:句柄获取不正确消息未送到,或者目标窗口重写了close消息,收到该消息并不关闭窗口。
枚举获取的窗口句柄不是0X1111111,而是0X2222222,为什么呢?
不同的进程(非本进程窗口)获取同一窗口句柄值可能会不一样。如果同一进程多次获得同一窗口句柄值不同的话,就是你获取句柄出错了。
自定义消息是没有返回类型的,它又不是函数……如果你说的是消息响应函数,只能说在一定条件下是(较新版本的mfc中,如果你通过mfc的映射方式就必须返回LRESULT,即long)。极端情况下,你可以写自己的库,任意规定消息函数的返回值,甚至你返回float型都是可以的。
两种情况:句柄获取不正确消息未送到,或者目标窗口重写了close消息,收到该消息并不关闭窗口。
枚举获取的窗口句柄不是0X1111111,而是0X2222222,为什么呢?
不同的进程(非本进程窗口)获取同一窗口句柄值可能会不一样。如果同一进程多次获得同一窗口句柄值不同的话,就是你获取句柄出错了。
自定义消息是没有返回类型的,它又不是函数……如果你说的是消息响应函数,只能说在一定条件下是(较新版本的mfc中,如果你通过mfc的映射方式就必须返回LRESULT,即long)。极端情况下,你可以写自己的库,任意规定消息函数的返回值,甚至你返回float型都是可以的。
追问
谢谢朋友!
1.我是通过EnumWindows来枚举,在回调函数中通过PID值来确定是否是我要找的窗口!这种方法能正确获取窗口句柄吗?
2.我的理解:不同进程对同一个窗口句柄的获取有可能一样也有可能不一样,刚才我测试了一下,运行了两个A程序(A程序可以创建进程,并获取其窗口句柄),然后对同一程序B进行创建,并获取其句柄,发现有时候会一样有时候会不一样,那我A程序获取句柄的这段代码有问题吗?
3.请看下我的问题补充
展开全部
1. 可能 SendMessage(TWnd,WM_CLOSE,0,0) 中TWnd不正确。可能你没有恰当使用EnumWindows——通常在它简单枚举窗口时回调你的函数EnumWindowsProc,,在其中你可判断这是否是要找的窗口(如通过WindowText检查窗口标题)。
2. 很可能与1是同一个问题。
3. 对MFC不熟悉,但可想象这个返回值应该同 WndProc() 函数:"LRESULT, A 32-bit value returned from a window procedure or callback function"
2. 很可能与1是同一个问题。
3. 对MFC不熟悉,但可想象这个返回值应该同 WndProc() 函数:"LRESULT, A 32-bit value returned from a window procedure or callback function"
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
返回类型都是long的吗?
vs2005以后,这个是必须的。 vc6的版本是可以void的。
vs2005以后,这个是必须的。 vc6的版本是可以void的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询