Mês: abril 2014

.NET: Rodar um executável externo como Administrador

Certas vezes é necessário rodar um executável externo com os direitos de Administrador. Pode ser algum utilitário do Windows como a Restauração do Sistema, um módulo separado do nosso aplicativo, e etc.

A metodologia é simples:

C#:

var rstrui = new System.Diagnostics.ProcessStartInfo();
rstrui.FileName = "rstrui.exe";
rstrui.UseShellExecute = true;
rstrui.Verb = "runas"; //O segredo é esta linha!
rstrui.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Windows);
System.Diagnostics.Process.Start(rstrui);

VB.NET:

Dim rstrui As New System.Diagnostics.ProcessStartInfo()
rstrui.FileName = "rstrui.exe"
rstrui.UseShellExecute = True
rstrui.Verb = "runas" 'O segredo é esta linha!
rstrui.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Windows)
System.Diagnostics.Process.Start(rstrui)

Basicamente, nós definimos o Verbo para runas que é o “comando” responsável por exigir os direitos de administrador na inicialização do aplicativo.
No caso, o código acima irá inicializar, com permissões de Administrador, o utilitário de restauração do sistema do Windows.

Anúncios

ImageMagick: API para processamento de imagens – .NET, C++

Recentemente encontrei internet a fora o que pode ser uma das melhores opções de APIs gratuitas para manipulação de imagens. Chama-se ImageMagick. Ela foi escrita em C/C++ mas possui um Wrapper para poder ser usada no .Net Framework.

Algumas coisas que são possível com ela:

  • Conversão: converter uma imagem de um formato para outro.
  • Transformação: redimensionar, rotacionar, cortar e espelhar uma imagem.
  • Transparência: renderizar partes da imagem com transparência.
  • Desenho: adicionar formas geométricas, vetores, e texto para uma imagem.
  • Decorar: adicionar uma borda ou um quadro para uma image.
  • Efeitos: desfoque, nitidez, ruído, e mais.
  • Animação: criar um GIF animado a partir de várias imagens estáticas.
  • Texto e Comentários : inserir um texto descritivo ou artístico na imagem.
  • Composição: montar uma imagem composta (uma sobre outra)…

Tem inúmeras outras funcionalidades além dessas que eu citei. Devo ressaltar que ela também suporta mais de 100 formatos de imagem diferentes!

 

Então segue o link da página oficial da API:

ImageMagick: Convert, Edit, Or Compose Bitmap Images

.NET: Deletar itens de uma coleção durante uma iteração (for, foreach) – C# & VB.NET

As vezes, precisamos percorrer uma determinada coleção fazendo verificações (Através de blocos if, por exemplo), removendo itens que não se enquadram em uma determinada regra. Contudo, não podemos modificar uma coleção de dentro de um laço foreach (For Each no VB), e também teremos problemas ao fazer isso de dentro de uma laço for (For) que esteja percorrendo uma coleção.

E a solução? Mais simples do que se pode imaginar! Ao invés de usar um foreach ou um for comum para percorrer a coleção, você usa um for reverso.

Segue o exemplo:

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace HL
{
    public class Program
    {
        public static void Main(string[] args)
        {
            List<string> Items = new List<string>(new string[]{"Herbert", "Lausmann", "é", "o", "cara", "!"});
            
            for(int i = (Items.Count - 1); i >= 0; --i)
            {
                if(Items[i].Contains('a'))
                {
                    Items.RemoveAt(i);
                }
            }
            
            foreach(string str in Items) Console.WriteLine(str);
            Console.ReadKey();
        }
    }
}

VB.NET:

Imports System.Collections.Generic
Imports System.Linq
Imports System.Text.RegularExpressions

Namespace HL
	Public Class Program
		Public Shared Sub Main()
			Dim Items As New List(Of String)(New String() {"Herbert", "Lausmann", "é", "o", "cara", "!"})

			For i As Integer = (Items.Count - 1) To 0 Step -1
				If Items(i).Contains("a"C) Then
					Items.RemoveAt(i)
				End If
			Next

			For Each str As String In Items
				Console.WriteLine(str)
			Next
			Console.ReadKey()
		End Sub
	End Class
End Namespace

😉

Win Forms: Mover form sem borda no C#

Código bem simples para mover um Form no C#. Inclusive é a melhor forma, mais leve e sem delays:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

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

        public const int WM_NCLBUTTONDOWN = 0xA1;
        public const int HT_CAPTION = 0x2;
        public const int WM_LBUTTONDOWN = 0x0201;

        [DllImportAttribute("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd,
                         int Msg, int wParam, int lParam);
        [DllImportAttribute("user32.dll")]
        public static extern bool ReleaseCapture();

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            if (m.Msg == WM_LBUTTONDOWN)
            {
                ReleaseCapture();
                SendMessage(this.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
            }
        }

    }
}

Se você programa em VB.NET, eu tenho um post sobre isso para você:

Movendo um Form sem borda (FormBorderStyle = None): A forma correta – VB.NET

.NET: Criando e mostrando rotas com o Google Maps – C#

Recentemente, respondi uma thread nos fóruns do MSDN, cujo caso era mostrar uma rota usando o Google Maps no controle WebBrowser. O problema do inquiridor era um erro de script que acontecia no carregamento do Google Maps. Nós trabalhamos em conjunto e conseguimos resolver!

Daí resolvi postar o código aqui no blog, junto com um demo, pois achei o assunto bem interessante!

Criando rotas com o Google Maps

(mais…)

.NET, JavaScript: Revertendo uma string/url

Eu não sei bem qual a utilidade disso, mas é a forma mais simples de se reverter uma string:

C#:

using System;

namespace HL
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string str = @"/moc.sserpdrow.nnamsualtodtrebreh//:ptth";
            char[] chars = str.ToCharArray();
            
            Array.Reverse(chars);

            string reverted = new string(chars);
            
            Console.WriteLine(reverted);
        }
    }
}

VB.NET:

Imports System

Namespace HL
    Public Module Program
        Public Sub Main(args() As string)
            Dim str As String = "/moc.sserpdrow.nnamsualtodtrebreh//:ptth"
            Dim chars As Char() = str.ToCharArray()

            Array.Reverse(chars)

            Dim reverted As New String(chars)

            Console.WriteLine(reverted)
        End Sub
    End Module
End Namespace

Basicamente, eu transformo a string em um array de chars e uso o método Array.Reverse (Array) (System) para inverter a ordem do array. E depois eu crio uma nova instância de uma string usando o array de chars revertido.

E segue de bônus como reverter uma string no JavaScript:

var str = "/moc.sserpdrow.nnamsualtodtrebreh//:ptth";

var reverted = str.split("").reverse().join("");

print(reverted);

Até a próxima!

Win Forms & WPF: Iniciando a aplicação junto com o Windows

Seria muito bom se pudéssemos configurar o nosso aplicativo para iniciar com o Windows apenas com um valor Booleano. Ex: IniciarComOWindows = true;

Justamente, desejando essa facilidade, eu escrevi a propriedade abaixo:

C#

        public bool RunAtStartup
        {
            get
            {
                Microsoft.Win32.RegistryKey registryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey
                    ("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
                return !string.IsNullOrEmpty((string)registryKey.GetValue("Intelli_Clip"));
            }
            set
            {
                Microsoft.Win32.RegistryKey registryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey
        ("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
                if (value)
                {
                    registryKey.SetValue("Intelli_Clip", System.Reflection.Assembly.GetExecutingAssembly().Location);
                }
                else
                {
                    registryKey.DeleteValue("Intelli_Clip");
                }
            }
        }

VB.NET:

Public Property RunAtStartup() As Boolean
	Get
		Dim registryKey As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True)
		Return Not String.IsNullOrEmpty(DirectCast(registryKey.GetValue("Intelli_Clip"), String))
	End Get
	Set
		Dim registryKey As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True)
		If value Then
			registryKey.SetValue("Intelli_Clip", System.Reflection.Assembly.GetExecutingAssembly().Location)
		Else
			registryKey.DeleteValue("Intelli_Clip")
		End If
	End Set
End Property

Troque Intelli_Clip pelo nome do seu aplicativo.

Esse código foi retirado do meu projeto Intelli Clip e funciona para WPF e Win Forms. 😉