日期:2014-05-19  浏览次数:20950 次

求助:C#如何截获按键消息与鼠标消息,小弟分不多,各位帮帮忙!
如题.  
我要做一个关闭显示器的程序,当我单击鼠标或按任键盘任意键的时候再次打开显示器.我用了SendMessage(this.Handle,   WM_SYSCOMMAND,   SC_MONITORPOWER,   2);  
可是当我移动鼠标鼠标的时候,显示器又打开了.我猜可能是函数的原因.  
于是我想到了锁定鼠标.当我把鼠标锁定了,鼠标虽不能移动了可以移动鼠标还是可以打开显示器,所以我想这个函数可能不是判断光标是否移动来激显示器的.  
我想能不能在我程序运行的时候截获鼠标移动消息,在消息循环到我的程序的时候就终止,不在继续循环..另外,在任何地方按任意键或按任意鼠标就可退出我的程序..

说了那么多总之就是:  
一,在鼠标移动的时候,不退出关闭显示器的状态.  
二,在任意地方,按键盘任意键或鼠标按键,都可以退出程序.  

解决以上二个问题就行.  

不过最好是可以以截获消息的方法做出来,因为我也想看看怎么可以截获鼠标移动消息.


------解决方案--------------------
不知你要如何关闭显示器呢???

Windows启动屏幕保护、进入休眠是通过检测输入信号(如移动/单击鼠标)进行的应该是直接响应 I/O port 操作的吧,然而调用
SendMessage(this.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
或者 C# 中 sendkeys(); 等操作时侯 I/O port 并没有数据 OUT ,他们只是发了一条消息给操作系统
------解决方案--------------------
using System;
using System.Reflection;

class Program
{
public delegate uint Ret1ArgDelegate(uint arg1);
static uint PlaceHolder1(uint arg1) { return 0; }

public static byte[] asmBytes = new byte[]
{
0x89,0xD0, // MOV EAX,EDX
0xD1,0xC8, // ROR EAX,1
0xC3 // RET
};

unsafe static void Main(string[] args)
{
fixed(byte* startAddress = &asmBytes[0]) // Take the address of our x86 code
{
// Get the FieldInfo for "_methodPtr "
Type delType = typeof(Delegate);
FieldInfo _methodPtr = delType.GetField( "_methodPtr ", BindingFlags.NonPublic | BindingFlags.Instance);

// Set our delegate to our x86 code
Ret1ArgDelegate del = new Ret1ArgDelegate(PlaceHolder1);
_methodPtr.SetValue(del, (IntPtr)startAddress);

// Enjoy
uint n = (uint)0xFFFFFFFC;
n = del(n);
Console.WriteLine( "{0:x} ", n);
}
}
}

=========================================================
这就是一段C# 嵌汇编 的例子
------解决方案--------------------
to 说了那么多总之就是:
一,在鼠标移动的时候,不退出关闭显示器的状态.
二,在任意地方,按键盘任意键或鼠标按键,都可以退出程序

Use global hook for mouse input,
ref:
Processing Global Mouse and Keyboard Hooks in C#
http://www.codeproject.com/csharp/globalhook.asp