Como saber se o botão do mouse está pressionado?

03/12/2003

3

Olá!
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


Responder

Posts

03/12/2003

Yankleber

Olá!

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!


Responder

03/12/2003

Nildo

O que eu queria mesmo era obter o estado do botão do mouse, se estava pressionado ou não. Mas já consegui fazer um função para isso:

function BotaoEsquerdoPressionado: Boolean;
begin
   Result := ( GetAsyncKeyState( VK_LBUTTON ) and KF_UP ) > 0;
end;


Mesmo assim obrigado pela ajuda!


Responder

03/12/2003

Yankleber

Oi, legal que você resolveu, mas... olha só que coisa estranha: eu fiquei curioso com a sua função e resolvi implementá-la, com o seguinte programinha:

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???


Responder

03/12/2003

Nildo

yankleber, você pode fazer o seguinte teste:

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.


Responder

03/12/2003

Beppe

Olá. . .

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.


Responder

13/03/2004

Lipsil

Olá pessoal,
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


Responder

13/03/2004

Lipsil

Achei a resposta em:
http://delphiforum.icft.com.br/forum/viewtopic.php?t=30372

Valew


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira