Como saber se o botão do mouse está pressionado?
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
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
Curtidas 0
Respostas
Yankleber
03/12/2003
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]
Espero que lhe ajude em alguma coisa!
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!
GOSTEI 0
Nildo
03/12/2003
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:
Mesmo assim obrigado pela ajuda!
function BotaoEsquerdoPressionado: Boolean; begin Result := ( GetAsyncKeyState( VK_LBUTTON ) and KF_UP ) > 0; end;
Mesmo assim obrigado pela ajuda!
GOSTEI 0
Yankleber
03/12/2003
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:
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´.
Não é gozado???
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???
GOSTEI 0
Nildo
03/12/2003
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.
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.
GOSTEI 0
Beppe
03/12/2003
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.
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.
GOSTEI 0
Lipsil
03/12/2003
Olá pessoal,
vi q para mover uma janela sem precisar arrastar pelo caption lá basta colocar o seguinte:
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
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
GOSTEI 0
Lipsil
03/12/2003
Achei a resposta em:
http://delphiforum.icft.com.br/forum/viewtopic.php?t=30372
Valew
http://delphiforum.icft.com.br/forum/viewtopic.php?t=30372
Valew
GOSTEI 0