MouseClickDrag minimizado

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

Eldorado
Posts: 7
Joined: 24 Oct 2018, 08:53

MouseClickDrag minimizado

26 Oct 2018, 20:45

Consigo clicar em X Y posição e selecionar um texto com o código abaixo, porém preciso fazer isso com o programa minimizado

Code: Select all

MouseClickDrag, L, 40, 710, 450, 710, 5 
ControlSend,, {ctrl down}{c}{ctrl up}
ControlSend,, {ctrl down}{v}{ctrl up}
Sleep, 500
ControlSend,, {Enter}


Por isso pesquisando verifiquei que é necessário o uso do SendMessage, mas estou confuso porque não funciona. Já tentei declarando o nome da Msg e atribuindo valores mas não vai. Não sei aonde estou errando, se a syntaxe ta errada.
Sendo:
1 - movimentar mouse
WM_MOUSEMOVE message: 0x0200
2 - clicar botao esquerdo mouse
WM_LBUTTONDOWN message: 0x0201
3 - movimentar mouse com clique para baixo
WM_MOUSEMOVE message: 0x0200
wParam = MK_LBUTTON: 0x0001

Code: Select all

SendMessage, 0x0200, , 40 710, ahk_class AQUICLASSNAME, TITULOPROGRAMA, , , , 4, ;MovimentarMouse X Y
SendMessage, 0x0201, , , ahk_class AQUICLASSENAME, TITULOPROGRAMA, , , , 4, ;ClicarBotãoEsquerdoMouse
SendMessage, 0x0200, 0x0001, 450 710, ahk_class AQUICLASSNAME, TITULOPROGRAMA, , , , 4, ;MovimentarMouse X Y
ControlSend,, {ctrl down}{c}{ctrl up}
ControlSend,, {ctrl down}{v}{ctrl up}
Sleep, 500
ControlSend,, {Enter}
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: MouseClickDrag minimizado

29 Oct 2018, 14:41

Bom dia Eldorado.

Executar uma série de ações do mouse em uma janela minimizada é algo possível, mas um tanto quanto problemático de deixar bem sincronizado e com boa confiabilidade. Isso acontece por razões de como o próprio Windows gerencia o cursor.

:arrow: Vejo, no entanto, que você quer copiar uma parte do texto de uma janela minimizada. Nesse caso, eu sugiro que tente usar o comando WinGetText aliado a uma rotina de manipulação do texto (buscando a parte do texto por palavras-chave ou por posição do caractere no texto). Os comandos que vão te ajudar nisso são os comandos de String (StringReplace, StringTrimLeft, StringTrimRight, SubStr(), StringGetPos, StringSplit, etc) e também, se você quiser ser mais detalhista no filtro do texto, as funções RegEx (RegExMatch() e RegExReplace())

Vou te dar um exemplo: O código abaixo abre o notepad, escreve um texto, e depois minimiza ele. Daí vem uma msgbox avisando que vai se preparar para coletar o texto daquela janela e daí, quando você clicar em OK, ele vai pegar o texto da janela minimizada e dele recortar os trechos-chave através de uma rotina de comandos de tratamento de texto que isolam logicamente as informações. Nesse caso, a rotina vai isolar os sabores indicados em cada linha.

Code: Select all

Run, Notepad.exe
WinWaitActive, Sem título - Bloco de notas
Send, Exemplo de Texto a ser escrito. O morcego gosta de: chocolate. `nA cabra gosta de: baunilha.`nO elefante gosta de: morango.
WinMinimize, Sem título - Bloco de notas
Msgbox, 0x1, Vamos começar, Ok, já temos a janela minimizada. Agora vamos coletar e isolar as informações dos sabores diretamente dela!

WinGetText, TEXTO_COMPLETO, Sem título - Bloco de notas

StringGetPos, POSICAO_DOS_DOIS_PONTOS, TEXTO_COMPLETO, :
CARACTERES_A_CORTAR := POSICAO_DOS_DOIS_PONTOS + 1
StringTrimLeft, TEXTO_COMPLETO, TEXTO_COMPLETO, %CARACTERES_A_CORTAR%
StringGetPos, POSICAO_DO_LINEFEED, TEXTO_COMPLETO, `.
PRIMEIRO_SABOR := SubStr(TEXTO_COMPLETO, 1, POSICAO_DO_LINEFEED)
msgbox % "Primeiro sabor: " . PRIMEIRO_SABOR

StringGetPos, POSICAO_DOS_DOIS_PONTOS, TEXTO_COMPLETO, :
CARACTERES_A_CORTAR := POSICAO_DOS_DOIS_PONTOS + 1
StringTrimLeft, TEXTO_COMPLETO, TEXTO_COMPLETO, %CARACTERES_A_CORTAR%
StringGetPos, POSICAO_DO_LINEFEED, TEXTO_COMPLETO, `.
SEGUNDO_SABOR := SubStr(TEXTO_COMPLETO, 1, POSICAO_DO_LINEFEED)
msgbox % "Segundo sabor: " . SEGUNDO_SABOR

StringGetPos, POSICAO_DOS_DOIS_PONTOS, TEXTO_COMPLETO, :
CARACTERES_A_CORTAR := POSICAO_DOS_DOIS_PONTOS + 1
StringTrimLeft, TEXTO_COMPLETO, TEXTO_COMPLETO, %CARACTERES_A_CORTAR%
StringGetPos, POSICAO_DO_LINEFEED, TEXTO_COMPLETO, `.
TERCEIRO_SABOR := SubStr(TEXTO_COMPLETO, 1, POSICAO_DO_LINEFEED)
msgbox % "Terceiro sabor: " . TERCEIRO_SABOR
O funcionamento da rotina acima é o seguinte: analisando o texto em questão, vi que os nomes dos sabores veem sempre antes de dois pontos. Vi também que o sabor está sempre antes de um ponto final. Assim, uso o comando StringGetPos para encontrar a primeira posição de caractere de dois pontos no texto. Depois, recorto tudo que estiver à esquerda dessa posição + 1 (para recortar o dois pontos juntos) e depois, do texto que sobrar, pego tudo do início (ou seja, de depois dos dois pontos) até a posição do linefeed, que é o marcador de término da linha `n.

Depois disso é só repetir a rotina que o próximo sabor já vai ser coletado também. Dava até para fazer uma função e chamar ela 3x com o restantes da string após cada corte e coleta.

:arrow: Quando quiser isolar informações de textos, procure por palavras ou acentuação chaves na hora de planejar rotinas de tratamento de texto para isolamento de informações. Para fazer isso, basta ler o texto a ser trabalhado e perceber o que muda e o que não muda nele. Use o que não muda para isolar o que muda. Dificilmente uma determinada janela terá um texto totalmente randômico, mas se tiver, você ainda poderá elaborar uma lista com as possíveis palavras chaves para determinar onde começam e onde terminam os trechos importantes e assim conseguir efetuar a rotina.

Espero que tenha ficado claro o que quiz dizer, mas se ainda tiver dúvida, basta postar aí embaixo :thumbup:

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 19 guests