c# 调用鼠标?中如何调用资源文件中图标做鼠标指针
一、c# 怎么捕获桌面上的鼠标单双击**
我也想过这个问题但是我没到
我的老师给我的解释
是你的应用程是运行在*作系统上的
所以如果应用程序捕获自己的**
是没问题但是捕获*作系统就违反
了托管程序的规律了
可能是我才疏学浅吧
如果有了好办法
请发个邮件给我qianthinkover@163
对了如果那个问题用c++的话我的老师说能解决
但是我不会c++
二、C# 鼠标钩子获取鼠标左右键
不就是全局钩子我这有实例是键盘的你稍微换一下了
类似的问题好多............前几天就有人文这个问题。你也不说明什么问题就发代码...
新建一个form4窗体.增加2个button,增加**。。然后**代码
其实不一样的地方就是红色的地方
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Diagnostics;
namespace WindowsApplication1
{
///<summary>
/// Description of MainForm.
///</summary>
public partial class Form4: Form
{
//委托
public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
static int hHook= 0;
public const int WH_KEYBOARD_LL= 13;
//LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。
HookProc KeyBoardHookProcedure;
//键盘Hook结构函数
[StructLayout(LayoutKind.Sequential)]
public class KeyBoardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
#region DllImport
//设置钩子
[DllImport("user32.dll")]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
[DllImport("user32.dll", CharSet= CharSet.Auto, CallingConvention= CallingConvention.StdCall)]
//抽掉钩子
public static extern bool UnhookWindowsHookEx(int idHook);
[DllImport("user32.dll")]
//调用下一个钩子
public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);
[DllImport("kernel32.dll")]
public static extern int GetCurrentThreadId();
[DllImport("kernel32.dll")]
public static extern IntPtr GetModuleHandle(string name);
#endregion
#region自定义**
public void Hook_Start()
{
//安装键盘钩子
if(hHook== 0)
{
KeyBoardHookProcedure= new HookProc(KeyBoardHookProc);
//hHook= SetWindowsHookEx(2,
// KeyBoardHookProcedure,
// GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), GetCurrentThreadId());
hHook= SetWindowsHookEx(WH_KEYBOARD_LL,
KeyBoardHookProcedure,
GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
//如果设置钩子失败.
if(hHook== 0)
{
Hook_Clear();
//throw new Exception("设置Hook失败!");
}
}
}
//取消钩子**
public void Hook_Clear()
{
bool retKeyboard= true;
if(hHook!= 0)
{
retKeyboard= UnhookWindowsHookEx(hHook);
hHook= 0;
}
//如果去掉钩子失败.
if(!retKeyboard) throw new Exception("UnhookWindowsHookEx failed.");
}
//这里可以添加自己想要的信息处理
public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
{
if(nCode>= 0)
{
KeyBoardHookStruct kbh=(KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
if(kbh.vkCode==(int)Keys.S&&(int)Control.ModifierKeys==(int)Keys.Control)//截获F8
{
MessageBox.Show("快捷键已拦截!不能保存!");
return 1;
}
if(kbh.vkCode==(int)Keys.Y
&&(int)Control.ModifierKeys==(int)Keys.Control+(int)Keys.Alt)//截获Ctrl+Alt+Y
{
//MessageBox.Show("不能全部保存!");
return 1;
}
if(kbh.vkCode==(int)Keys.X)
{
MessageBox.Show("不能全部保存!");
return 1;
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
#endregion
public Form4()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Hook_Start();
}
private void button2_Click(object sender, EventArgs e)
{
Hook_Clear();
}
}
}
三、c******中如何调用资源文件中图标做鼠标指针
十分就想要代码,现在怎么都这么吝啬分了?风某以前诚心求问题的时候都是100分100分给。
给你个思路吧
先把资源文件中的图标取出来,这个应该不难吧。只要你写明命名空间和路径就直接能使用资源文件里的图标的。然后把图标转换成图片位图BMP,接下来直接指定给鼠标就行了
//设置鼠标函数
public void SetCursor(Bitmap cursor, Point hotPoint)
{
int hotX= hotPoint.X;
int hotY= hotPoint.Y;
Bitmap myNewCursor= new Bitmap(cursor.Width* 2- hotX, cursor.Height* 2- hotY);
Graphics g= Graphics.FromImage(myNewCursor);
g.Clear(Color.FromArgb(0, 0, 0, 0));
g.DrawImage(cursor, cursor.Width- hotX, cursor.Height- hotY, cursor.Width,
cursor.Height);
this.Cursor= new Cursor(myNewCursor.GetHicon());
g.Dispose();
myNewCursor.Dispose();
}
四、c#怎么禁用鼠标
1.要实现锁定系统不让别人用,可以调用系统锁定API函数来实现
//引入API函数
[DllImport("user32")]
public static extern bool LockWorkStation();//这个是调用windows的系统锁定
在需要的时候直接写LockWorkStation();就可以啦!不信试试看!
2.API函数锁定键盘及鼠标
[DllImport("user32.dll")]
static extern void BlockInput(bool Block);
需要的时候就直接写:
BlockInput(true);//锁定鼠标及键盘
BlockInput(false);//解除键盘鼠标锁定
但是这种方式还是不能锁定ctrl+alt+delete,也就是还可以打开任务管理器,怎么办呢?
请看下面的方法:
3.屏蔽ctrl+alt+delete
FileStream fs= new FileStream(Environment.ExpandEnvironmentVariables("%windir%\\system32\\taskmgr.exe"), FileMode.Open);
//byte[] Mybyte= new byte[(int)MyFs.Length];
//MyFs.Write(Mybyte, 0,(int)MyFs.Length);
//MyFs.Close();//用文件流打开任务管理器应用程序而不关闭文件流就会阻止打开任务管理器
利用windows锁屏API:LockWorkStation。
如下代码片段:
public Form1( bool aLock){ if(aLock){//锁屏+关屏LockWorkStation();SendMessage( this.Handle,(uint)0x0112,(IntPtr)0xF170,(IntPtr)2);} else{//禁止鼠标键盘动作+关屏BlockInput( true);System.Threading.Thread.Sleep( 10);SendMessage( this.Handle,(uint)0x0112,(IntPtr)0xF170,(IntPtr)2);BlockInput( false);} this.Close();//Application.Exit();Environment.Exit( 0);}//关屏[DllImport("user32.dll", CharSet= CharSet.Auto)] static extern IntPtr SendMessage( IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);//禁止鼠标键盘动作[return: MarshalAs( UnmanagedType.Bool)][DllImport("user32.dll", CharSet= CharSet.Auto, ExactSpelling= true)] public static extern bool BlockInput( [In, MarshalAs( UnmanagedType.Bool)] bool fBlockIt);//锁屏[DllImport("user32.dll")] public static extern bool LockWorkStation();需要指出的是,在退出程序时使用Environment.Exit( 0);而非Application.Exit();否则会出错哦~~提示类似:“***遇到错误,需要关闭”。还有就是修改一下Main:static void Main(string[] args){//Application.EnableVisualStyles();//Application.SetCompatibleTextRenderingDefault( false); if(args== null|| args.Length== 0){//禁止鼠标键盘动作+关屏Application.Run( new Form1( false));} else{//锁屏+关屏Application.Run( new Form1( true));}}