Подписка на события от нажатия мыши всех средств управления в форме

На рубиновом языке у нас есть метод как rand(). Можно генерировать случайное число с помощью этого метода. rand() метод будет иметь только целочисленный аргумент или диапазон. Тип возврата этого метода является случайным целым числом.

 rand()          # This Will generates a random number between 0.0 to 1.0
 rand(10)        # This Will generates a number between 0 to 10
 rand(1 .. 9)    # This Will generates a number between 1 to 10
 rand(1 ... 10)  # This Will generates a number between 2 to 9

ПРИМЕЧАНИЕ: числа, произведенные rand(), достаточно для простые приложения.

, Но если Вам нужен он в целях безопасности, как генерация одноразового пароля, создавая маркеры сброса пароля, тогда необходимо использовать одну из части библиотеки стандарта Ruby, которая является SecureRandom.

require 'securerandom'

SecureRandom.random_number
=> 0.232

SecureRandom.random_number(100)
=> 72

SecureRandom.hex
=> "87694e9e5231aba6ssdfs3de39c58cdfbe307"
6
задан Gal Shadeck 3 September 2009 в 09:25
поделиться

2 ответа

Решение 1

Подписка на каждое событие в каждом элементе управления в форме, безусловно, самый простейший подход, поскольку вы просто используете код, предоставленный Рамешем.

Однако другой метод включает в себя переопределение метода обработки сообщений Windows по умолчанию («WndProc») в родительском элементе управления - в данном случае в форме, содержащей все элементы управления. Это имеет побочный эффект, который вы не сможете обнаружить, когда курсор мыши перемещается по элементам управления, содержащимся внутри другого родительского элемента управления.

Например, вы не сможете определить, когда курсор мыши находится над TextBox , который содержится внутри TabControl . Это связано с тем, что TabControl будет продолжать обрабатывать все события мыши.

Решение 2

Следующее решение преодолеет все проблемы при попытке определить, какой элемент управления находится над курсором мыши, используя метод, известный как хуки окон .

хуки по существу позволяют нам улавливать события мыши и клавиатуры даже до того, как они будут отправлены в окно с фокусом.

Вот пример:

  public enum HookType : int
  {
   WH_JOURNALRECORD = 0,
   WH_JOURNALPLAYBACK = 1,
   WH_KEYBOARD = 2,
   WH_GETMESSAGE = 3,
   WH_CALLWNDPROC = 4,
   WH_CBT = 5,
   WH_SYSMSGFILTER = 6,
   WH_MOUSE = 7,
   WH_HARDWARE = 8,
   WH_DEBUG = 9,
   WH_SHELL = 10,
   WH_FOREGROUNDIDLE = 11,
   WH_CALLWNDPROCRET = 12,
   WH_KEYBOARD_LL = 13,
   WH_MOUSE_LL = 14
  }

  [StructLayout(LayoutKind.Sequential)]
  public struct POINT
  {
   public int X;
   public int Y;
  }

  [StructLayout(LayoutKind.Sequential)]
  public struct MouseHookStruct
  {
   public POINT pt;
   public int hwnd;
   public int hitTestCode;
   public int dwExtraInfo;
  }

  [DllImport("user32.dll", SetLastError = true)]
  static extern int SetWindowsHookEx(HookType hook, HookProc callback, IntPtr hInstance, uint dwThreadId);

  [DllImport("user32.dll", SetLastError= true)]
  static extern int CallNextHookEx(int hook,  int code, IntPtr wParam, IntPtr lParam);

  [DllImport("kernel32.dll")]
  static extern int GetLastError();

  [DllImport("kernel32.dll")]
  static extern int GetCurrentThreadId();

  public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
  private static int hHook;

  public Form1()
  {
   InitializeComponent();

   hHook = SetWindowsHookEx(HookType.WH_MOUSE, MouseHookProc, IntPtr.Zero, (uint)GetCurrentThreadId());
   if (hHook == 0)
    MessageBox.Show("GetLastError: " + GetLastError());
  }

  private int MouseHookProc(int code, IntPtr wParam, IntPtr lParam)
  {
   //Marshall the data from the callback.
   MouseHookStruct mouseInfo = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));

   if (code < 0)
   {
    return CallNextHookEx(hHook, code, wParam, lParam);
   }
   else
   {
    //Create a string variable that shows the current mouse coordinates.
    String strCaption = "x = " + mouseInfo.pt.X.ToString("d") +
     "  y = " + mouseInfo.pt.Y.ToString("d");

    //You must get the active form because it is a static function.
    Form tempForm = Form.ActiveForm;

    Control c = Control.FromHandle((IntPtr)mouseInfo.hwnd);
    if (c != null)
     label1.Text = c.Name;
    else
     label1.Text = "Control not found";

    //Set the caption of the form.
    tempForm.Text = strCaption;

    return CallNextHookEx(hHook, code, wParam, lParam);
   }
  }
1
ответ дан 17 December 2019 в 07:07
поделиться

Другие элементы управления в форме не могут прослушивать обработчики событий Mouse формы. Поскольку у каждого элемента управления есть свои собственные списки событий мыши.

Но вы можете подписать события мыши каждого элемента управления на события мыши форм

this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MDown);    
this.label1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MDown); 
this.ListBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MDown);

, таким образом у вас может быть один обработчик для всех событий мыши элементов управления.

1
ответ дан 17 December 2019 в 07:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: