Você está aqui: C# ::: Dicas & Truques ::: WMI (Windows Management Instrumentation) |
O que é WMI (Windows Management Instrumentation) e como usar esta infraestrutura em seus programas C#Quantidade de visualizações: 13871 vezes |
O WMI (Windows Management Instrumentation) é a infraestrutura para o gerenciamento de dados e operações em sistemas baseados no Windows. Por meio do WMI nós podemos obter várias informações a respeito de todo o hardware no sistema, incluindo: a) Número de série, tamanho (capacidade) e espaço livre em drives; b) Número de série, velocidade de clock e tipo de soquete da CPU; c) Endereço MAC do adaptador de rede (Network Adapter MAC Address); d) Gateway padrão do adaptador de rede (Network Adapter Default Gateway); e) Muitas outras informações úteis para o desenvolvimento de programas que investigam ou atualizam informações relacionados a harware. O WMI foi projetado para programadores que usam C/C++, o Microsoft Visual Basic ou uma linguagem de script que tenha um motor (engine) no Windows e que nos permita lidar com objetos Microsoft ActiveX. Nesta dica mostrarei como podemos usar WMI a partir de aplicações C#. As informações contidas nas várias classes do WMI podem ser obtidas com o uso do WQL (SQL for WMI). Esta é a WMI Query Language, um sub-conjunto do American National Standards Institute Structured Query Language (ANSI SQL) ? com algumas diferenças semânticas. A classe WMI que abordarei nesta dica é a Win32_LogicalDisk. Esta classe representa uma fonte de dados que é um apelido para um dispositivo de armazenagem local em um computador usando Windows. Por meio desta classe podemos obter informações interessantes, tais como o número serial do HD, o espaço inicial, o espaço disponível, tipo do drive, etc. O primeiro procedimento que vamos realizar é a obtenção do número de série do HD. Veja: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- private void button3_Click(object sender, EventArgs e){ // using System.Management; // vamos obter o número de série (serial number) do drive C string drive = "C"; // vamos criar um novo objeto da classe ManagementObject // informando que queremos obter informações a respeito do drive C ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid="" + drive + ":""); // vamos atrelar a classe WMI ao objeto de gerencimento disk.Get(); // vamos exibir o número de série do HD MessageBox.Show(disk.GetPropertyValue("VolumeSerialNumber").ToString()); } Antes de executar este exemplo verifique se você realmente adicionou a referência System.Management ao seu projeto. Note que a linha: MessageBox.Show(disk.GetPropertyValue("VolumeSerialNumber").ToString()); pode ser substituída por: MessageBox.Show(disk["VolumeSerialNumber"].ToString()); Para verificar se o código C# realmente retornou o número de série correto, abra uma janela de comando e dispare: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- vol Você terá um resultado parecido com: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- C:Documents and SettingsOsmar>vol O volume na unidade C é LABORATORIO O número de série do volume é A9D3-764C Para obtermos o nome do volume só precisamos fazer uma pequena modificação no código. Veja: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- private void button3_Click(object sender, EventArgs e){ // using System.Management; // vamos obter o nome de volume (Volume Name) do drive C string drive = "C"; // vamos criar um novo objeto da classe ManagementObject // informando que queremos obter informações a respeito do drive C ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid="" + drive + ":""); // vamos atrelar a classe WMI ao objeto de gerencimento disk.Get(); // vamos exibir o nome de volume do HD MessageBox.Show(disk["VolumeName"].ToString()); } |
Link para compartilhar na Internet ou com seus amigos: |
C# ::: Desafios e Lista de Exercícios Resolvidos ::: Arrays e Matrix (Vetores e Matrizes) |
Exercício Resolvido de C# - Peça para o usuário informar o valor do primeiro elemento e gere os valores dos demais elementos com o dobro doQuantidade de visualizações: 284 vezes |
Pergunta/Tarefa: Escreva um programa C# que cria um vetor de 5 posições de inteiros. Peça para o usuário informar o valor do primeiro elemento e gere os valores dos demais elementos com o dobro do elemento anterior. Assim, se o usuário informar o valor 3 para o primeiro elemento, o valor do segundo elemento será 6, o valor do terceiro elemento será 12, e assim por diante. Sua saída deverá ser parecida com: Informe o valor do primeiro elemento: 5 Os elementos do vetor são: 5 10 20 40 80 Veja a resolução comentada deste exercício em C#: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- using System; namespace Estudos { class Principal { // função principal do programa C# static void Main(string[] args) { // vamos declarar e construir um vetor de inteiros // de 5 elementos int[] valores = new int[5]; // agora vamos pedir para o usuário informar o // valor do primeiro elemento Console.Write("Informe o valor do primeiro elemento: "); valores[0] = Int32.Parse(Console.ReadLine()); // agora vamos gerar os valores dos próximos elementos for (int i = 1; i < valores.Length; i++) { // recebe o elemento anterior multiplicado por 2 valores[i] = valores[i - 1] * 2; } // e agora mostramos o vetor gerado Console.WriteLine("\nOs elementos do vetor são:\n"); for (int i = 0; i < valores.Length; i++) { Console.Write(valores[i] + " "); } Console.WriteLine("\n\nPressione uma tecla para sair..."); Console.ReadKey(); } } } |
C# ::: Windows Forms ::: CheckBox |
Como detectar a mudança de estado da CheckBox do C# Windows Forms usando o evento CheckedChangedQuantidade de visualizações: 9674 vezes |
Em algumas situações gostaríamos de efetuar algumas tarefas quando uma CheckBox é marcada ou desmarcada. O melhor lugar para isso é no evento CheckedChanged da própria CheckBox. Este evento é disparado todas as vezes que a CheckBox é marcada ou desmarcada. Coloque uma CheckBox no formulário e dê duplo-clique no controle. Automaticamente o marcador do evento CheckedChanged será criado. Modifique-o para o código abaixo: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- private void checkBox1_CheckedChanged(object sender, EventArgs e){ // vamos verificar se a CheckBox foi marcada ou desmarcada if((sender as CheckBox).Checked) MessageBox.Show("A CheckBox foi marcada"); else MessageBox.Show("A CheckBox foi desmarcada"); } Note que aqui eu usei o operador as para tratar o controle que gerou o evento (sender) como um objeto da classe CheckBox. |
C# ::: Coleções (Collections) ::: List<T> |
Como pesquisar um elemento em uma lista do C# usando a função Find() e um PredicateQuantidade de visualizações: 14875 vezes |
Em algumas situações gostaríamos de pesquisar e retornar o primeiro elemento de uma List<T> que obedece a algum critério de busca. Assim, poderíamos, por exemplo, pesquisar um nome que começa com uma determinada palavra ou um preço de produto maior ou igual a um determinado valor. Para tais situações podemos usar o método Find(). Este método possui a seguinte assinatura: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- public T Find( Predicate<T> match ) Veja que o método pede um delegate do tipo Predicate<T> que define as condições para a pesquisa do elemento. Se o elemento for encontrado, este é retornado. Caso contrário, o valor padrão para T é retornado (null para referências). Veja um trecho de código no qual eu mostro como usar o método Find() em combinação com um método personalizado que permite usar um delegate anônimo. Desta forma conseguimos fornecer, em tempo de execução, o argumento para o parâmetro match do Predicate: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- static void Main(string[] args){ // vamos criar um objeto da classe List<T> List<string> nomes = new List<string>(); // vamos inserir quatro valores na lista nomes.Add("Osmar J. Silva"); nomes.Add("Salvador Miranda de Andrade"); nomes.Add("Dyego Fernandes de Souza"); nomes.Add("Marcos de Paula Rocha"); // vamos pesquisar um valor na lista usando um método personalizado // Neste exemplo vamos retornar o primeiro nome que contenha a palavra // "Dyego" string nome = encontrar(nomes, "Dyego"); // vamos verificar se o nome foi encontrado if(nome != null){ // foi encontrado....vamos retornar o resultado Console.WriteLine(nome); } else{ Console.WriteLine("Nenhum nome encontrado."); } // vamos pausar a execução Console.Write("\n\nPressione qualquer tecla para continuar..."); Console.ReadKey(); } // método auxiliar que permite encontrar um valor na lista usando // o método Find() da classe List<T> e um Predicate static string encontrar(List<string> lista, string texto){ string encontrado = null; // vamos pesquisar o valor na lista usando seu método Find() // Aqui o primeiro nome que passar no critério de busca será retornado encontrado = lista.Find(delegate(string valor){ return valor.Contains(texto); }); return encontrado; } O método Find() executa uma busca linear. Assim, este método é uma operação O(n), onde n é a quantidade de elementos na lista. |
Vamos testar seus conhecimentos em Engenharia Civil - Construção Civil |
Serviços preliminares e instalações provisórias A instalação de tapumes é obrigatória em atividades de construção, para impedir o acesso de pessoas estranhas ao serviço. Sobre a instalação de tapumes e serviços decorrentes: A) Os tapumes devem ter altura mínima de 2,2 m em relação ao nível do terreno. B) Em edifícios com mais de dois pavimentos, é facultativa a construção de galerias para o tráfego de pedestres sobre o passeio. C) As bordas da galeria para pedestres devem possuir tapumes com altura mínima de 2,0 m e inclinação de 45°. D) Não é obrigatória a instalação de tapume em todo o perímetro da obra, apenas na testada do lote. E) As galerias para o tráfego de pedestres devem ter altura livre mínima de 2,5 m. Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em Fenômeno de Transportes e Hidráulica |
Fenômeno de Transportes De uma grande barragem, parte uma canalização de 250mm de diâmetro, de onde a água passa para a atmosfera sob a forma de jato. A vazão deste jato é 360L/s. Calcular a velocidade Vj do jato e a altura (H) na barragem. Considere que não há perda de energia no processo e que a velocidade de decaimento do nível da barragem é nula. A) Vj = 7,33m/s e H = 2,74m. B) Vj = 1,83m/s e H = 0,17m. C) Vj = 2,46m/s e H = 0,31m. D) Vj = 7,33m/s e H = 0,37m, E) Vj =7,33 X 10-3m/s e H = 2,74 X 10-6m. Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em Hidrologia |
Com relação à delimitação de bacias hidrográficas, é correto afirmar que A) todos os pontos em seu interior, obrigatoriamente possuem cotas iguais ou inferiores em relação às cotas do divisor de águas da bacia. B) tanto o divisor de água do tipo topográfico quanto o divisor do tipo freático podem ser utilizados, pois os dois sempre se coincidem. C) segundo o método de Strahler de hierarquização fluvial, bacias hidrográficas de 4ª ordem têm o dobro de área de drenagem do que bacias classificadas em 2ª ordem. D) a linha imaginária que define o seu limite deve ser traçada perpendicularmente às curvas de nível e não cortar nenhum curso de água além do ponto onde se encontra o exutório. E) na escolha do local do exutório para a delimitação, os cursos d?água devem ser classificados como de 4ª ordem (método de Strahler) no mínimo, para que a bacia hidrográfica tenha uma área representativa. Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em |
Dimensionamento de lajes maciças à flexão Determinadas estruturas, como as empregadas em pavimentos de garagens de edificações residenciais, demandam o emprego de vãos maiores entre os pilares, de modo a garantir espaço para a manobra dos veículos. A partir disso, analise as afirmativas a seguir: I. O acréscimo de altura nas seções transversais é a solução mais empregada para aumentar a rigidez da laje e, desse modo, aumentar a capacidade desta em resistir aos esforços de flexão. PORÉM II. O acréscimo de altura provoca o aparecimento de sobrecargas na laje, sendo necessário proceder ao redimensionamento da estrutura, de modo a verificar se os critérios de segurança e serviço serão atendidos. Assinale a alternativa correta: A) As afirmações I e II são proposições verdadeiras, mas a II não justifica a I. B) As afirmações I e II são proposições verdadeiras e a II justifica a I. C) A afirmativa I é uma proposição verdadeira, e a II, falsa. D) A afirmação II é uma proposição verdadeira, e a I, falsa. E) As afirmações I e II são proposições falsas. Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em JavaScript |
Qual é a sintáxe correta para referenciar um arquivo JavaScript externo chamado "auxiliar.js"? A) <script name="auxiliar.js"> B) <script src="auxiliar.js"> C) <script href="auxiliar.js"> Verificar Resposta Estudar Cards Todas as Questões |
Desafios, Exercícios e Algoritmos Resolvidos de C# |
Veja mais Dicas e truques de C# |
Dicas e truques de outras linguagens |
Códigos Fonte |
Software de Gestão Financeira com código fonte em PHP, MySQL, Bootstrap, jQuery - Inclui cadastro de clientes, fornecedores e ticket de atendimento Diga adeus às planilhas do Excel e tenha 100% de controle sobre suas contas a pagar e a receber, gestão de receitas e despesas, cadastro de clientes e fornecedores com fotos e histórico de atendimentos. Código fonte completo e funcional, com instruções para instalação e configuração do banco de dados MySQL. Fácil de modificar e adicionar novas funcionalidades. Clique aqui e saiba mais |
Controle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidades Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais |
Linguagens Mais Populares |
1º lugar: Java |