Pergunta

Eu tenho usado com sucesso o método do Windows SendMessage para me ajudar a fazer várias coisas no meu editor de texto, mas cada vez que eu estou apenas copiando e colando o código sugerido por outros, e eu realmente não sei o que significa. Há sempre um número mensagem enigmática que é um parâmetro. Como eu sei o que esses números de código significa para que eu possa realmente entender o que está acontecendo e (espero) ser um pouco mais auto-suficientes no futuro? Obrigado.

exemplo recente:

using System.Runtime.InteropServices;

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, uint wMsg,UIntPtr wParam, IntPtr lParam);

SendMessage(myRichTextBox.Handle, (uint)0x00B6, (UIntPtr)0, (IntPtr)(-1));
Foi útil?

Solução

Este é o código janelas mensagem.
Eles são definidos nos arquivos de cabeçalho, e geralmente disponíveis traduzido como um include de algum tipo com diferentes idiomas.

exemplo:
WM_MOUSEMOVE = & H200
MK_CONTROL = & H8
MK_LBUTTON = & H1
MK_MBUTTON = & H10
MK_RBUTTON = & H2
MK_SHIFT = & H4
MK_XBUTTON1 = & H20
MK_XBUTTON2 = & H40

http://msdn.microsoft .com / en-us / library / ms644927 (VS.85) .aspx # windows_messages .

Outras dicas

Cada mensagem no Windows é representado por um número. Quando a codificação usando o Windows SDK no código nativo, estes são fornecidos pela define como WM_CHAR, WM_PAINT, ou LVM_GETCOUNT, mas esses define não são transportados para o .NET framework porque na maioria das vezes, as mensagens são envolvidos por eventos .NET como OnKeyPressed e OnPaint, ou métodos e propriedades como ListView.Items.Count.

Na ocasião onde não há é envolvido evento, propriedade ou método, ou você precisa fazer algo que não é suportado no nível mais elevado, você precisa dos números de mensagem que usa o Windows debaixo do framework .NET.

A melhor maneira de descobrir o que um determinado número realmente significa é olhar nos cabeçalhos do Windows SDK e encontrar a definição para esse número.

Talvez você encontrará o código em http://www.codeproject.com /KB/cs/cswindowsmessages.aspx útil. Ele fornece um C # enumeração de mensagens muitas janelas comuns.

Entre todos os exemplos que eu encontrei na internet, este é o melhor porque é o único que cuida de mostrar a using System.Runtime.InteropServices. Sem esta directiva eu ??não poderia ter SendMessage trabalhando em C #. Também muito útil é a lista de janelas Mensagens desta página oferecem. Repito aqui o exemplo:

using System.Runtime.InteropServices; 

[DllImport("user32.dll")] 
static extern int SendMessage(IntPtr hWnd, uint wMsg,UIntPtr wParam, IntPtr lParam); 

SendMessage(myRichTextBox.Handle, (uint)0x00B6, (UIntPtr)0, (IntPtr)(-1)); 

Experimente o PInvoke interoperabilidade Assistant . Esta ferramenta tem uma funcionalidade de pesquisa que permite que você navegue através de todas as mensagens do Windows definidos. Ela irá então gerar o correto C # / VB.Net código para esses valores.

Também não é limitado a apenas valores constantes. Ele também pode gerado estruturas, funções, ponteiros de função e enums.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top