如何禁止任务管理器对任务的最大化最小化操作?

The_facE 2009-09-07 11:06:25
写一个Dialog工程,无论怎么处理,怎么截获消息,都能通过任务管理器把对话框最大化,有没有什么办法把这个东西干掉?
...全文
627 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
jqicpc 2009-09-09
  • 打赏
  • 举报
回复

ON_WM_GETMINMAXINFO()

应该用这个宏映射
The_facE 2009-09-09
  • 打赏
  • 举报
回复
难道我写的有问题?

类的声明中添加成员函数
afx_msg void OnGetMinMaxInfo( MINMAXINFO * lpMMI );

在消息映射表中添加
ON_MESSAGE( WM_GETMINMAXINFO, OnGetMinMaxInfo )

函数OnPaint里获取矩形
this->GetWindowRect( &m_rect );

最后把函数定义写入。可是这样跟进去lpMMI确实是NULL,是不是我哪里写的不对?
The_facE 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 jqicpc 的回复:]
ON_WM_GETMINMAXINFO()

应该用这个宏映射
[/Quote]

哦,搞定了,谢谢各位了。马上结贴!
Conry 2009-09-08
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 the_face 的回复:]
引用 21 楼 conry 的回复:
C/C++ codevoid Cldgl2Dlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{// TODO: 在此添加消息处理程序代码和/或调用默认值    lpMMI->ptMaxSize.x=m_rect.Width();
    lpMMI->ptMaxSize.y=m_rect.Height();

    lpMMI->ptMaxPosition.x=m_¡­


很可惜,这个会崩溃。因为指针进入的时候是NULL,我曾尝试了把它new出来,但是new出来后就无效了,任务管理器仍然成功最大化。
[/Quote]
lpMMI这个指针是系统给的,怎么能是空呢?
我的代码都是经过测试的,不信你新建一个dialog的MFC工程试试
m_rect当然是成员变量了,在OnPaint里面初始化,因为OnInitDialog得到的left,top都是0
他是在这个函数以后调用CenterWindow实现的dialog居中显示的
huangyuelei01 2009-09-08
  • 打赏
  • 举报
回复
屏蔽系统消系只能用HOOK
The_facE 2009-09-08
  • 打赏
  • 举报
回复
这个lpMMI指针的生存过程是怎样的呢?
The_facE 2009-09-08
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 conry 的回复:]
C/C++ codevoid Cldgl2Dlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{// TODO: 在此添加消息处理程序代码和/或调用默认值 lpMMI->ptMaxSize.x=m_rect.Width();
lpMMI->ptMaxSize.y=m_rect.Height();

lpMMI->ptMaxPosition.x=m_¡­
[/Quote]

很可惜,这个会崩溃。因为指针进入的时候是NULL,我曾尝试了把它new出来,但是new出来后就无效了,任务管理器仍然成功最大化。
The_facE 2009-09-08
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 huangyuelei01 的回复:]
屏蔽系统消系只能用HOOK
[/Quote]

是这样的吗?我总觉得这话有点绝对。
  • 打赏
  • 举报
回复
试试处理 WM_WINDOWPOSCHANGED WM_WINDOWPOSCHANGING
duguwuming0 2009-09-07
  • 打赏
  • 举报
回复
你设置Dialog属性没有最大化最小化不就可以了
dirdirdir3 2009-09-07
  • 打赏
  • 举报
回复
hook最大化的消息....
Conry 2009-09-07
  • 打赏
  • 举报
回复
void Cldgl2Dlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
lpMMI->ptMaxSize.x=m_rect.Width();
lpMMI->ptMaxSize.y=m_rect.Height();

lpMMI->ptMaxPosition.x=m_rect.left;
lpMMI->ptMaxPosition.y=m_rect.top;
//CDialog::OnGetMinMaxInfo(lpMMI);
}
zjj9850 2009-09-07
  • 打赏
  • 举报
回复
处理WM_GETMINMAXINFO消息~~
这个消息的lParam是个指向MINMAXINFO结构体的指针~~
消息处理只要改变ptMaxPosition,ptMaxSize,ptMaxTrackSize,ptMinTrackSize这个几个属性就可以了~~
因为每次接受SYSCOMMAND的时候,必先GETMINMAXINFO的~~
jqicpc 2009-09-07
  • 打赏
  • 举报
回复
ON_WM_GETMINMAXINFO()
SPY++发现会有一个 wm_getminmaxinfo, 小试了一下,貌似可行.
The_facE 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 tr0j4n 的回复:]
不要做成全局的,只针对自己的就好了
[/Quote]

钩WH_CBT的过程函数第二个参数还是等SC_MAXIMIZE吗?
不好用啊。我试验的结果还是只能截获自己的SC_MAXIMIZE,对任务管理器的不好用。

但是,好消息是,当我把WH_CBT的所有消息都钩掉的时候,这个Dialog和死掉了一样,任务管理器除了杀死它什么也不能做。关键是消息是个啥呢?Spy++一次出好多消息。WM_WINDOWPOSCHANGING消息也是在CBT里面吗?
The_facE 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 tr0j4n 的回复:]
不要做成全局的,只针对自己的就好了
[/Quote]

等我试试
MoXiaoRab 2009-09-07
  • 打赏
  • 举报
回复
不要做成全局的,只针对自己的就好了
MoXiaoRab 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 the_face 的回复:]
引用 10 楼 tr0j4n 的回复:
没必要Hook

任务管理器给你的程序发送WM_SYSCOMMAND

SC_MAXIMIZE
SC_MINIMIZE

消息实现最大化和最小化

你只要在自己的程序中拦截处理这2个子消息就可以了


这个不好使啊,我就是用这个方法不行才来问的。
[/Quote]
那就下WH_CBT 钩子,这个就应该好使了
shen_wei 2009-09-07
  • 打赏
  • 举报
回复
那你先得到任务管理器的句柄
然后在 WINDOWPOSCHANGING消息 进行判断就行了
abesky 2009-09-07
  • 打赏
  • 举报
回复
好像得到的是WINDOWPOSCHANGING消息不过需要判断是不是任务管理器发送的
加载更多回复(9)

15,979

社区成员

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

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