Window O evento de redimensionamento não é acionado ao encaixar janelas na borda da tela com o mouse

3

Esta questão é em relação a esta pergunta sobre estouro de pilha , mas eu senti que a questão no coração é menos sobre programação e mais sobre as limitações do programa, e é por isso que estou perguntando aqui.

Espero que alguém seja capaz de explicar as discrepâncias que estou vendo com o Windows Snap enquanto uso o Window Resize Event como um acionador para algum código do VBA.

Eu tenho este código no módulo ThisWorkbook . Ele adiciona 1 ao valor de A1 na primeira planilha toda vez que a janela é redimensionada:

Private Sub Workbook_WindowResize(ByVal Wn As Window)
Dim n As Integer

n = ThisWorkbook.Worksheets(1).Range("a1").Value
ThisWorkbook.Worksheets(1).Range("a1").Value = n + 1

End Sub

O evento será acionado quando:

  • A janela está maximizada ou minimizada
  • A janela é redimensionada arrastando as bordas para dentro / fora
  • A janela é encaixada de um lado pressionando Windows + Seta no teclado
  • A janela (a) é encaixada em um lado como resultado de encaixar outra janela (b) em um lado e depois escolher a primeira janela (a) das miniaturas do Windows Snap Assist

O evento não será acionado quando:

  • A janela é encaixada de um lado arrastando a janela até a borda da tela com o mouse
  • A janela é desentupida de um lado arrastando a janela com o mouse

O que eu tentei

Eu verifiquei a Documentação do MSDN para mais detalhes sobre as limitações do evento Windows Resize. Como você pode ver nesse link, não há informações suficientes para ser de grande utilidade nessa situação.

Também verifiquei através do Stack Overflow e do Super User e não encontrei outras perguntas mencionando o uso do Windows Snap como disparador para uma macro, além daquela mencionada no início da minha pergunta.

Edit: Eu também tentei o Application_WindowResize, que está dando o mesmo resultado.

Eu usei este código no módulo ThisWorkbook para inicializar os eventos do aplicativo:

Private WithEvents App As Application

Private Sub Workbook_Open()
    Set App = Application
End Sub

E este código depois de fechar e reabrir a pasta de trabalho para verificar o acionador de evento:

Private Sub App_WindowResize(ByVal Wb As Workbook, ByVal Wn As Window)
Dim n As Integer

n = ThisWorkbook.Worksheets(1).Range("a1").Value
ThisWorkbook.Worksheets(1).Range("a1").Value = n + 1

End Sub

Para esclarecimento, este código está sendo executado em uma nova pasta de trabalho, o código anterior não está presente no VBE. Estou vendo o mesmo resultado acima, o evento aciona tudo, exceto arrastar e encaixar a borda da tela com o mouse.

Alguém pode me dizer por que o evento Windows Resize não é acionado para os casos acima?

    
por girlvsdata 16.07.2018 / 03:41

1 resposta

1

O evento Redimensionar foi desde sempre esquisito no Excel e não melhorou nas últimas versões. Nunca funcionou totalmente em alguns casos envolvendo janelas maximizadas ou minimizadas e, aparentemente, encaixe usa um semelhante mecanismo.

Resolver o problema requer, portanto, uma interface direta com o API do Windows e interceptando as mensagens do Windows relacionadas ao redimensionamento.

Método 1: criando uma nova bomba de mensagens para o aplicativo

Você encontrará o código VB inteiro na última entrada de Jaafar Tribak da postagem Detectando o redimensionamento da janela do aplicativo do Excel .

Em poucas palavras, você precisa declarar as funções da API do Windows FindWindow e SetWindowLong e use-os para encontrar a janela do aplicativo, chamado XLMAIN e defina sua própria bomba de mensagens. Você então intercepta as mensagens relevantes do Windows, processa-as, e, finalmente, passá-los para o Windows. O código inteiro é muito longo para reproduzir aqui e adaptá-lo à sua necessidade vai exigir algum conhecimento de VB e API do Windows.

Método 2: usar DLLs C

Para versões de 32 bits do Excel, você pode usar a DLL C (Biblioteca de Carregamento Dinâmico) SubCls.dll e módulo de código modSubCls.bas pode ser baixado do site .

A descrição de como usá-los pode ser encontrada no post Detectar o evento de redimensionamento de uma janela .

Concluo observando que não conheço nenhuma solução fácil para esse problema. Eu temo que você precise fazer alguma programação pesada para contornar esses problemas. deficiências do Excel.

    
por 20.07.2018 / 13:01