在C#中如何监视其他程序

我们在做项目的时候,可能会碰到需要监视非我们开发的程序的消息,比如监视个记事本,帮助文件等等

其实做到这个很简单,主要应用如下几个API

GetWindowLong (http://msdn.microsoft.com/en-us/library/ms633584(VS.85).aspx)

SetWindowLong (http://msdn.microsoft.com/en-us/library/ms633591(VS.85).aspx)

CallWindowProc (http://msdn.microsoft.com/en-us/library/ms633571(VS.85).aspx)

还可能会用到FindWindow (http://msdn.microsoft.com/en-us/library/ms633499.aspx) 等

 

下面我们举个简单的例子来说明下

假定要求如下:

程序没有主窗体,打开一个帮助文件,关闭帮助文件的时候程序退出

 

打开帮助文件,我们使用HtmlHelp (http://msdn.microsoft.com/en-us/library/aa164218(office.10).aspx)这个API

 

首先我们声明一个delagate,供SetWindowLong 使用

  1. public delegate int CallWindowProcDelegate(int Wnd, int Msg, int WParam, int LParam);
  2. public static CallWindowProcDelegate MyCallWindowProc;

然后我们声明几个需要用到的消息

 

  1. public const int HH_DISPLAY_INDEX = 0x0002; //显示帮助文件的时候,显示Index的Tab
  2. public const int GWL_WNDPROC = -4; //供GetWindowLong 和SetWindowLong 使用

然后定义一个私有变量,保存GetWindowLong 获得的值

 

  1. public static int oldWindow = 0;

 

接下来声明需要用到的API

 
  1. [DllImport("user32.dll")]
  2. protected static extern int GetWindowLong(int hwindow, int unindex);

  3. [DllImport("user32.dll")]
  4. protected static extern int CallWindowProc(int lpPrevWndFunc, int hWnd, int Msg, int wParam, int lParam);  

  5. [DllImport("user32.dll")]
  6. protected static extern int SetWindowLong(int hwindow, int unindex, CallWindowProcDelegate lnewvalue);//这个是关键

  7. [DllImport("hhctrl.ocx", CharSet = CharSet.Unicode, EntryPoint = "HtmlHelpW")]
  8. protected static extern int HtmlHelp(int caller,String file,uint command,String str);

在Main方法中:

 

    • int handle = HtmlHelp(0, "e://CDMHELP.chm", HH_DISPLAY_INDEX, "");
    • oldWindow = GetWindowLong(handle, GWL_WNDPROC);
    • MyCallWindowProc = new CallWindowProcDelegate(WndProc);
    • SetWindowLong(handle, GWL_WNDPROC, MyCallWindowProc);
    • Application.Run();

 

WndProc方法

 

    • private static int WndProc(int Wnd, int Msg, int WParam, int LParam)
    • {
    •     //在这里可以对你需要的消息进行监控,最后别忘了调用下面这句话
    •     return CallWindowProc(oldWindow, Wnd, Msg, WParam, LParam);
    • }

 

完整代码如下:

 

    • using System;
    • using System.Collections.Generic;
    • using System.Text;
    • using System.Windows.Forms;
    • using System.Threading;
    • using System.Diagnostics;
    • using System.Runtime.InteropServices;

    • namespace testApplication1
    • {
    •     public class test
    •     {
    •         public delegate int CallWindowProcDelegate(int Wnd, int Msg, int WParam, int LParam);
    •         public static CallWindowProcDelegate MyCallWindowProc;
    •         public const int HH_DISPLAY_INDEX = 0x0002;
    •         public const int GWL_WNDPROC = -4;
    •         public static int oldWindow = 0;
    •         [STAThread]
    •         static void Main(string[] args)
    •         {
    •             int handle = HtmlHelp(0, "e://CDMHELP.chm", HH_DISPLAY_INDEX, "");
    •             oldWindow = GetWindowLong(handle, GWL_WNDPROC);
    •             MyCallWindowProc = new CallWindowProcDelegate(WndProc);
    •             SetWindowLong(handle, GWL_WNDPROC, MyCallWindowProc);
    •             Application.Run();
    •         }
    •         private static int WndProc(int Wnd, int Msg, int WParam, int LParam)
    •         {
    •             //在这里监控消息
    •             return CallWindowProc(oldWindow, Wnd, Msg, WParam, LParam);
    •         }

    •         [DllImport("user32.dll")]
    •         public static extern int GetWindowLong(int hwindow, int nindex);

    •         [DllImport("user32.dll")]
    •         static extern int CallWindowProc(int lpPrevWndFunc, int hWnd, int Msg, int wParam, int lParam);  

    •         [DllImport("user32.dll")]
    •         public static extern int SetWindowLong(int hwindow, int nindex, CallWindowProcDelegate lnewvalue);

    •         [DllImport("hhctrl.ocx", CharSet = CharSet.Unicode, EntryPoint = "HtmlHelpW")]
    •         protected static extern int HtmlHelp(int caller,String file,uint command,String str);

    •     }
    • }

我这里没有用到FindWindow是因为我用HtmlHelp可以得到我外部程序的Handle,如果你是监视其他的程序可以先用这个API得到Handle。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值