Como saber se o botão do mouse está pressionado?
03/12/2003
0
para eu saber se um botão do teclado está pressionado eu uso o GetkeyState.
Existe algo semelhante para o botão do ouse também?
Obrigado
Nildo
Posts
03/12/2003
Yankleber
Eu não sei exatamente como funciona, mas parece que existe uma mensagem do Delphi chamada WM_NCHITTEST que faz a detecção. Veja a rotina a seguir, que permite arrastar e mover forms sem barra de título, que usa esse recurso:
[i:54bc7d703a]Moving forms with no caption
To move a form with no caption, you must override WM_NCHITTEST message, like this:[/i:54bc7d703a]
type TForm1 = class(TForm) public procedure WMNCHitTest(var M: TWMNCHitTest); message WM_NCHitTest; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WMNCHitTest(var M: TWMNCHitTest); begin inherited; if M.Result = htClient then {if the mouse clicked on the form} M.Result := htCaption; {make windows think that mouse has been clicked on caption} end;
Espero que lhe ajude em alguma coisa!
03/12/2003
Nildo
function BotaoEsquerdoPressionado: Boolean; begin Result := ( GetAsyncKeyState( VK_LBUTTON ) and KF_UP ) > 0; end;
Mesmo assim obrigado pela ajuda!
03/12/2003
Yankleber
function BotaoEsquerdoPressionado: Boolean; begin Result := (GetAsyncKeyState(VK_LBUTTON) and KF_UP) > 0; end; procedure TForm1.FormClick(Sender: TObject); begin if not botaoesquerdopressionado then form1.label1.Caption := ´SIM!´; end;
Acontece que, só funciona se eu colocar o [b:06b0269772]not[/b:06b0269772] antes do teste da função. Também tentei mudar de VK_LBUTTON para VK_RBUTTON e também não faz a menor diferença, só funciona com o botão esquerdo mesmo.
Finalmente, parece que a rotina não retorna um valor booleano, mas sim uma coisa qualquer que eu não consegui identificar. Por que digo isso? Porque eu fiz o seguinte teste, e ela nunca imprime ´NÃO´.
function BotaoEsquerdoPressionado: Boolean; begin Result := (GetAsyncKeyState(VK_LBUTTON) and KF_UP) > 0; end; procedure TForm1.FormClick(Sender: TObject); begin if not botaoesquerdopressionado then form1.label1.Caption := ´SIM!´ else form1.label1.Caption := ´NÃO!´; end;
Não é gozado???
03/12/2003
Nildo
Coloca dentro de um timer de Interval 50 a verificacao do SIm/Nao. Dae voce pode segurar o botao clicado em qualquer lugar do Windows que funciona.
Porque se estiver dentro de um Botao, acho que dá erro quando voce esta com o botao pressionado e depois apertar o Button.
03/12/2003
Beppe
A função que o nildo postou está correta.
O problema é que você está confundindo os ´paradigmas´. O ato que clicar o botão envolve pressionar e [b:aed130469a]soltar[/b:aed130469a] o botão do mouse, logo, quando o evnto OnClick é disparado o botão não está mais sendo pressionado. Tente a função com o OnMouseDown.
13/03/2004
Lipsil
vi q para mover uma janela sem precisar arrastar pelo caption lá basta colocar o seguinte:
type TForm1 = class(TForm) public procedure WMNCHitTest(var M: TWMNCHitTest); message WM_NCHitTest; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WMNCHitTest(var M: TWMNCHitTest); begin inherited; if M.Result = htClient then {if the mouse clicked on the form} M.Result := htCaption; {make windows think that mouse has been clicked on caption} end;
bem, e esse arrasta tudo, até por cima dos meus botões skins q são em imagem ele arrasta não dando assim para clicar, então como fazer para ele arrasta apenas quando pegar no picture1 q fica de fundo do form?
Valew
13/03/2004
Lipsil
http://delphiforum.icft.com.br/forum/viewtopic.php?t=30372
Valew
Clique aqui para fazer login e interagir na Comunidade :)