c# 如何使用WinAPI 拦截其它窗口大化改成其他操作

guoweidong 2012-11-19 12:07:59
调用很多方法,就是不知道哪个是最大化的消息,如何拦截处理。
 #region 钩子类型的枚举
public enum HookType : int
{
WH_JOURNALRECORD = 0,
WH_JOURNALPLAYBACK = 1,
WH_KEYBOARD = 2,
WH_GETMESSAGE = 3,
WH_CALLWNDPROC = 4,
WH_CBT = 5,
WH_SYSMSGFILTER = 6,
WH_MOUSE = 7,
WH_HARDWARE = 8,
WH_DEBUG = 9,
WH_SHELL = 10,
WH_FOREGROUNDIDLE = 11,
WH_CALLWNDPROCRET = 12,
WH_KEYBOARD_LL = 13,
WH_MOUSE_LL = 14
}
#endregion



 /// <summary>
/// 安装钩子
/// </summary>
/// <param name="_hookHandle">当前钩子</param>
/// <param name="hWnd">句柄</param>
/// <returns></returns>
private IntPtr InstallHook(IntPtr _hookHandle, IntPtr hWnd)
{
if (_hookHandle != IntPtr.Zero)
return _hookHandle;
Module[] list = System.Reflection.Assembly.GetExecutingAssembly().GetModules();
System.Diagnostics.Debug.Assert(list != null && list.Length > 0);
int processid = User32API.GetWindowThreadProcessId(hWnd, 0);
hookProc = new HookProc(myhookproc);
_hookHandle = (IntPtr)User32API.SetWindowsHookEx(HookType.WH_CBT, hookProc, (IntPtr)Marshal.GetHINSTANCE(list[0]), (int)processid);
return _hookHandle;
}


//钩子处理函数,在这里拦截消息并做处理
private int myhookproc(int code, IntPtr wparam, ref CWPSTRUCT cwp)
{
switch (code)
{
case 0:
switch (cwp.message)
{
case 0x0000F://WM_PAINT,拦截WM_PAINT消息
//do something
break;
case 0:

break;
}
break;
}
if (code == 6)
{
if(cwp.message==9)
this.textBox1.Text += "编码:" + code.ToString() + "\t\n消息:" + Convert.ToString(cwp.message, 16) + "\t\n\r";
}
return User32API.CallNextHookEx(IntPtr.Zero, code, wparam, ref cwp);
}
...全文
410 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bdmh 2012-11-19
  • 打赏
  • 举报
回复
你可以看WM_SYSCOMMAND的说明 http://baike.baidu.com/view/2451868.htm
jshi123 2012-11-19
  • 打赏
  • 举报
回复
用WH_GETMESSAGE 窗口最大化是WM_SYSCOMMAND with wParam=SC_MAXIMIZE
jshi123 2012-11-19
  • 打赏
  • 举报
回复
你的代码是实现不了你要的结果的
guoweidong 2012-11-19
  • 打赏
  • 举报
回复
晕了,搞了半天,你不是在我代码的基础上看的啊。
jshi123 2012-11-19
  • 打赏
  • 举报
回复
在.net中,你只能安装thread hook, 也就是只能监控本程序的窗口最大/最小化。 要监控其它程序的窗口最大/最小化,你要写一个本地dll来安装global hook,并调用你的C#代码。
guoweidong 2012-11-19
  • 打赏
  • 举报
回复
 //钩子处理函数,在这里拦截消息并做处理
        private int myhookproc(int code, IntPtr wparam, ref CWPSTRUCT cwp)
        {
            switch (code)
            {
                case 1:
                    switch (cwp.message)
                    {
                        case 0x0000F://WM_PAINT,拦截WM_PAINT消息
                            //do something                            
                            break;
                        case 0x112:                            
                            break;
                    }
                    this.textBox1.Text += "编码:" + code.ToString() + "\t\n参数:" + wparam + "消息:" + cwp.message + "\t\n\r";
                    break;
            }               
            return User32API.CallNextHookEx(IntPtr.Zero, code, wparam, ref cwp);            
        }
按你所说的,我在code=1的操作没有任何反应啊。
jshi123 2012-11-19
  • 打赏
  • 举报
回复
如果用cbt hook的话,code==6是HCBT_CLICKSKIPPED,鼠标相关的消息,跟窗口最大/小化没关系。 code==0是HCBT_MOVESIZE,窗口移动或改变大小相关消息,也跟窗口最大/小化没关系。 应该要用HCBT_MINMAX (code==1), 这个才是窗口最大/最小化消息。
guoweidong 2012-11-19
  • 打赏
  • 举报
回复
 if (cwp.message == 0x112)
                this.textBox1.Text += "编码:" + code.ToString() + "\t\n参数:" + wparam + "消息:" + Convert.ToString(cwp.message, 16) + "\t\n\r";
为什么这样用,还是得不到了?

110,552

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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