Как заблокировать / разблокировать форму приложения Windows в C # - PullRequest
2 голосов
/ 15 сентября 2010

Мне нужно заблокировать всю форму, если выполняется процесс перикулярной линии.

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

Теперь я использую два метода из user32.dll

    [DllImport("user32.dll")]
    public static extern IntPtr FindWindow(String sClassName, String sAppName);

    [DllImport("user32.dll")]
    public static extern bool EnableWindow(IntPtr hwnd, bool bEnable);

, но он не работает должным образом.

Есть ли другая идея сделать это

Заранее спасибо

Ответы [ 4 ]

13 голосов
/ 15 сентября 2010

Что вы имеете в виду с замком?

Если вы хотите запретить пользователю вводить данные, вы можете установить

this.Enabled = false;

в основной форме, которая также отключит все дочерние элементы управления.

Решением для предотвращения возникновения событий является применение фильтра сообщений: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.addmessagefilter.aspx и перехват левой кнопки мыши.

// Creates a  message filter.
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public class TestMessageFilter : IMessageFilter
{
    public bool PreFilterMessage(ref Message m)
    {
        // Blocks all the messages relating to the left mouse button.
        if (m.Msg >= 513 && m.Msg <= 515)
        {
            Console.WriteLine("Processing the messages : " + m.Msg);
            return true;
        }
        return false;
    }
}


public void SomeMethod()
{

    this.Cursor = Cursors.WaitCursor;
    this.Enabled = false;
    Application.AddMessageFilter(new TestMessageFilter(this));

    try
    {
        Threading.Threat.Sleep(10000);
    }
    finally
    {
        Application.RemoveMessageFilter(new TestMessageFilter(this));
        this.Enabled = true;
        this.Cursor = Cursors.Default;
    }


}
4 голосов
/ 15 сентября 2010
Form.Enabled = false;

Не работает?

2 голосов
/ 16 сентября 2010

this.Enable = false;Thread.Sleep (5000);this.Enable = true;

Выполнение обработки в потоке графического интерфейса является плохой практикой, вам следует использовать BackgroundWorker.

Быстрое и грязное исправление - вызов1008 * перед включением формы.

this.Enable=false; Thread.Sleep(5000); Application.DoEvents(); this.Enable=true;
2 голосов
/ 15 сентября 2010

Если для свойства элемента управления установлено значение false, взаимодействие с этим элементом управления и всех его дочерних элементов отключено. Вы можете использовать это в своем сценарии, поместив все элементы управления в родительский объект ContainerControl и установив его Enabled = false.

На самом деле у вас уже есть такой Контейнерный Контрол - ваша Форма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...