2015-09-06 2 views
-1

Я хочу, чтобы моя форма frmMainMenu была отключена. первое, что я сделал, это установить его на maximized и удалить minimize & maximize на управление. Когда я перетаскиваю форму автоматически minimized, также когда я дважды щелкаю controlBox, это также minimize. Я также хочу, чтобы форма предотвращала movement. и, наконец, я хочу отключить alt + tab на моей форме.Предотвращение формы для совершения действий

У меня есть код для отключения движения.

protected override void WndProc(ref Message message) 
    { 
     const int WM_SYSCOMMAND = 0x0112; 
     const int SC_MOVE = 0xF010; 
     switch (message.Msg) 
     { 
      case WM_SYSCOMMAND: 
       int command = message.WParam.ToInt32() & 0xfff0; 
       if (command == SC_MOVE) 
        return; 
       break; 
     } 

     base.WndProc(ref message); 
    } 

здесь для двойного щелчка

private const int WM_NCLBUTTONDBLCLK = 0x00A3; 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_NCLBUTTONDBLCLK) 
     { 
      m.Result = IntPtr.Zero; 
      return; 
     } 
     base.WndProc(ref m); 
    } 

я не имею код для drag и alt + tab и я не могу поместить эти два в моей форме, поскольку имеют один и тот же параметр WndProc.

+0

Disable, что 'питания'? Быть конкретной. –

+0

что конкретно? отключить перетаскивание, дважды щелкнуть, Alt + Tab и предотвратить движение? – anjohnnette

+0

По крайней мере, не очень понятно. Проверьте http://stackoverflow.com/questions/704564/disable-drag-and-drop-on-html-elements –

ответ

0

Выполните следующие шаги:

  1. Создать Form
  2. Набор FormBorderStyle для FixedSingle
  3. Установите MinimizeBox в false
  4. Установите MaximizeBox в false
  5. Установите TopMost в true
  6. Ручка Load, FormClosing и DeActivate событий вашей формы.
  7. Запишите этот код в класс формы:

Код:

public partial class Form1: Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    // Structure contain information about low-level keyboard input event 
    [StructLayout(LayoutKind.Sequential)] 
    private struct KBDLLHOOKSTRUCT 
    { 
     public Keys key; 
     public int scanCode; 
     public int flags; 
     public int time; 
     public IntPtr extra; 
    } 
    //System level functions to be used for hook and unhook keyboard input 
    private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr SetWindowsHookEx(int id, LowLevelKeyboardProc callback, IntPtr hMod, uint dwThreadId); 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern bool UnhookWindowsHookEx(IntPtr hook); 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr CallNextHookEx(IntPtr hook, int nCode, IntPtr wp, IntPtr lp); 
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr GetModuleHandle(string name); 
    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    private static extern short GetAsyncKeyState(Keys key); 
    //Declaring Global objects  
    private IntPtr ptrHook; 
    private LowLevelKeyboardProc objKeyboardProcess; 

    private IntPtr captureKey(int nCode, IntPtr wp, IntPtr lp) 
    { 
     if (nCode >= 0) 
     { 
      KBDLLHOOKSTRUCT objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lp, typeof(KBDLLHOOKSTRUCT)); 

      // Disabling Windows keys 

      if (objKeyInfo.key == Keys.RWin || objKeyInfo.key == Keys.LWin || objKeyInfo.key == Keys.Tab && HasAltModifier(objKeyInfo.flags) || objKeyInfo.key == Keys.Escape && (ModifierKeys & Keys.Control) == Keys.Control) 
      { 
       return (IntPtr)1; // if 0 is returned then All the above keys will be enabled 
      } 
     } 
     return CallNextHookEx(ptrHook, nCode, wp, lp); 
    } 

    bool HasAltModifier(int flags) 
    { 
     return (flags & 0x20) == 0x20; 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     ProcessModule objCurrentModule = Process.GetCurrentProcess().MainModule; 
     objKeyboardProcess = new LowLevelKeyboardProc(captureKey); 
     ptrHook = SetWindowsHookEx(13, objKeyboardProcess, GetModuleHandle(objCurrentModule.ModuleName), 0); 
    } 
    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     e.Cancel = true; 
    } 

    protected override void WndProc(ref Message message) 
    { 
     const int WM_SYSCOMMAND = 0x0112; 
     const int SC_MOVE = 0xF010; 

     switch (message.Msg) 
     { 
      case WM_SYSCOMMAND: 
       int command = message.WParam.ToInt32() & 0xfff0; 
       if (command == SC_MOVE) 
        return; 
       break; 
     } 

     base.WndProc(ref message); 
    } 
    private void Form1_Deactivate(object sender, EventArgs e) 
    { 
     this.Activate(); 
    } 
} 

Примечания:

  • Код для отключения Win и Alt + Вкладка взято с this post, благодаря автору.

  • Код для предотвращения перемещения, взятый с this post, благодаря автору.

  • Не Forgt добавить usings:

Usings:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Diagnostics; 
using System.Drawing; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
+0

alt + tab не работает 'marshal' не существует,' process' не существует, 'DllImport' coul не найден и т. Д. Также я не могу добавить' WndProc', потому что у меня есть 2 одного типа, как я должен присоединиться к этим трем вместе ? – anjohnnette

+0

@anjohnnette Рад слышать, что это сработало. Забавно, что, когда я тестировал, чтобы опубликовать изменения, которые вы просили в предыдущем комментарии, форма оставалась сверху в максимизированном состоянии, и я не мог избавиться от нее, и, наконец, я перезапустил свой ноутбук с помощью кнопки питания! :)) –

+0

haha ​​sorry :) i remove 'e.cancel = true', чтобы я мог использовать кнопку x на' controlbox' – anjohnnette

Смежные вопросы