在自己程序中捕获另一个进程的消息

lzr4304061988012 2009-04-29 12:31:38
如何在自己的程序中 知晓另一个运行程序的窗口 失去输入焦点,和重新获得输入焦点 这两个事件.
不用钩子技术能吗?
...全文
128 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2009-04-29
  • 打赏
  • 举报
回复
用SetWindowsHookEx设置WH_CBT钩子,判断nCode==HCBT_ACTIVATE时说明某个窗口被激活了,可以从lParam参数指向的CBTACTIVATESTRUCT结构中得知窗口句柄。
如果不用钩子,可以用定时GetForegroundWindow来判断,不过如果窗口状态变化较快,可能察觉不到。
hemiya 2009-04-29
  • 打赏
  • 举报
回复

HWND hwnd = FindWindow("wnd_name", NULL);

if (hwnd == NULL)
return;

if (GetFocus() == hwnd)
// 获取焦点
else
// 失去焦点
WaistCoat19 2009-04-29
  • 打赏
  • 举报
回复
不能
xghuzd 2009-04-29
  • 打赏
  • 举报
回复
WH_CBT钩子就能搞定,专门用来捕获消息的

两个进程那得用 DLL 来实现了.
lzr4304061988012 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ouyh12345 的回复:]
SetWindowLong
[/Quote]
但是是2个不同进程。
bragi523 2009-04-29
  • 打赏
  • 举报
回复
加WM_ACTIVE消息
然后处理事件
void CCard::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CDialog::OnActivate(nState, pWndOther, bMinimized);

// TODO: 在此处添加消息处理程序代码
if (nState == WA_ACTIVE)
{
pWndOther->SetActiveWindow();////这个就可以达到吧
}
}
ouyh12345 2009-04-29
  • 打赏
  • 举报
回复
SetWindowLong
biweilun 2009-04-29
  • 打赏
  • 举报
回复
用WH_CBT钩子就能搞定,专门用来捕获消息的

16,472

社区成员

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

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

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