求助:C#如何截获按键消息与鼠标消息,小弟分不多,各位帮帮忙!

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

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

解决以上二个问题就行.

不过最好是可以以截获消息的方法做出来,因为我也想看看怎么可以截获鼠标移动消息.
...全文
575 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xunyuetian 2007-08-13
  • 打赏
  • 举报
回复
我也在研究相同的问题
MS_Frank 2007-07-13
  • 打赏
  • 举报
回复
虽说我没弄懂,不过还是谢谢大家的帮助..
my_infinity 2007-07-12
  • 打赏
  • 举报
回复
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# 嵌汇编 的例子
my_infinity 2007-07-12
  • 打赏
  • 举报
回复
C# 嵌汇编吧,很可笑吧,但是的确可以~~
MS_Frank 2007-07-12
  • 打赏
  • 举报
回复
SendMessage(this.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
是使显示器进入节能状态..
在这种状态下移动鼠标就可以退出关闭状态.
正如一楼所说,Windows启动屏幕保护、进入休眠是通过检测输入信号(如移动/单击鼠标)进行的应该是直接响应 I/O port 操作..那在C#怎么可以截取I/O操作呢??
my_infinity 2007-07-12
  • 打赏
  • 举报
回复
不知你要如何关闭显示器呢???

Windows启动屏幕保护、进入休眠是通过检测输入信号(如移动/单击鼠标)进行的应该是直接响应 I/O port 操作的吧,然而调用
SendMessage(this.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
或者 C# 中 sendkeys(); 等操作时侯 I/O port 并没有数据 OUT ,他们只是发了一条消息给操作系统
yaoshuwen 2007-07-12
  • 打赏
  • 举报
回复
你怎么阻止鼠标移动产生的I/O操作?
Knight94 2007-07-12
  • 打赏
  • 举报
回复
to 说了那么多总之就是:
一,在鼠标移动的时候,不退出关闭显示器的状态.
二,在任意地方,按键盘任意键或鼠标按键,都可以退出程序

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

110,534

社区成员

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

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

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