Lembre-se, uma vez tentando controlar o foco do sistema do Windows do cursor

esboço

Este estudo é principalmente para melhorar ainda mais o atual processo de ativação próprio software Alterful, para alcançar "não hot key" melhoramento teclado.
Embora o final não chegar perto da solução perfeita, mas também no processo de tentar algum progresso, é simplesmente gravou.

Aqui Insert Picture Descrição


Transferências do blog de desenvolvimento macaco: lembro de tentar controlar um foco de sistema do Windows do cursor

Na verdade, o estudo da natureza do problema é que não há esperança, se o foco de entrada entre sistema de monitoramento em tempo real, isto é, enquanto você está digitando na caixa de texto piscando cursor, mais precisamente deveria ser chamado de foco de entrada, ou "acento circunflexo ".

Resumida, existem duas maneiras básicas para conseguir isso.

一, GetGUIThreadInfo

Como um estado de controle deve ser de entrada, em geral, a janela principal é a janela superior da hora actual, e, portanto, considerado pela função GetGUIThreadInfo para obter informações sobre a janela de nível superior, de modo a determinar se ou não a janela de nível superior compreende o foco de entrada para determinar se a entrada global de foco que compreende .

A seguinte função de C ++ protótipo é em GetGUIThreadInfo de:

BOOL GetGUIThreadInfo(
  DWORD          idThread,
  PGUITHREADINFO pgui
);

Um parâmetro

valor que o parâmetro é idThread Para obter informações para um ID de thread de GUI, se é para obter uma janela especificada de Informações, em seguida, ele idThread pode ser obtido por GetWindowThreadProcessId, seu protótipo função é a seguinte:

DWORD GetWindowThreadProcessId(
HWND hWnd,
LPDWORD lpdwProcessId
);

Mas a janela de nível superior de informação que apenas quer tomar, felizmente idThread para aceitar NULL, e quando o NULL padrão acho uma janela de destino de entrada é a janela de topo, por isso aqui você pode passar diretamente NULL, ainda é muito conveniente.

parâmetro Two

O segundo parâmetro é um pgui PGUITHREADINFO ponteiro tipo de estrutura, as definições dadas no documento oficial da Microsoft que se segue:

typedef struct tagGUITHREADINFO {
  DWORD cbSize;
  DWORD flags;
  HWND  hwndActive;
  HWND  hwndFocus;
  HWND  hwndCapture;
  HWND  hwndMenuOwner;
  HWND  hwndMoveSize;
  HWND  hwndCaret;
  RECT  rcCaret;
} GUITHREADINFO, *PGUITHREADINFO, *LPGUITHREADINFO;

Em que a comparação é aqui útil para bandeiras, hwndFocus hwndCaret e três membros de dados, em que hwndFocus representa um identificador de janela tendo um foco do teclado, hwndCaret punho cursor indica uma janela de exibição, é bandeiras caracterizados e estado da rosca. bandeira de um total de cinco valores possíveis, especificamente mostrados abaixo:

Aqui Insert Picture Descrição

Quando as bandeiras == 1, a descrição do atual acento circunflexo janela piscar, significa que o actual sistema tem o foco de entrada, que pode ser inserido no estado.

Assim, é possível saber o caso específico da alavanca de controle de foco através hwndCaret. (Mas aqui a necessidade de esta informação não tem controle, mas para a maioria das outras circunstâncias e necessidades, estes dados são significativos, eles ainda mencionar)

Dois, GetCaretPos

função GetCaretPos é realmente usado para obter a posição atual do cursor, mas seu protótipo função:

BOOL GetCaretPos(
  LPPOINT lpPoint
);

Pode ser visto que o valor de retorno é um tipo booleano, e, portanto, podem ser utilizados para determinar se existe um cursor de entrada.

Obviamente GetCaretPos ser simples em termos de função em comparação com GetGUIThreadInfo muito, o que é determinado pela função da missão.

Você só pode começar a partir GetCaretPos "Existe um cursor?" E "Quais são as coordenadas do cursor?" A resposta a ambas as perguntas e informações GetGUIThreadInfo pode obter muito mais rica.

GetCaretPos funcionar sem quaisquer parâmetros de entrada significativas, apenas um ponteiro para receber as coordenadas do cursor de cliente lpPoint.

Se o cursor da tela atual, em seguida, a função retornará verdadeiro, se não houver nenhum cursor da tela, então a função retorna Falso, e pode ser GetLastError para obter a mensagem de erro.

Em terceiro lugar, o teste

Teste resulta na visão que tem sido dito, a menos de ideal. Em todas as janelas nativas já experimentadas (como o bloco de notas, Explorer, etc.) que podem ser obtidos informações normalmente cursor,

Mas na maior parte do desenvolvimento baseado em ATL ou WTL janela DirectUI (como QQ, WPS, Thunder) e entre quase todos os navegadores, GetCaretPos sempre retorna true, lpdwProcessId de bandeiras é sempre 0, o que significa que o cursor não podem obter informações.

A Internet para encontrar um dia também não conseguiu encontrar a causa do problema, embora haja algumas questões relevantes, mas não amarrar nó, e cerca de 10 anos atrás, o problema, de velhice, que é até agora ninguém encontrou uma solução eficaz caminho. Este problema só vêm temporariamente ao fim, se você tem o tempo livre para continuar depois de estudo, vai tentar aprofundar algumas das princípio rastreamento cursor de entrada de código aberto, se o progresso continua a voltar para atualização Benpian.

O que se segue é um processo de teste da FIG eficaz:

Aqui Insert Picture Descrição

--- FIM ---
Publicado 26 artigos originais · ganhou elogios 24 · vê 30000 +

Acho que você gosta

Origin blog.csdn.net/iSunwish/article/details/87927192
Recomendado
Clasificación