Matérias‎ > ‎

Como forçar ampulheta do windows em uma aplicação Windows Form

postado em 7 de jun de 2010 15:13 por João Miguel Tabosa Vaz Marques Silva   [ 7 de jun de 2010 16:23 atualizado‎(s)‎ ]
Suponhamos que você tem uma rotina da sua aplicação que demora muito tempo e durante esse tempo você não quer que o usuário interaja com o seu sistema e que para ele seja apresentada a ampulheta do windows. Já encontrei muitas respostas para esse problema porem apenas uma realmente me serviu... Tentei desde trocar a propriedade do ponteiro na sessão até do proprio formulário e por muitas vezes não tive sucesso algum. Encontrei esta solução que me serviu como uma luva e é de muito fácil implementação. Crie uma classe ex: HourGlass.cs

Código Classe HourGlass.cs

using System;
using System.Windows.Forms;

namespace MyApplication
{
    public class HourGlass : IDisposable
    {
        public HourGlass()
        {
            Enabled = true;
        }
        public void Dispose()
        {
            Enabled = false;
        }
        public static bool Enabled
        {
            get { return Application.UseWaitCursor; }
            set
            {
                if (value == Application.UseWaitCursor) return;
                Application.UseWaitCursor = value;
                Form f = Form.ActiveForm;
                if (f != null && f.Handle != null)
                    SendMessage(f.Handle, 0x20, f.Handle, (IntPtr)1);
            }
        }
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
    }
}
A implementação é muito mais simples usando o comando using (new HourGlass()){} você consegue implementar de forma rápida e simples... Veja um exemplo:

Implementação da HourGlass em um método

private void MetodoASerExecutado()
{
    using (new HourGlass())
    {
        //Coloque aqui a rotina a ser executada...
    }
}
Todo o código que estiver dentro do using (new HourGlass()) será executado e durante esse tempo a interface da aplicação ficará indisponível. Esta implementação funciona onde as outras falham por confiar inteiramente no windows e fazendo a chamada diretamente no sistema operacional na user32.dll e não usando os métodos conhecidos do .net.
ċ
ImplementacaoHourGlass(VS2010,NET20).zip
(42k)
João Miguel Tabosa Vaz Marques Silva,
7 de jun de 2010 15:49
Comments