Manipular qualquer programa usando c#

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br

Manipular os programas via c# - usando o exemplo do bloco de notas No artigo a seguir para ir é sobre, como outros programas de controle, ajuste usando c# e estender. Como um exemplo de cenário, queremos expandir o programa incluído por padrão com o Windows “Notepad” usando um aplicativo translation from VPE for Csharp pequeno para uma função adicional.

Especificamente o aplicativo c# em aberto todas as instâncias, o que adiciona um novo botão interface e interceptação de vincular o bloco de notas clica neste botão. Ao clicar no botão, o texto da caixa de texto do bloco de notas na nossa aplicação enviadas e por meio de um analisador de descontos (o que é o Markdown?) ser convertido em HTML.

Em seguida, o produto final acabado de nosso artigo deve olhar como mostrado no vídeo abaixo que eu criei para você.

No contexto do artigo, vamos construir o programa passo a passo. Quem quer ter o código-fonte completo, role até o final do artigo. Lá é o completo c# código. Alternativamente, um download de solução do Visual Studio está disponível.

Manipular outros programas através de c#

No início, nós criamos um novo projeto Windows Forms no Visual Studio. No designer de GUI, podemos adicionar um RichTextBox no formulário, nomeá-lo como “richTextBoxInfo” e definir o atributo de doca para “Preencher”. Agora, o formulário deve olhar como mostrado na imagem.

Na próxima etapa, adicionamos duas novas referências no Solution Explorer sob referências através do botão direito. Uma referência para o WindowsBase. dll, que através da “constatação é .NET”-Reiter e uma referência a “MarkdownSharp.dll” na “busca” – guia. O MarkdownSharp.dll pode ser baixado a partir da página do projeto MarkdownSharp. Isto é feito, podemos começar fora da programação do programa.

Na primeira etapa, adicionamos três novos usando referências: System.Runtime.InteropServices, System. Diagnostics e MarkdownSharp. Precisamos chamar métodos de não-gemanagetem (unmanaged) código InteropService e System. Diagnostics necessidade podemos enumerar processos e avaliar markdown é necessário mais tarde para a análise de texto do Markdown.

Na segunda etapa, adicionamos um latte de todo a “código não gerenciado”-métodos, constantes e variáveis auxiliares adicionadas. Que parte do que vai dar certo no decorrer do artigo. Portanto, podemos copiar por agora com segurança fora da caixa de código a seguir.

Pequena dica sobre a borda: quem pede, como você sabe como, então uma assinatura do método nativo/não gerenciado deve procurar, pode até dar uma olhada pinvoke.net.

Nosso código deve ficar assim:

usando o sistema utilizando System.Collections.Generic usando System. ComponentModel; using System. Data; usando System. Drawing; usando System. Linq; usando System. Text; usando System.Windows.Forms; usando System.Runtime.InteropServices; usando System. Diagnostics; usando MarkdownSharp; namespace NotepadEnhanced {classe parcial pública Form1: formar {[DllImport(“user32.dll”)] privada extern static int GetWindowText (IntPtr hWnd, StringBuilder texto, int count);} [DllImport(“User32.dll”)] privada estática extern IntPtr GetMenu (IntPtr hWnd); [DllImport(“User32.dll”)] privada estática extern bool CMenu (hMenu IntPtr, Int32 wPosition, Int32 wFlags, Int32 wIDNewItem, string lpNewItem); [DllImport(“User32.dll”)] privada extern static int GetMenuItemCount (IntPtr hMenu); [DllImport(“User32.dll”)] privada estática extern bool DrawMenuBar (IntPtr hWnd); [DllImport (“user32. dll”, SetLastError = true)] privada estática extern IntPtr FindWindowEx (IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, IntPtr lpszWindow); [DllImport (“user32. dll”, EntryPoint = “SendMessage”)] extern estático privado IntPtr SendMessageGetTextW (IntPtr hWnd, uint msg, wParam UIntPtr, StringBuilder lParam); [DllImport (“User32. dll”, EntryPoint = “SendMessage”)] extern privada estática int SendMessageGetTextLength (IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); [DllImport (“user32.dll”)] [retornar: MarshalAs(UnmanagedType.Bool)] privada estática extern bool SetForegroundWindow (IntPtr hWnd);] [DllImport(“User32.dll”)] static extern IntPtr SetWinEventHook (uint eventMin uint eventMax, IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess, uint idThread, uint dwFlags); [DllImport(“User32.dll”)] static extern bool UnhookWinEvent (IntPtr hWinEventHook); delegate void WinEventDelegate (IntPtr hWinEventHook, eventType uint, IntPtr hwnd, int idObject, idChild int, uint dwEventThread, uint dwmsEventTime); WinEventDelegate procDelegate; IntPtr hhook; uint const EVENT_OBJECT_INVOKED = 0 x 8013; uint const WINEVENT_OUTOFCONTEXT = 0; _CustomMenuID privada de Int32 const = 1000; MF_BYPOSITION privada de Int32 const = 0x400; privado WM_SYSCOMMAND const de Int32 = 0 x 112. Lista handlesNp = novo lista(); {{HandlesNpEdit dicionário = novo dicionário(); Form1() pública {InitializeComponent () ;}}}

