C#鉤子類 幾乎捕獲鍵盤鼠標所有事件,
- using System;
- using System.Text;
- using System.Runtime.InteropServices;
- using System.Reflection;
- using System.Windows.Forms;
-
- namespace MouseKeyboardLibrary
- {
-
- /// <summary>
- /// Abstract base class for Mouse and Keyboard hooks
- /// </summary>
- public abstract class GlobalHook
- {
-
- #region Windows API Code
-
- [StructLayout(LayoutKind.Sequential)]
- protected class POINT
- {
- public int x;
- public int y;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- protected class MouseHookStruct
- {
- public POINT pt;
- public int hwnd;
- public int wHitTestCode;
- public int dwExtraInfo;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- protected class MouseLLHookStruct
- {
- public POINT pt;
- public int mouseData;
- public int flags;
- public int time;
- public int dwExtraInfo;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- protected class KeyboardHookStruct
- {
- public int vkCode;
- public int scanCode;
- public int flags;
- public int time;
- public int dwExtraInfo;
- }
-
- [DllImport("user32.dll", CharSet = CharSet.Auto,
- CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- protected static extern int SetWindowsHookEx(
- int idHook,
- HookProc lpfn,
- IntPtr hMod,
- int dwThreadId);
-
- [DllImport("user32.dll", CharSet = CharSet.Auto,
- CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- protected static extern int UnhookWindowsHookEx(int idHook);
-
-
- [DllImport("user32.dll", CharSet = CharSet.Auto,
- CallingConvention = CallingConvention.StdCall)]
- protected static extern int CallNextHookEx(
- int idHook,
- int nCode,
- int wParam,
- IntPtr lParam);
-
- [DllImport("user32")]
- protected static extern int ToAscii(
- int uVirtKey,
- int uScanCode,
- byte[] lpbKeyState,
- byte[] lpwTransKey,
- int fuState);
-
- [DllImport("user32")]
- protected static extern int GetKeyboardState(byte[] pbKeyState);
-
- [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
- protected static extern short GetKeyState(int vKey);
-
- protected delegate int HookProc(int nCode, int wParam, IntPtr lParam);
-
- protected const int WH_MOUSE_LL = 14;
- protected const int WH_KEYBOARD_LL = 13;
-
- protected const int WH_MOUSE = 7;
- protected const int WH_KEYBOARD = 2;
- protected const int WM_MOUSEMOVE = 0x200;
- protected const int WM_LBUTTONDOWN = 0x201;
- protected const int WM_RBUTTONDOWN = 0x204;
- protected const int WM_MBUTTONDOWN = 0x207;
- protected const int WM_LBUTTONUP = 0x202;
- protected const int WM_RBUTTONUP = 0x205;
- protected const int WM_MBUTTONUP = 0x208;
- protected const int WM_LBUTTONDBLCLK = 0x203;
- protected const int WM_RBUTTONDBLCLK = 0x206;
- protected const int WM_MBUTTONDBLCLK = 0x209;
- protected const int WM_MOUSEWHEEL = 0x020A;
- protected const int WM_KEYDOWN = 0x100;
- protected const int WM_KEYUP = 0x101;
- protected const int WM_SYSKEYDOWN = 0x104;
- protected const int WM_SYSKEYUP = 0x105;
-
- protected const byte VK_SHIFT = 0x10;
- protected const byte VK_CAPITAL = 0x14;
- protected const byte VK_NUMLOCK = 0x90;
-
- protected const byte VK_LSHIFT = 0xA0;
- protected const byte VK_RSHIFT = 0xA1;
- protected const byte VK_LCONTROL = 0xA2;
- protected const byte VK_RCONTROL = 0x3;
- protected const byte VK_LALT = 0xA4;
- protected const byte VK_RALT = 0xA5;
-
- protected const byte LLKHF_ALTDOWN = 0x20;
-
- #endregion
-
- #region Private Variables
-
- protected int _hookType;
- protected int _handleToHook;
- protected bool _isStarted;
- protected HookProc _hookCallback;
-
- #endregion
-
- #region Properties
-
- public bool IsStarted
- {
- get
- {
- return _isStarted;
- }
- }
-
- #endregion
-
- #region Constructor
-
- public GlobalHook()
- {
-
- Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
-
- }
-
- #endregion
-
- #region Methods
-
- public void Start()
- {
-
- if (!_isStarted &&
- _hookType != 0)
- {
-
- // Make sure we keep a reference to this delegate!
- // If not, GC randomly collects it, and a NullReference exception is thrown
- _hookCallback = new HookProc(HookCallbackProcedure);
-
- _handleToHook = SetWindowsHookEx(
- _hookType,
- _hookCallback,
- Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),
- 0);
-
- // Were we able to sucessfully start hook?
- if (_handleToHook != 0)
- {
- _isStarted = true;
- }
-
- }
-
- }
-
- public void Stop()
- {
-
- if (_isStarted)
- {
-
- UnhookWindowsHookEx(_handleToHook);
-
- _isStarted = false;
-
- }
-
- }
-
- protected virtual int HookCallbackProcedure(int nCode, Int32 wParam, IntPtr lParam)
- {
-
- // This method must be overriden by each extending hook
- return 0;
-
- }
-
- protected void Application_ApplicationExit(object sender, EventArgs e)
- {
-
- if (_isStarted)
- {
- Stop();
- }
-
- }
-
- #endregion
-
- }
-
- }
[csharp] view plaincopyprint?
- using System;
- using System.Text;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
-
- namespace MouseKeyboardLibrary
- {
-
- /// <summary>
- /// Captures global keyboard events
- /// </summary>
- public class KeyboardHook : GlobalHook
- {
-
- #region Events
-
- public event KeyEventHandler KeyDown;
- public event KeyEventHandler KeyUp;
- public event KeyPressEventHandler KeyPress;
-
- #endregion
-
- #region Constructor
-
- public KeyboardHook()
- {
-
- _hookType = WH_KEYBOARD_LL;
-
- }
-
- #endregion
-
- #region Methods
-
- protected override int HookCallbackProcedure(int nCode, int wParam, IntPtr lParam)
- {
-
- bool handled = false;
-
- if (nCode > -1 && (KeyDown != null || KeyUp != null || KeyPress != null))
- {
-
- KeyboardHookStruct keyboardHookStruct =
- (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
-
- // Is Control being held down?
- bool control = ((GetKeyState(VK_LCONTROL) & 0x80) != 0) ||
- ((GetKeyState(VK_RCONTROL) & 0x80) != 0);
-
- // Is Shift being held down?
- bool shift = ((GetKeyState(VK_LSHIFT) & 0x80) != 0) ||
- ((GetKeyState(VK_RSHIFT) & 0x80) != 0);
-
- // Is Alt being held down?
- bool alt = ((GetKeyState(VK_LALT) & 0x80) != 0) ||
- ((GetKeyState(VK_RALT) & 0x80) != 0);
-
- // Is CapsLock on?
- bool capslock = (GetKeyState(VK_CAPITAL) != 0);
-
- // Create event using keycode and control/shift/alt values found above
- KeyEventArgs e = new KeyEventArgs(
- (Keys)(
- keyboardHookStruct.vkCode |
- (control ? (int)Keys.Control : 0) |
- (shift ? (int)Keys.Shift : 0) |
- (alt ? (int)Keys.Alt : 0)
- ));
-
- // Handle KeyDown and KeyUp events
- switch (wParam)
- {
-
- case WM_KEYDOWN:
- case WM_SYSKEYDOWN:
- if (KeyDown != null)
- {
- KeyDown(this, e);
- handled = handled || e.Handled;
- }
- break;
- case WM_KEYUP:
- case WM_SYSKEYUP:
- if (KeyUp != null)
- {
- KeyUp(this, e);
- handled = handled || e.Handled;
- }
- break;
-
- }
-
- // Handle KeyPress event
- if (wParam == WM_KEYDOWN &&
- !handled &&
- !e.SuppressKeyPress &&
- KeyPress != null)
- {
-
- byte[] keyState = new byte[256];
- byte[] inBuffer = new byte[2];
- GetKeyboardState(keyState);
-
- if (ToAscii(keyboardHookStruct.vkCode,
- keyboardHookStruct.scanCode,
- keyState,
- inBuffer,
- keyboardHookStruct.flags) == 1)
- {
-
- char key = (char)inBuffer[0];
- if ((capslock ^ shift) && Char.IsLetter(key))
- key = Char.ToUpper(key);
- KeyPressEventArgs e2 = new KeyPressEventArgs(key);
- KeyPress(this, e2);
- handled = handled || e.Handled;
-
- }
-
- }
-
- }
-
- if (handled)
- {
- return 1;
- }
- else
- {
- return CallNextHookEx(_handleToHook, nCode, wParam, lParam);
- }
-
- }
-
- #endregion
-
- }
-
- }
[csharp] view plaincopyprint?
- using System;
- using System.Text;
- using System.Runtime.InteropServices;
- using System.Windows.Forms;
-
- namespace MouseKeyboardLibrary
- {
-
- /// <summary>
- /// Standard Keyboard Shortcuts used by most applications
- /// </summary>
- public enum StandardShortcut
- {
- Copy,
- Cut,
- Paste,
- SelectAll,
- Save,
- Open,
- New,
- Close,
- Print
- }
-
- /// <summary>
- /// Simulate keyboard key presses
- /// </summary>
- public static class KeyboardSimulator
- {
-
- #region Windows API Code
-
- const int KEYEVENTF_EXTENDEDKEY = 0x1;
- const int KEYEVENTF_KEYUP = 0x2;
-
- [DllImport("user32.dll")]
- static extern void keybd_event(byte key, byte scan, int flags, int extraInfo);
-
- #endregion
-
- #region Methods
-
- public static void KeyDown(Keys key)
- {
- keybd_event(ParseKey(key), 0, 0, 0);
- }
-
- public static void KeyUp(Keys key)
- {
- keybd_event(ParseKey(key), 0, KEYEVENTF_KEYUP, 0);
- }
-
- public static void KeyPress(Keys key)
- {
- KeyDown(key);
- KeyUp(key);
- }
-
- public static void SimulateStandardShortcut(StandardShortcut shortcut)
- {
- switch (shortcut)
- {
- case StandardShortcut.Copy:
- KeyDown(Keys.Control);
- KeyPress(Keys.C);
- KeyUp(Keys.Control);
- break;
- case StandardShortcut.Cut:
- KeyDown(Keys.Control);
- KeyPress(Keys.X);
- KeyUp(Keys.Control);
- break;
- case StandardShortcut.Paste:
- KeyDown(Keys.Control);
- KeyPress(Keys.V);
- KeyUp(Keys.Control);
- break;
- case StandardShortcut.SelectAll:
- KeyDown(Keys.Control);
- KeyPress(Keys.A);
- KeyUp(Keys.Control);
- break;
- case StandardShortcut.Save:
- KeyDown(Keys.Control);
- KeyPress(Keys.S);
- KeyUp(Keys.Control);
- break;
- case StandardShortcut.Open:
- KeyDown(Keys.Control);
- KeyPress(Keys.O);
- KeyUp(Keys.Control);
- break;
- case StandardShortcut.New:
- KeyDown(Keys.Control);
- KeyPress(Keys.N);
- KeyUp(Keys.Control);
- break;
- case StandardShortcut.Close:
- KeyDown(Keys.Alt);
- KeyPress(Keys.F4);
- KeyUp(Keys.Alt);
- break;
- case StandardShortcut.Print:
- KeyDown(Keys.Control);
- KeyPress(Keys.P);
- KeyUp(Keys.Control);
- break;
- }
- }
-
- static byte ParseKey(Keys key)
- {
-
- // Alt, Shift, and Control need to be changed for API function to work with them
- switch (key)
- {
- case Keys.Alt:
- return (byte)18;
- case Keys.Control:
- return (byte)17;
- case Keys.Shift:
- return (byte)16;
- default:
- return (byte)key;
- }
-
- }
-
- #endregion
-
- }
-
- }
[csharp] view plaincopyprint?
- using System;
- using System.Text;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
-
- namespace MouseKeyboardLibrary
- {
-
- /// <summary>
- /// Captures global mouse events
- /// </summary>
- public class MouseHook : GlobalHook
- {
-
- #region MouseEventType Enum
-
- private enum MouseEventType
- {
- None,
- MouseDown,
- MouseUp,
- DoubleClick,
- MouseWheel,
- MouseMove
- }
-
- #endregion
-
- #region Events
-
- public event MouseEventHandler MouseDown;
- public event MouseEventHandler MouseUp;
- public event MouseEventHandler MouseMove;
- public event MouseEventHandler MouseWheel;
-
- public event EventHandler Click;
- public event EventHandler DoubleClick;
-
- #endregion
-
- #region Constructor
-
- public MouseHook()
- {
-
- _hookType = WH_MOUSE_LL;
-
- }
-
- #endregion
-
- #region Methods
-
- protected override int HookCallbackProcedure(int nCode, int wParam, IntPtr lParam)
- {
-
- if (nCode > -1 && (MouseDown != null || MouseUp != null || MouseMove != null))
- {
-
- MouseLLHookStruct mouseHookStruct =
- (MouseLLHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseLLHookStruct));
-
- MouseButtons button = GetButton(wParam);
- MouseEventType eventType = GetEventType(wParam);
-
- MouseEventArgs e = new MouseEventArgs(
- button,
- (eventType == MouseEventType.DoubleClick ? 2 : 1),
- mouseHookStruct.pt.x,
- mouseHookStruct.pt.y,
- (eventType == MouseEventType.MouseWheel ? (short)((mouseHookStruct.mouseData >> 16) & 0xffff) : 0));
-
- // Prevent multiple Right Click events (this probably happens for popup menus)
- if (button == MouseButtons.Right && mouseHookStruct.flags != 0)
- {
- eventType = MouseEventType.None;
- }
-
- switch (eventType)
- {
- case MouseEventType.MouseDown:
- if (MouseDown != null)
- {
- MouseDown(this, e);
- }
- break;
- case MouseEventType.MouseUp:
- if (Click != null)
- {
- Click(this, new EventArgs());
- }
- if (MouseUp != null)
- {
- MouseUp(this, e);
- }
- break;
- case MouseEventType.DoubleClick:
- if (DoubleClick != null)
- {
- DoubleClick(this, new EventArgs());
- }
- break;
- case MouseEventType.MouseWheel:
- if (MouseWheel != null)
- {
- MouseWheel(this, e);
- }
- break;
- case MouseEventType.MouseMove:
- if (MouseMove != null)
- {
- MouseMove(this, e);
- }
- break;
- default:
- break;
- }
-
- }
-
- return CallNextHookEx(_handleToHook, nCode, wParam, lParam);
-
- }
-
- private MouseButtons GetButton(Int32 wParam)
- {
-
- switch (wParam)
- {
-
- case WM_LBUTTONDOWN:
- case WM_LBUTTONUP:
- case WM_LBUTTONDBLCLK:
- return MouseButtons.Left;
- case WM_RBUTTONDOWN:
- case WM_RBUTTONUP:
- case WM_RBUTTONDBLCLK:
- return MouseButtons.Right;
- case WM_MBUTTONDOWN:
- case WM_MBUTTONUP:
- case WM_MBUTTONDBLCLK:
- return MouseButtons.Middle;
- default:
- return MouseButtons.None;
-
- }
-
- }
-
- private MouseEventType GetEventType(Int32 wParam)
- {
-
- switch (wParam)
- {
-
- case WM_LBUTTONDOWN:
- case WM_RBUTTONDOWN:
- case WM_MBUTTONDOWN:
- return MouseEventType.MouseDown;
- case WM_LBUTTONUP:
- case WM_RBUTTONUP:
- case WM_MBUTTONUP:
- return MouseEventType.MouseUp;
- case WM_LBUTTONDBLCLK:
- case WM_RBUTTONDBLCLK:
- case WM_MBUTTONDBLCLK:
- return MouseEventType.DoubleClick;
- case WM_MOUSEWHEEL:
- return MouseEventType.MouseWheel;
- case WM_MOUSEMOVE:
- return MouseEventType.MouseMove;
- default:
- return MouseEventType.None;
-
- }
- }
-
- #endregion
-
- }
-
- }
[csharp] view plaincopyprint?
- using System;
- using System.Text;
- using System.Runtime.InteropServices;
- using System.Drawing;
- using System.Windows.Forms;
-
- namespace MouseKeyboardLibrary
- {
-
- /// <summary>
- /// And X, Y point on the screen
- /// </summary>
- public struct MousePoint
- {
-
- public MousePoint(Point p)
- {
- X = p.X;
- Y = p.Y;
- }
-
- public int X;
- public int Y;
-
- public static implicit operator Point(MousePoint p)
- {
- return new Point(p.X, p.Y);
- }
-
- }
-
- /// <summary>
- /// Mouse buttons that can be pressed
- /// </summary>
- public enum MouseButton
- {
- Left = 0x2,
- Right = 0x8,
- Middle = 0x20
- }
-
- /// <summary>
- /// Operations that simulate mouse events
- /// </summary>
- public static class MouseSimulator
- {
-
- #region Windows API Code
-
- [DllImport("user32.dll")]
- static extern int ShowCursor(bool show);
-
- [DllImport("user32.dll")]
- static extern void mouse_event(int flags, int dX, int dY, int buttons, int extraInfo);
-
- const int MOUSEEVENTF_MOVE = 0x1;
- const int MOUSEEVENTF_LEFTDOWN = 0x2;
- const int MOUSEEVENTF_LEFTUP = 0x4;
- const int MOUSEEVENTF_RIGHTDOWN = 0x8;
- const int MOUSEEVENTF_RIGHTUP = 0x10;
- const int MOUSEEVENTF_MIDDLEDOWN = 0x20;
- const int MOUSEEVENTF_MIDDLEUP = 0x40;
- const int MOUSEEVENTF_WHEEL = 0x800;
- const int MOUSEEVENTF_ABSOLUTE = 0x8000;
-
- #endregion
-
- #region Properties
-
- /// <summary>
- /// Gets or sets a structure that represents both X and Y mouse coordinates
- /// </summary>
- public static MousePoint Position
- {
- get
- {
- return new MousePoint(Cursor.Position);
- }
- set
- {
- Cursor.Position = value;
- }
- }
-
- /// <summary>
- /// Gets or sets only the mouse's x coordinate
- /// </summary>
- public static int X
- {
- get
- {
- return Cursor.Position.X;
- }
- set
- {
- Cursor.Position = new Point(value, Y);
- }
- }
-
- /// <summary>
- /// Gets or sets only the mouse's y coordinate
- /// </summary>
- public static int Y
- {
- get
- {
- return Cursor.Position.Y;
- }
- set
- {
- Cursor.Position = new Point(X, value);
- }
- }
-
- #endregion
-
- #region Methods
-
- /// <summary>
- /// Press a mouse button down
- /// </summary>
- /// <param name="button"></param>
- public static void MouseDown(MouseButton button)
- {
- mouse_event(((int)button), 0, 0, 0, 0);
- }
-
- public static void MouseDown(MouseButtons button)
- {
- switch (button)
- {
- case MouseButtons.Left:
- MouseDown(MouseButton.Left);
- break;
- case MouseButtons.Middle:
- MouseDown(MouseButton.Middle);
- break;
- case MouseButtons.Right:
- MouseDown(MouseButton.Right);
- break;
- }
- }
-
- /// <summary>
- /// Let a mouse button up
- /// </summary>
- /// <param name="button"></param>
- public static void MouseUp(MouseButton button)
- {
- mouse_event(((int)button) * 2, 0, 0, 0, 0);
- }
-
- public static void MouseUp(MouseButtons button)
- {
- switch (button)
- {
- case MouseButtons.Left:
- MouseUp(MouseButton.Left);
- break;
- case MouseButtons.Middle:
- MouseUp(MouseButton.Middle);
- break;
- case MouseButtons.Right:
- MouseUp(MouseButton.Right);
- break;
- }
- }
-
- /// <summary>
- /// Click a mouse button (down then up)
- /// </summary>
- /// <param name="button"></param>
- public static void Click(MouseButton button)
- {
- MouseDown(button);
- MouseUp(button);
- }
-
- public static void Click(MouseButtons button)
- {
- switch (button)
- {
- case MouseButtons.Left:
- Click(MouseButton.Left);
- break;
- case MouseButtons.Middle:
- Click(MouseButton.Middle);
- break;
- case MouseButtons.Right:
- Click(MouseButton.Right);
- break;
- }
- }
-
- /// <summary>
- /// Double click a mouse button (down then up twice)
- /// </summary>
- /// <param name="button"></param>
- public static void DoubleClick(MouseButton button)
- {
- Click(button);
- Click(button);
- }
-
- public static void DoubleClick(MouseButtons button)
- {
- switch (button)
- {
- case MouseButtons.Left:
- DoubleClick(MouseButton.Left);
- break;
- case MouseButtons.Middle:
- DoubleClick(MouseButton.Middle);
- break;
- case MouseButtons.Right:
- DoubleClick(MouseButton.Right);
- break;
- }
- }
-
- /// <summary>
- /// Show a hidden current on currently application
- /// </summary>
- public static void Show()
- {
- ShowCursor(true);
- }
-
- /// <summary>
- /// Hide mouse cursor only on current application's forms
- /// </summary>
- public static void Hide()
- {
- ShowCursor(false);
- }
-
- #endregion
-
- }
-
- }
[csharp] view plaincopyprint?
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
-
- using MouseKeyboardLibrary;
-
- namespace SampleApplication
- {
- /*
- 上面的5個類編譯成Dll引用,使用例子
- */
- public partial class HookTestForm : Form
- {
-
- MouseHook mouseHook = new MouseHook();
- KeyboardHook keyboardHook = new KeyboardHook();
-
- public HookTestForm()
- {
- InitializeComponent();
- }
-
- private void TestForm_Load(object sender, EventArgs e)
- {
-
- mouseHook.MouseMove += new MouseEventHandler(mouseHook_MouseMove);
- mouseHook.MouseDown += new MouseEventHandler(mouseHook_MouseDown);
- mouseHook.MouseUp += new MouseEventHandler(mouseHook_MouseUp);
- mouseHook.MouseWheel += new MouseEventHandler(mouseHook_MouseWheel);
-
- keyboardHook.KeyDown += new KeyEventHandler(keyboardHook_KeyDown);
- keyboardHook.KeyUp += new KeyEventHandler(keyboardHook_KeyUp);
- keyboardHook.KeyPress += new KeyPressEventHandler(keyboardHook_KeyPress);
-
- mouseHook.Start();
- keyboardHook.Start();
-
- SetXYLabel(MouseSimulator.X, MouseSimulator.Y);
-
- }
-
- void keyboardHook_KeyPress(object sender, KeyPressEventArgs e)
- {
-
- AddKeyboardEvent(
- "KeyPress",
- "",
- e.KeyChar.ToString(),
- "",
- "",
- ""
- );
-
- }
-
- void keyboardHook_KeyUp(object sender, KeyEventArgs e)
- {
-
- AddKeyboardEvent(
- "KeyUp",
- e.KeyCode.ToString(),
- "",
- e.Shift.ToString(),
- e.Alt.ToString(),
- e.Control.ToString()
- );
-
- }
-
- void keyboardHook_KeyDown(object sender, KeyEventArgs e)
- {
-
-
- AddKeyboardEvent(
- "KeyDown",
- e.KeyCode.ToString(),
- "",
- e.Shift.ToString(),
- e.Alt.ToString(),
- e.Control.ToString()
- );
-
- }
-
- void mouseHook_MouseWheel(object sender, MouseEventArgs e)
- {
-
- AddMouseEvent(
- "MouseWheel",
- "",
- "",
- "",
- e.Delta.ToString()
- );
-
- }
-
- void mouseHook_MouseUp(object sender, MouseEventArgs e)
- {
-
-
- AddMouseEvent(
- "MouseUp",
- e.Button.ToString(),
- e.X.ToString(),
- e.Y.ToString(),
- ""
- );
-
- }
-
- void mouseHook_MouseDown(object sender, MouseEventArgs e)
- {
-
-
- AddMouseEvent(
- "MouseDown",
- e.Button.ToString(),
- e.X.ToString(),
- e.Y.ToString(),
- ""
- );
-
-
- }
-
- void mouseHook_MouseMove(object sender, MouseEventArgs e)
- {
-
- SetXYLabel(e.X, e.Y);
-
- }
-
- void SetXYLabel(int x, int y)
- {
-
- curXYLabel.Text = String.Format("Current Mouse Point: X={0}, y={1}", x, y);
-
- }
-
- void AddMouseEvent(string eventType, string button, string x, string y, string delta)
- {
-
- listView1.Items.Insert(0,
- new ListViewItem(
- new string[]{
- eventType,
- button,
- x,
- y,
- delta
- }));
-
- }
-
- void AddKeyboardEvent(string eventType, string keyCode, string keyChar, string shift, string alt, string control)
- {
-
- listView2.Items.Insert(0,
- new ListViewItem(
- new string[]{
- eventType,
- keyCode,
- keyChar,
- shift,
- alt,
- control
- }));
-
- }
-
- private void TestForm_FormClosed(object sender, FormClosedEventArgs e)
- {
-
- // Not necessary anymore, will stop when application exits
-
- //mouseHook.Stop();
- //keyboardHook.Stop();
-
- }
-
-
- }
- }
一個C語言冒泡排序法的簡單程序
main()
{
int i,j,temp;
int a[10];
for(i=0;i<10;i++)
scanf ("%d,",&a[i]);
for(j=0;j<=9;j++)
{ for (i=0;i<10-j;i++)
if (a[i]>a[i+1])
{ temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;}
}
for(i=1;i<11;i++)
printf("%5d,",a[i] );
printf("\n");
}
--------------
冒泡算法
冒泡排序的算法分析與改進
交換排序的基本思想是:兩兩比較待排序記錄的關鍵字,發現兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。
應用交換排序基本思想的主要排序方法有:冒泡排序和快速排序。
冒泡排序
1、排序方法
將被排序的記錄數組R[1..n]垂直排列,每個記錄R看作是重量為R.key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃描數組R:凡掃描到違反本原則的輕氣泡,就使其向上"飄浮"。如此反復進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。
(1)初始
R[1..n]為無序區。
(2)第一趟掃描
從無序區底部向上依次比較相鄰的兩個氣泡的重量,若發現輕者在下、重者在上,則交換二者的位置。即依次比較(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);對於每對氣泡(R[j+1],R[j]),若R[j+1].key<R[j].key,則交換R[j+1]和R[j]的內容。
第一趟掃描完畢時,"最輕"的氣泡就飄浮到該區間的頂部,即關鍵字最小的記錄被放在最高位置R[1]上。
(3)第二趟掃描
掃描R[2..n]。掃描完畢時,"次輕"的氣泡飄浮到R[2]的位置上……
最後,經過n-1 趟掃描可得到有序區R[1..n]
注意:
第i趟掃描時,R[1..i-1]和R[i..n]分別為當前的有序區和無序區。掃描仍是從無序區底部向上直至該區頂部。掃描完畢時,該區中最輕氣泡飄浮到頂部位置R上,結果是R[1..i]變為新的有序區。
2、冒泡排序過程示例
對關鍵字序列為49 38 65 97 76 13 27 49的文件進行冒泡排序的過程
3、排序算法
(1)分析
因為每一趟排序都使有序區增加了一個氣泡,在經過n-1趟排序之後,有序區中就有n-1個氣泡,而無序區中氣泡的重量總是大於等於有序區中氣泡的重量,所以整個冒泡排序過程至多需要進行n-1趟排序。
若在某一趟排序中未發現氣泡位置的交換,則說明待排序的無序區中所有氣泡均滿足輕者在上,重者在下的原則,因此,冒泡排序過程可在此趟排序後終止。為此,在下面給出的算法中,引入一個布爾量exchange,在每趟排序開始前,先將其置為FALSE。若排序過程中發生了交換,則將其置為TRUE。各趟排序結束時檢查exchange,若未曾發生過交換則終止算法,不再進行下一趟排序。
(2)具體算法
void BubbleSort(SeqList R)
{ //R(l..n)是待排序的文件,采用自下向上掃描,對R做冒泡排序
int i,j;
Boolean exchange; //交換標志
for(i=1;i&......余下全文>>
一個C語言冒泡排序法的簡單程序
main()
{
int i,j,temp;
int a[10];
for(i=0;i<10;i++)
scanf ("%d,",&a[i]);
for(j=0;j<=9;j++)
{ for (i=0;i<10-j;i++)
if (a[i]>a[i+1])
{ temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;}
}
for(i=1;i<11;i++)
printf("%5d,",a[i] );
printf("\n");
}
--------------
冒泡算法
冒泡排序的算法分析與改進
交換排序的基本思想是:兩兩比較待排序記錄的關鍵字,發現兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。
應用交換排序基本思想的主要排序方法有:冒泡排序和快速排序。
冒泡排序
1、排序方法
將被排序的記錄數組R[1..n]垂直排列,每個記錄R看作是重量為R.key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃描數組R:凡掃描到違反本原則的輕氣泡,就使其向上"飄浮"。如此反復進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。
(1)初始
R[1..n]為無序區。
(2)第一趟掃描
從無序區底部向上依次比較相鄰的兩個氣泡的重量,若發現輕者在下、重者在上,則交換二者的位置。即依次比較(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);對於每對氣泡(R[j+1],R[j]),若R[j+1].key<R[j].key,則交換R[j+1]和R[j]的內容。
第一趟掃描完畢時,"最輕"的氣泡就飄浮到該區間的頂部,即關鍵字最小的記錄被放在最高位置R[1]上。
(3)第二趟掃描
掃描R[2..n]。掃描完畢時,"次輕"的氣泡飄浮到R[2]的位置上……
最後,經過n-1 趟掃描可得到有序區R[1..n]
注意:
第i趟掃描時,R[1..i-1]和R[i..n]分別為當前的有序區和無序區。掃描仍是從無序區底部向上直至該區頂部。掃描完畢時,該區中最輕氣泡飄浮到頂部位置R上,結果是R[1..i]變為新的有序區。
2、冒泡排序過程示例
對關鍵字序列為49 38 65 97 76 13 27 49的文件進行冒泡排序的過程
3、排序算法
(1)分析
因為每一趟排序都使有序區增加了一個氣泡,在經過n-1趟排序之後,有序區中就有n-1個氣泡,而無序區中氣泡的重量總是大於等於有序區中氣泡的重量,所以整個冒泡排序過程至多需要進行n-1趟排序。
若在某一趟排序中未發現氣泡位置的交換,則說明待排序的無序區中所有氣泡均滿足輕者在上,重者在下的原則,因此,冒泡排序過程可在此趟排序後終止。為此,在下面給出的算法中,引入一個布爾量exchange,在每趟排序開始前,先將其置為FALSE。若排序過程中發生了交換,則將其置為TRUE。各趟排序結束時檢查exchange,若未曾發生過交換則終止算法,不再進行下一趟排序。
(2)具體算法
void BubbleSort(SeqList R)
{ //R(l..n)是待排序的文件,采用自下向上掃描,對R做冒泡排序
int i,j;
Boolean exchange; //交換標志
for(i=1;i&......余下全文>>