- WndProc:主要用在拦截并处理系统消息和自定义消息
- 例如
- Winform程序会产生很多消息,比如你单击鼠标,移动窗口都会产生消息。这个函数就是默认的消息处理函数。你可以重载这个函数来制定自己的消息处理流程。
- 在Winform程序中,可以重写WndProc函数,来捕捉所有发生的窗口消息。
- 这样,我们就可以"篡改"传入的消息,而人为的让窗口改变行为。
案例代码:
public partial class Form1 : Form
{
public const int LOGINFORM_MSG = 0x400;
protected override void WndProc(ref System.Windows.Forms.Message msg)
{
switch (msg.Msg)
{
case LOGINFORM_MSG: //权限界面消息
switch ((msg.LParam.ToInt32()))
{
case 301:
{
MessageBox.Show("收到发来消息:" + msg.WParam.ToInt32());
//if (msg.WParam.ToInt32() == 1)
//{
//}
//else
//{
//}
}
break;
}
break;
}
base.WndProc(ref msg); //调用基类函数处理非自定义消息。
}
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//扫码线程
Thread m_Thread1 = new Thread(Thread1Handle);
m_Thread1.IsBackground = true;
m_Thread1.Start();
}
static void Thread1Handle()
{
Thread.Sleep(3000);
new Demo().Test();
}
}
public class Demo
{
/// <summary>
/// 发送消息到指定窗口
/// </summary>
/// <param name="hWnd">其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,
/// 包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口</param>
/// <param name="msg">指定被发送的消息</param>
/// <param name="wParam">指定附加的消息指定信息</param>
/// <param name="lParam">指定附加的消息指定信息</param>
/// <returns></returns>
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern IntPtr SendMessage(int hWnd, int msg, IntPtr wParam, IntPtr lParam);//窗口句柄、、
/// <summary>
/// 获取窗体句柄
/// </summary>
/// <param name="lpClassName">指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。假设该參数为一个成员,
/// 则它必须为前次调用theGlobafAddAtom函数产生的全局成员。该成员为16位,必须位于IpClassName的低 16位,高位必须为 0</param>
/// <param name="lpWindowName">指向一个指定了窗体名(窗体标题)的空结束字符串。假设该參数为空,则为全部窗体全匹配</param>
/// <returns></returns>
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern int FindWindow(string lpClassName, string lpWindowName);
public const int LOGINFORM_MSG = 0x400;
public void Test()
{
int WINDOW_HANDLER = FindWindow(null, "Form1");//发送消息窗口句柄this.Handle.ToInt32()
if (WINDOW_HANDLER == 0)
{
throw new Exception("Could not find Main window!");//找不到主窗口
}
//long result = SendMessage(WINDOW_HANDLER, LOGINFORM_MSG, new IntPtr(MSG), new IntPtr(ID)).ToInt64();
long result = SendMessage(WINDOW_HANDLER, LOGINFORM_MSG, new IntPtr(0), new IntPtr(301)).ToInt64();
for (int i = 0; i < 100000; i++)
{
Application.DoEvents();
}
result = SendMessage(WINDOW_HANDLER, LOGINFORM_MSG, new IntPtr(1), new IntPtr(301)).ToInt64();
}
}