关于句柄和向另一个窗口发送消息!

hyz23je 2012-04-07 06:04:55
自己写了个测试程序,流程是这样的!

先创建一个进程,然后使用EnumWindows来枚举找到这个进程在桌面的窗口句柄存于TWnd里面,

然后向这个窗口句柄发送消息,::SendMessage(TWnd,WM_CLOSE,0,0);为什么这个窗口不会关闭?



还有一个问题,我看Windows程序第二版里面有一个例子的一段代码是“获取鼠标所在处的窗口句柄”代码如下

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 ?

了解的朋友说下!关注的朋友帮顶下!谢谢了!
...全文
495 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
麻浦区保安 2012-09-25
  • 打赏
  • 举报
回复
我也遇到了相同的问题,怎么确定那边收到了消息呢???
hyz23je 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
感觉那属于进程间通信问题了。你能确保对方窗口确实收到所发送的消息了吗?
[/Quote]

就是不知道怎样确定对方有没收到消息!
hyz23je 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
你好,第一个问题:
我在MFC里面简单实现了:
代码如下;
BOOL CALLBACK EnumWindowsProc(HWND hWnd,LPARAM lParam)
{
if ( GetParent(hWnd)==NULL && IsWindowVisible(hWnd) ) //判断是否顶层窗口并且可见
{
char WindowTitle[100]={0}; ……
[/Quote]

基本和我的代码差不多吧!我的是先通过PID来获取窗口句柄,然后向这个窗口句柄发送关闭消息!但怎么也关闭不了!现在我不知道怎样说了!先看看再说吧
ruby97 2012-04-07
  • 打赏
  • 举报
回复
你好,第一个问题:
我在MFC里面简单实现了:
代码如下;
BOOL CALLBACK EnumWindowsProc(HWND hWnd,LPARAM lParam)
{
if ( GetParent(hWnd)==NULL && IsWindowVisible(hWnd) ) //判断是否顶层窗口并且可见
{
char WindowTitle[100]={0};


::GetWindowText(hWnd,WindowTitle,100);
CString str;
str.Format(_T("%s----%d"),WindowTitle,(int)hWnd);
::MessageBox(NULL,str.GetBuffer(MAX_PATH),NULL,MB_OK);
if(((int)hWnd)==1705594)
{
::SendMessage(hWnd,WM_CLOSE,0,0);
}
}
return true;
}
void CEnumWindowDlg::OnButton1()
{
// TODO: Add your control notification handler code here
::EnumWindows(EnumWindowsProc ,NULL );
}

第一遍,先不加那个if判断,记录一个窗口的句柄号,然后选一个删除。我选了一个,1705594那个,然后添加了sendmessage,成功删除了
JoeBlackzqq 2012-04-07
  • 打赏
  • 举报
回复
感觉那属于进程间通信问题了。你能确保对方窗口确实收到所发送的消息了吗?

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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