Identificar processos e alças Leia

Agora podemos criar um manipulador para o evento load do nosso formulário principal (Form1). Se você fizer à mão ou usando o designer de Visual Studio, não desempenha qualquer papel.

Dentro do método de carga podemos recuperar todos os processos de bloco de notas no sistema e armazená-los em uma lista. Finalmente, sim, precisamos saber a janela do programa, se queremos expandi-lo.

Então vamos a lista de todas as instâncias da janela do bloco de notas. Aqui, nós primeiro recuperar o texto que está disponível no título da janela e gastá-lo em nossa casa formar no richTextBoxInfo.

Então pedimos uma referência à caixa de texto da janela do bloco de notas. Precisamos disto para ter acesso ao texto na janela do bloco de notas mais tarde.

Finalmente, podemos verificar quanto botões tem a janela do bloco de notas, na barra de menus. Se tem menos de 6 botões, então ele não foi manipulado ainda. Neste caso, nós adicionamos o nosso botão.

É percorrer a lista de todas as janelas do bloco de notas, nós ainda somos uma EventHook. Isto nós ligar no sistema e pode interceptar as mensagens do Windows.

O código no método de carga é o seguinte. (Use os comentários que você pode monitorar novamente, o que acontece em cada etapa).

Private void Form1_Load (object sender, EventArgs e) {//Die consultar janela alças de todos os processos de bloco de notas e salvar handlesNp = Process.GetProcessesByName(“notepad”).} Selecione (x => x.MainWindowHandle). ToList(); Durchlaufe todos encontrados instâncias do bloco de notas richTextBoxInfo.Text = “encaixado na janela seguinte: \r\n”; foreach (var npHandle em handlesNp.Select => novo ((x, i) {identificador = x, índice eu =})) {//Gebe o nome da instância atual do bloco de notas do StringBuilder sb novo StringBuilder(); = GetWindowText (npHandle.Handle, sb, 200); var windowTitle = sb. ToString (); richTextBoxInfo.Text + = windowTitle + “\r\n”; Localizar o identificador da caixa de texto da instância atual do bloco de notas //und salvá-lo para ler o texto posterior handlesNpEdit.Add (npHandle.Handle, FindWindowEx (npHandle.Handle, “Editar”, IntPtr, IntPtr. zero)); Identificador do menu da instância atual do bloco de notas encontrar var sysMenu = GetMenu(npHandle.Handle); Se o menu não tiver recebido nenhum botão adicional, //füge adicionar o novo botão e menu desenhar novo se (GetMenuItemCount(sysMenu)! = 6) {CMenu (sysMenu, 4, MF_BYPOSITION, _CustomMenuID, “MD para HTML”); DrawMenuBar(npHandle.Handle); Colocar //Hook {}}, para interceptar o Windows mensagens procDelegate = novo WinEventDelegate(WinEventProc); hHook = SetWinEventHook (EVENT_OBJECT_INVOKED, EVENT_OBJECT_INVOKED, IntPtr. zero, procDelegate, 0, 0, WINEVENT_OUTOFCONTEXT);}

Se nós agora tentar compilar o programa, então Visual Studio irá gerar uma mensagem de erro agradável ao redor das orelhas nos. Isto é devido a seguinte linha de código que temos escrito no final do método load.

procDelegate = novo WinEventDelegate(WinEventProc);

Aqui, passamos por um método chamado “WinEventProc”, que no entanto ainda não existe em nosso programa como um parâmetro.Portanto, nós agora aplicar este método na próxima etapa e preenchê-lo com a “Vida”.

Interceptar as mensagens do Windows com c#

Porque esse método captura um monte de mensagens do Windows, queremos entrar, mas apenas sobre aqueles que foram levantadas, clicando no nosso botão recém-adicionado no bloco de notas, nós primeiro filtrar somente as mensagens relevantes usando um if consulta. Para fazer isso, nós primeiro verifique se vem a notícia de uma das instâncias do bloco de notas, escrevemos para o load método em nossa lista (handlesNp.Contains(hwnd)) e, em segundo lugar, se a mensagem foi desencadeada por nosso botão (= = _CustomMenuID idChild).

Se assim for, podemos obter o texto da caixa de texto o bloco de notas usando o GetWindowText ()-Methode. Em seguida, criamos uma instância do Markdown e converter o texto do bloco de notas Markdown para HTML.

Agora vamos criar uma nova janela/forma e coloque um navegador da Web e um RichTextBox que passado tanto nosso fresco só analisado HTML.

Finalmente, podemos abrir a nova janela e trazê-lo à tona. O código para isso se parece com isto:

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br

void WinEventProc (IntPtr hWinEventHook, uint, eventType, IntPtr hwnd, int idObject, idChild, uint dwEventThread de int, uint dwmsEventTime) {//Überprüfe se vem notícia do bloco de notas e através de nosso //eigenen foi botão acionado. se (handlesNp.Contains(hwnd) & _} CustomMenuID = = idChild) {//Hole = texto de Notepad texto campo var markdownText GetWindowText(handlesNpEdit[hwnd]); //Rende texto de Markdown para HTML Markdown mds = novo Markdown(); var htmlOutput = htmlBody.Replace ({html_body}, mds.} Transform(markdownText)); Nova janela/formulário fWeb criar formulário = novo form(); fWeb.Size = new System.Drawing.Size (800, 600); fWeb.StartPosition = FormStartPosition.CenterScreen; fWeb.Text = “O bloco de notas – extensão do Markdown”; Adicionar um navegador da Web para o Windows e //HTML no navegador da Web navegador carregando wb = novo WebBrowser(); WB. Dock = DockStyle. Fill; WB. ScriptErrorsSuppressed = true; WB. DocumentText = htmlOutput; Uma caixa de texto adicionar a janela e carregando //HTML in a TextBox RichTextBox rtHtml = novo RichTextBox(); rtHtml.Dock = DockStyle. Fill; rtHtml.Text = htmlOutput; Navegador de ordem e 50/50 no TableLayoutPanel janela texto caixa tlp = novo TableLayoutPanel(); TLP. Dock = DockStyle. Fill; TLP. ColumnCount = 1; TLP. ColumnStyles.Add (novo System.Windows.Forms.ColumnStyle (System.Windows.Forms.SizeType.Percent, 100F)); TLP. RowCount = 2; TLP. RowStyles.Add (novo System.Windows.Forms.RowStyle (System.Windows.Forms.SizeType.Percent, 50F)); TLP. RowStyles.Add (novo System.Windows.Forms.RowStyle (System.Windows.Forms.SizeType.Percent, 50F)); TLP. Controls.AddRange (novo controle [] {wb, rtHtml}); fWeb.Controls.Add(tlp); Mostrar fWeb.Show(); SetForegroundWindow(fWeb.Handle); }}

Clique em F5, executando o compilador e… Erro! Desta vez temos o método de gancho, por isso que temos apenas usa um novo método, que ainda não existe. Por esta razão, agora adicionamos o ausente (GetWindowText)-Implementierung.

sequência de caracteres estática pública GetWindowText (IntPtr hwnd) {int len = SendMessageGetTextLength (hwnd, 14, IntPtr, IntPtr. zero) + 1;} StringBuilder sb = novo StringBuilder(len); SendMessageGetTextW (hwnd, 13, Nova UIntPtr((uint)len), sb); retorne sb. ToString ();}

Uma variável também ainda está desaparecida. E embora a sequência de caracteres htmlBody. Contém HTML – e o código CSS para a representação do nosso texto no WebBrowser. (Porque o código é um pouco mais, eu tenho recolhido abaixo o bloco de código. Clique em ajuda de caixa o código.)

#region markdown / CSS codeString htmlBody = @” “

6. o; padding-top: 10px; Padding-bottom: 10px; cor de fundo: branco; Padding: 30px; } corpo > *: primeiro filho {margem-top: 0! importante;} corpo > *: última-criança {margem-fundo: 0! importante;} um {cor: 4183 # 4;} a.absent {cor: #cc0000;} a.anchor {exibir: block; padding-left: 30px; margem esquerda:-30px; cursor: ponteiro; posição: absolute; top: 0; esquerdo: 0;} parte inferior: 0; } h1, h2, h3, h4, h5, h6 {margem: 20px 10px 0; padding: 0; font-weight: negrito; webkit-fonte – suavização: antialiased; cursor: texto; posição: relativo;} h1: hover a.anchor, h2: focalizar a.anchor, h3: focalizar a.anchor, h4: focalizar a.anchor, h5: focalizar a.anchor, h6: paire a.anchor {} fundo: url(‘..) /.. / images/modules/styleguide/para.pn’) centro de não-repetição 10px; text-decoration: none; } h1 tt, código h1 {-tamanho da fonte: herdar;} tt h2, h2 código {-tamanho da fonte: herdar;} tt h3, h3 código {-tamanho da fonte: herdar;} tt h4, h4 código {-tamanho da fonte: herdar;} h5 tt, h5 código {-tamanho da fonte: herdar;} tt h6, h6 código {-tamanho da fonte: herdar;} h1 {font-size: 28px; cor: preto;} h2 {-tamanho da fonte:} 24px; border-bottom: 1px sólidos #cccccc; cor: preto; } h3 {-tamanho da fonte: 18px;} h4 {-tamanho da fonte: 16px;} h5 {font-size: 14px;} h6 {cor: #777777; font-size: 14px;} p blockquote, ul, ol, dl, li, tabela, pre {margem: 15px 0;} hr {fundo: transparente url(‘..)} /.. / images/modules/pulls/dirty-shade.png’) repeat-x 0 0; fronteira: 0 nenhum; cor: #cccccc; altura: 4px; Padding: 0; } corpo > h2: primeiro filho {margem-top: 0; padding-top: 0;} corpo > h1: primeiro filho {margem-top: 0; padding-top: 0;} corpo > h1: primeiro filho + h2 {margem-top: 0; padding-top: 0;} corpo > h3: primeiro filho, corpo > h4: primeiro filho, corpo > h5: primeiro filho, corpo > h6: primeiro filho {margem-top: 0} ; padding-top: 0; } h1 r: primeiro filho r: primeiro filho h2 r: primeiro filho h3, r: primeiro filho h4, h5 primeiro filho,: r: primeiro filho h6 {margem-top: 0; padding-top: 0;} h1 p, h2 h3 p p, p h4, p h5, h6 p {margem-top: 0;} li p.first {exibir: inline – bloco;} ul, ol {padding-left: 30px;} ul: primeiro filho , ol: primeiro filho {margem-top: 0;} ul: último-criança, ol: última criança {margem-fundo: 0;} dl {estofamento: 0;} dl dt {-tamanho da fonte: 14px; fonte-peso: negrito; font – style: itálico; preenchimento: 0; margem: 0 15px 5px;} dl dt: primeiro filho {estofamento: 0;} dl dt >: primeiro filho {margem-top: 0;} dl dt >: último-criança {margem-fundo: 0;} dl dd {margem: 0 15px 0; padding: 15px 0;} dl dd >: primeiro filho {margem-top: 0;} dl dd >: última-criança {margem-fundo: 0;} BLOCKQUOTE {fronteira-esquerda: 4px sólido #dddddd; estofamento: 15px 0; cor: #777777;} BLOCKQUOTE >: primeiro filho {margem-top: 0;} bloco relação >: última-criança {margem-fundo: 0;} tabela {estofamento: 0;} tabela tr {border-top: 1px sólido #cccccc; cor de fundo: branco; margem: 0; padding: 0;} tabela tr:nth-child(2n) {cor de fundo: #f8f8f8;} tabela tr th {fonte-peso: negrito; fronteira: 1px solid #cccccc; text-align:} à esquerda; margem: 0; Padding: 6px 13px; } table tr td {fronteira: 1px solid #cccccc; alinhamento de texto: esquerda; margem: 0; padding: 6px 13px;} tabela tr th: primeiro filho, table tr td: primeiro filho {margem-top: 0;} tabela tr th: última-criança, table tr td: última-criança {margem-fundo: 0;} img {largura máxima: 100%;} span.frame {exibir: block; ov} erflow: oculto; } span.frame > abrangem {fronteira: sólido de 1px #dddddd; exibir: bloquear; flutuar: esquerda; estouro: oculto; margem: 13px 0 0; padding: 7px; largura: auto;} span.frame span img {exibir: bloquear; flutuar: à esquerda;} span.frame span span {clear: ambos; cor: #333333; exibição: block; estofamento: 5px 0 0;} abrangem .Align centro {exibir: bloquear; estouro: oculto; clara: ambos;} span.align-Centro > span {exibir: bloquear; estouro: oculto; margem: 13px auto 0; text-align: centro;} span.align-centro span img {margem: 0 auto; text-align: centro;} span.align-direito {exibir: bloquear;} estouro: oculto; clara: ambos; } span.align-direito > abrangem {exibir: bloquear; estouro: oculto; margem: 13px 0 0; text-align: direito;} span img span.align-direito {margem: 0; text-align: direito;} span.float-esquerda {exibir: block; margem direita: 13px; estouro: oculto; flutuar: à esquerda;} abrangem.flutuar a esquerda extensão {margem: 13px 0 0;} span.float-direito {exibir: block; margem esquerda: 13px; estouro: oculto; flutuador: direito;} span.float-direito > abrangem {exibir: bloquear; estouro: oculto; margem: 13px auto 0; text-align: direito;} código, DD {margem: 2px 0; padding: 0 5px; espaço em branco:} NoWrap; Border: 1px solid #eaeaea; cor de fundo: #f8f8f8; border-radius: 3px; } código pré {margem: 0; padding: 0; espaço em branco: pré; fronteira: none; fundo: transparente;} pre .highlight {cor de fundo: #f8f8f8; fronteira: 1px sólido #cccccc; font-size: 13px; linha-altura: 19px; estouro: auto; estofamento: 6px 10px; border-radius: 3px;} pre {} cor de fundo: #f8f8f8; Border: 1px sólidos #cccccc; font-size: 13px; linha-altura: 19px; overflow: auto; Padding: 6px 10px; border-radius: 3px; } código pré, pre tt {cor de fundo: transparente; fronteira: none;}$_{html_body}“; #endregion”

Estamos quase terminando. Na última etapa, acrescentamos o “fechamento do formulário” nosso manipulador de eventos de formulário adicionado. Dentro este manipulador de eventos, podemos garantir que o gancho que usamos para pegar as mensagens do Windows quando fechar o programa é removido.

Private void Form1_FormClosing (objeto sender, FormClosingEventArgs e) {//Nachrichten-Hook remover UnhookWinEvent(hhook);}

Agora tudo está completo. Para testar, abra o bloco de notas e escrever algumas linhas de texto em formatação do Markdown. Agora compile e começamos o nosso programa. Quando a janela aparecer, um novo botão na barra de menu deve aparecer no bloco de notas.

Como funciona - com c# Markdown estender o bloco de notas

Um clique sobre o botão deve abrir outra janela na qual nosso texto Markdown processado uma vez e uma vez representado como um HTML puro.

Completo de código fonte e baixar

Foi tudo muito confuso para quem ou quem não tem tempo, achados abaixo novamente todo o código-fonte como um projeto completo do Visual Studio para download.

Perguntas, ideias, & críticas

Então estamos novamente hoje. Se você tem dúvidas, sugestões ou críticas, em seguida, escreva com apenas um comentário.

Se você tem pedidos para outros tópicos ou artigo, então que venha a mim.

Sobre o autor: Este artigo, bem como 363 outros artigos sobre código-bude.net, escrito por Raphael. -Desde 2011 blog aqui sobre programação, meu software, escrever tutoriais e tentar o meu conhecimento, portanto ele vai bem, para compartilhar com meus leitores. Além disso, escrevo sobre temas de meus estudos sobre derwirtschaftsinformatiker.de. E-mail • Google + • Facebook • Twitter

7SHARESFacebookTwitterGoogleWhatsappRedditPocketStumbleuponPinterestXingMail

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br