Não desativa, mas faz com que o botão do windows esculpe mouse ergonômico enviar mensagem XBUTTON2 (winapi prespective)

1

Como esperado, os dois botões extras em todos os mouses enviam mensagens XBUTTON1 e XBUTTON2. No entanto, com um mouse ergonômico Sculpt, o botão do Windows não envia isso. Aparentemente, ele envia a tecla direita do Windows. Eu preciso consertá-lo para que ele envie XBUTTON2.

Consegui desativar o botão do Windows fazendo qualquer coisa seguindo este procedimento: Rebindir Microsoft Sculpt Mobile Mouse (Tecla Windows) - mas isso desativa o botão do Windows no mouse completamente e não o faz funcionar normalmente como em todos os outros cinco mouse de botão. Deve enviar XBUTTON2 .

No entanto, preciso que funcione como XBUTTON2.

Aqui está uma explicação detalhada:

Eu sou um desenvolvedor de software. Eu comprei o mouse ergonômico Sculpt porque ele tem cinco botões (e rolagem horizontal), então ele pode me permitir testar todas as mensagens dos botões. Isso ajuda especialmente em manter-me confortável enquanto digito / movo o mouse.

As mensagens do botão são vistas aqui para o gancho do mouse: link

O campo mouseData é definido de acordo com o botão do mouse:

  • Pressionar o botão esquerdo do mouse envia a mensagem: WM_LBUTTONDOWN
  • botão direito do mouse: WM_RBUTTONDOWN
  • botão do meio do mouse: WM_MBUTTONDOWN
  • Botão lateral do mouse: WM_XBUTTONDOWN e vemos na estrutura MSLLHOOKSTRUCT: link - esse campo mouseData é XBUTTON1
  • Agora, o problema - o botão do mouse do Windows não está enviando nada - estou esperando que ele envie a mensagem WM_XBUTTONDOWN com mouseData de XBUTTON2 (observe o 2)

Aqui está um gráfico para explicar os tópicos:

A seta verde e a nuvem de texto mostram como é, e é isso que eu espero. A seta vermelha e a nuvem de texto são o que eu espero que o botão do mouse do Windows faça, mas isso não acontece. Alguém pode me ajudar a fazer com que esse botão do mouse funcione como esperado do ponto de vista do winapi?

    
por Noitidart 13.11.2015 / 06:56

2 respostas

1

Ouvindo a tecla "WIN"

Até onde eu sei, a única razão pela qual você pode não ver os eventos vindos da tecla do mouse “WIN” é que você está apenas procurando por eventos relacionados ao mouse, enquanto a tecla “WIN” produz teclado. relacionados com o botão direito do mouse. Efetivamente, essa parte já foi discutida nos comentários - o remapeamento "Right-Win" funciona perfeitamente.

Enviados repetidamente para eventos RWin

Posso confirmar que ele envia eventos repetidamente. AFAIK, todas as teclas do teclado funcionam assim - por exemplo "F2". Pelo menos os seguintes AHK truque mostra efetivamente o mesmo para ambos" F2 "e" RWin ", tanto quanto eu posso dizer.

#InstallKeybdHook
#InstallMouseHook
1::KeyHistory 

A coisa boa sobre a tecla "WIN" é que é mecanicamente capaz de produzir um único pressionamento de tecla. Em contraste com as inclinações de roda - é muito difícil conseguir um "clique único" delas - até o meu clique mais curto é normalmente tratado como 3 a 5 pressionamentos de teclas separados.

Ouvindo as teclas de inclinação das rodas

O “Centro de Mouse e Teclado da Microsoft” (versão 2.7.133.0) parece mudar o comportamento do mouse - o AHK não consegue mais ouvir os eventos WheelRight / WheelLeft. A maneira mais fácil de corrigir isso é desinstalar o site da Microsoft. ferramenta. Embora, de acordo com minhas experiências, isso não afete a chave "WIN".

No entanto, ainda deve ser possível remapear a roda até mesmo sem desinstalá-la. Ao usar os exemplos 1 e 2 do AHKHID foi capaz de pegar 1FFDFF e 1F0300 "dados" da roda direita e esquerda inclina, usando UsagePage 12, uso 1 com "Microsoft mouse e teclado center" instalado e nada depois de eu ter desinstalado.

Eventos de inclinação de roda enviados repetidamente

Pessoalmente, acabei simplesmente introduzindo um atraso, como sugerido por Bob . Parece que o código mais simples, baseado no código em esta questão funciona bem neste caso (embora possa não ser ideal - não sou especialista em AHK). O seguinte script AHK me permite remapear Wheel-tilt-Left para "Ctrl + Alt + leftArrow" e Wheel-tilt-Right para "Ctrl + Alt + rightArrow". Eu uso essas teclas de atalho em VirtuaWin para alternar para a área de trabalho virtual anterior / seguinte (uma tarefa em que "uma resposta por clique" é muito importante) e funciona perfeito. (Ainda assim, se eu pressionar e segurar o "botão de inclinação", recebo ~ 5 eventos por segundo).

WheelRight::
    if(  not GetKeyState("WheelRight")  )
        sleep 200    

    Send, {LControl down}
    Send, {LAlt down}
    Send, {right}
    Send, {LControl up}
    Send, {LAlt up} 
return


WheelLeft::     
    if(  not GetKeyState("WheelLeft")  )
        sleep 200

    Send, {LControl down}
    Send, {LAlt down}
    Send, {left}
    Send, {LControl up}
    Send, {LAlt up}
return        


RWin:: 
    Send, {Browser_Forward}
return

RWin funciona bem mesmo sem esse truque.

    
por 12.05.2016 / 12:12
1

Os temporizadores são ideais para reduzir os eventos repetidos para uma única ação. Toda vez que recebemos uma tecla / um clique repetido, redefinimos o intervalo do timer, para que a ação não aconteça até que finalmente liberemos a tecla / botão.

Eu uso este script com a inclinação da roda:

; Prevent warning if we hold a button too long
#MaxHotkeysPerInterval 200

~MButton & WheelRight::
    SetTimer ArrangeWindowRight, -50
return

~MButton & WheelLeft::
    SetTimer ArrangeWindowLeft, -50
return

ArrangeWindowRight:
    Send #{Right}
return

ArrangeWindowLeft:
    Send #{Left}
return

Então ArrangeWindowRight e ArrangeWindowLeft são chamados apenas 50ms depois eu libero a inclinação (observe o sinal negativo no intervalo do timer, para que seja executado apenas uma vez; sem ele, a função seria chamada novamente e novamente).

Quanto ao código do i3v, à primeira vista parece que tudo o que ele faz é retardar o último evento repetido ( sleep 200 if wheel is not pressed anymore ), então fico pensando qual foi a melhoria lá. Além disso, você pode reduzir os cinco envios para Send ^!{Right} .

Felicidades!

    
por 18.03.2017 / 01:26