在C#中如何监视其他程序
2008-12-17 23:47
411 查看
我们在做项目的时候,可能会碰到需要监视非我们开发的程序的消息,比如监视个记事本,帮助文件等等
其实做到这个很简单,主要应用如下几个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 使用
public delegate int CallWindowProcDelegate(int Wnd, int Msg, int WParam, int LParam);
public static CallWindowProcDelegate MyCallWindowProc;
然后我们声明几个需要用到的消息
public const int HH_DISPLAY_INDEX = 0x0002; //显示帮助文件的时候,显示Index的Tab
public const int GWL_WNDPROC = -4; //供GetWindowLong 和SetWindowLong 使用
然后定义一个私有变量,保存GetWindowLong 获得的值
public static int oldWindow = 0;
接下来声明需要用到的API
[DllImport("user32.dll")]
protected static extern int GetWindowLong(int hwindow, int unindex);
[DllImport("user32.dll")]
protected static extern int CallWindowProc(int lpPrevWndFunc, int hWnd, int Msg, int wParam, int lParam);
[DllImport("user32.dll")]
protected static extern int SetWindowLong(int hwindow, int unindex, CallWindowProcDelegate lnewvalue);//这个是关键
[DllImport("hhctrl.ocx", CharSet = CharSet.Unicode, EntryPoint = "HtmlHelpW")]
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。
其实做到这个很简单,主要应用如下几个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 使用
public delegate int CallWindowProcDelegate(int Wnd, int Msg, int WParam, int LParam);
public static CallWindowProcDelegate MyCallWindowProc;
然后我们声明几个需要用到的消息
public const int HH_DISPLAY_INDEX = 0x0002; //显示帮助文件的时候,显示Index的Tab
public const int GWL_WNDPROC = -4; //供GetWindowLong 和SetWindowLong 使用
然后定义一个私有变量,保存GetWindowLong 获得的值
public static int oldWindow = 0;
接下来声明需要用到的API
[DllImport("user32.dll")]
protected static extern int GetWindowLong(int hwindow, int unindex);
[DllImport("user32.dll")]
protected static extern int CallWindowProc(int lpPrevWndFunc, int hWnd, int Msg, int wParam, int lParam);
[DllImport("user32.dll")]
protected static extern int SetWindowLong(int hwindow, int unindex, CallWindowProcDelegate lnewvalue);//这个是关键
[DllImport("hhctrl.ocx", CharSet = CharSet.Unicode, EntryPoint = "HtmlHelpW")]
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。
相关文章推荐
- 在C#中如何监视自己打开的其他程序
- 用C#做成的程序如何打包部署,在其他PC机运行
- 用C#做成的程序如何打包部署,在其他PC机运行
- 想自己用C#写程序,主要功能是对其他的程序进行打包,如何实现,求高手指教!!!
- C# Winform程序如何获取运行路径
- 如何用Nsight调试C# OpenGL程序
- 如何构造一个C#语言的爬虫程序开发者在线 Builder.com.cn 更新时间:2008-07-20作者: 来源:
- C#如何在程序里定时启动任务
- 编写高质量代码改善C#程序的157个建议——建议68:从System.Exception或其他常见的基本异常中派生异常
- c# 关闭其他程序窗口/进程
- C# 如何更改程序集名称
- 如何构造一个C#语言的爬虫程序
- 如何用C#语言构造蜘蛛程序
- c#通过SendMessage发送消息,改变其他程序的下拉框控件(ComboBox)的值
- 如何在应用程序中启动其他程序(三种方法)
- C#中如何在程序中引用共享程序集
- [置顶] c#程序中如何执行 dos命令
- 如何使用Visual Studio调试C#程序
- C#如何获取其他程序ListView控件中的内容 含源码
- C# Winform程序如何获取运行路径, 控制台也可以