Jump to content
Fórum Script Brasil
  • 0

Ponteiro Se Movimentando Sozinho. Como Fazer?


Paulo Nobre
 Share

Question

Eu de novo!

Tenho um programa que quando é aberto pela primeira vez mostra uma messagebox dizendo que o ícone do programa está na área de notificação (ex-tray) em fim ao lado do relógio.

A messagebox está no centro com um botão ok.

Gostaria de saber como fazer para quando clicar no ok o ponteiro do mouse se movimente,obviamente sozinho, até o ícone do programa que se encontra na área de notificação, .

Alguém sabe o código para fazer isto?

Link to comment
Share on other sites

Recommended Posts

  • 0
Guest Visitante

fiz algo parecido uma vez!!!! to sem o delphi aqui agora(faculdade)

tente a função

mouse.position ou algo assim!!!!!, mas é com "mouse."

me desculpa ser tão vago assim, mas é que não tenho como testar!!!

flow !! espero ter ajudado!!!

Link to comment
Share on other sites

  • 0

Paulo, seria possível se o campo FData do TTrayIcon não estivesse em private, aí usaríamos o handle do ícone para achar sua posição e jogar o cursor para lá com SetCursorPos ou Mouse.CursorPos.

Isso é uma coisa que eu acho horrível no delphi, deixar campos inacessíveis. Afinal é melhor uma coisa ser acessível do que não ser, porque mesmo que você não precise acessar ela, ela estará lá para se algum dia for necessária e não irá atrapalhar em nada. Nesse aspecto eu sou a favor do Turbo Pascal onde todos os campos são acessíveis de qualquer lugar.

Não vou falar pra você modificar o código do Delphi porque eu já tentei fazer isso e não deu certo, foi como se eu não tivesse modificado nada.

Com certeza algum outro colega saberá de uma maneira de fazer isso, pois essa que citei provavelmente não é a única. Alguém que conheça bem a API do Windows deve conhecer uma função para fazer isso.

Link to comment
Share on other sites

  • 0

É o seguinte, eu consegui ter acesso ao handle do Icon mas ele não especifica uma janela a qual podemos ter acesso a sua área. Depois fui descobrir que toda a bandeja é uma janela, então quando chagarmos muito longe vamos conseguir apenas jogar o mouse pra cima da bandeja, mas não em cima do seu ícone.

Constatei isso com um programa que escreví que mostra o Handle da janela daonde o mouse está e o ID do processo que a possui. Aí fica fácil, é só ir mexendo o mouse e vizualizar o Handle e o processo de cada janela.

Mas o problema é que eu não sei como obter o handle da bandeja, alguém tem alguma idéia?

Link to comment
Share on other sites

  • 0

function gettrayhandle: HWND;

var

hnd: HWND;

begin

hnd := findwindow('Shell_TrayWnd', nil);

hnd := findwindowEx(hnd,0, 'TrayNotifyWnd', nil) ;

hnd := findwindowEx(hnd,0, 'SysPager', nil) ;

result := hnd;

end;

se quiser testar

showwindow(gettrayhandle, sw_hide);

mas paulo nobre, você teria que dar um "lock" no mouse, dificilmente o cara vai ficar sem mexer

o mouse, senao o efeito que você quer vai ficar bem jururu auhsshua

abraço

Link to comment
Share on other sites

  • 0

É o seguinte, eu consegui ter acesso ao handle do Icon mas ele não especifica uma janela a qual podemos ter acesso a sua área. Depois fui descobrir que toda a bandeja é uma janela, então quando chagarmos muito longe vamos conseguir apenas jogar o mouse pra cima da bandeja, mas não em cima do seu ícone.

Thales,depois que postei fiquei pensando nisto. Mesmo achando uma maneira, o mouse iria para a bandeja e não para o ícone!

mas paulo nobre, você teria que dar um "lock" no mouse, dificilmente o cara vai ficar sem mexer

o mouse, senao o efeito que você quer vai ficar bem jururu auhsshua

Churc,a idéia seria implementar isto visando aqueles usuários com muito pouca experiência.

Pois neste caso o ponteiro iria para cima do programa.

Achei que mesmo ele mechendo um pouco o mouse, em algum momento ele iria parar e depois disso

o ponteiro iria para cima do ícone.

Mas, estou achando que viajei demais!

function gettrayhandle: HWND;
var
hnd: HWND;
begin
hnd := findwindow('Shell_TrayWnd', nil);
hnd := findwindowEx(hnd,0, 'TrayNotifyWnd', nil);
hnd := findwindowEx(hnd,0, 'SysPager', nil);
result := hnd;
end;

se quiser testar

showwindow(gettrayhandle, sw_hide);

estou sem o Delphi aqui na escola.

Churc, esta função seria apenas para achar o handle da bandeja, é isto?

Link to comment
Share on other sites

  • 0

isso, somente pega o handle da bandeja...

sabe o que você pode fazer, vo viajar hein, mas capaz que fique legal, seguinte...

tem um função vo ver se acho, que faz screenshot certo, mas voce

passa o tamanho e posicao da tela, então, a ideia é fazer uma ss

da bandeja já com o ícone, salva em uma pasta temporária, e a

janela que fala que o programa vai ficar minimizado na bandeja

carregar essa imagem, assim fica facil reconhecer...

Mais ou menos como alguns programas fazem, só que eles não

criam uma screenshot da bandeja em tempo real, apenas tem

uma deles proprio, ou você pode fazer isso, faz uma própria com

um efeito...

rsr

se achar legal a gente te ajuda a fazer...

abraço

Link to comment
Share on other sites

  • 0

function gettrayhandle: HWND;
var
hnd: HWND;
begin
hnd := findwindow('Shell_TrayWnd', nil);
hnd := findwindowEx(hnd,0, 'TrayNotifyWnd', nil);
hnd := findwindowEx(hnd,0, 'SysPager', nil);
result := hnd;
end;

se quiser testar

showwindow(gettrayhandle, sw_hide);

Churc, não deu certo, com a primeira linha ele esconde a barra de tarefas toda, e as outras 2 não escondem nada, e o cursor vai para o final da tela em baixo. E tenho certeza que é possível pegar porque fiz ela sumir com WindowFromPoint. Então você deve estar errando no 'Shell_TrayWnd', 'TrayNotifyWnd', 'SysPager'.

Até agora estou sem meu Tray.

Link to comment
Share on other sites

  • 0

Churc, não deu certo, com a primeira linha ele esconde a barra de tarefas toda, e as outras 2 não escondem nada, e o cursor vai para o final da tela em baixo. E tenho certeza que é possível pegar porque fiz ela sumir com WindowFromPoint. Então você deve estar errando no 'Shell_TrayWnd', 'TrayNotifyWnd', 'SysPager'.

Até agora estou sem meu Tray.

Seguinte, dar certo dá porque eu jamais postaria algo assim sem testar, agora o que pode estar acontecendo é seu Windows ser diferente do XP, então possa ser que mude alguma classe...

como eu só tenho o XP aqui no trampo e em casa então não testei em outros windows...

Link to comment
Share on other sites

  • 0

Seguinte, dar certo dá porque eu jamais postaria algo assim sem testar, agora o que pode estar acontecendo é seu Windows ser diferente do XP, então possa ser que mude alguma classe...

como eu só tenho o XP aqui no trampo e em casa então não testei em outros windows...

Meu Windows aqui é XP. Vou fazer mais uns testes. Mas me diga, você testou e os ícones do Tray sumiram mesmo???

Link to comment
Share on other sites

  • 0

Eu de novo!

Tenho um programa que quando é aberto pela primeira vez mostra uma messagebox dizendo que o ícone do programa está na área de notificação (ex-tray) em fim ao lado do relógio.

A messagebox está no centro com um botão ok.

Gostaria de saber como fazer para quando clicar no ok o ponteiro do mouse se movimente,obviamente sozinho, até o ícone do programa que se encontra na área de notificação, .

Alguém sabe o código para fazer isto?

Olá Paulo, o que sei é que dá para saber o TRect dos botões que estão no tray; agora para identificar qual botão é de que programa, isso eu não sei.

Link to comment
Share on other sites

  • 0
Olá, tente assim:
  ShowWindow(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'TrayNotifyWnd', nil), SW_Hide);

É quase isso, esse pega o handle da janela que contém os ícones de notificação e o relógio. Dentro dela ainda tem outra janela só para os ícones. Mas já está bem melhor, agora o mouse já vai pra perto do ícone e é possível capturar o tray. Onde é que você descobre essas coisas?
Link to comment
Share on other sites

  • 0

Olá Paulo, o que sei é que dá para saber o TRect dos botões que estão no tray; agora para identificar qual botão é de que programa, isso eu não sei.

Olá s3c, bom ver você de novo por aqui.

Como o Thales disse no tópico acima pelo menos agora o ponteiro já vai para cima do tray.

É quase isso, esse pega o handle da janela que contém os ícones de notificação e o relógio. Dentro dela ainda tem outra janela só para os ícones. Mas já está bem melhor, agora o mouse já vai pra perto do ícone e é possível capturar o tray.

Thales como você mesmo colocou acima agora já tá bem perto.

Link to comment
Share on other sites

  • 0

opa Thales,

então o programa que eu usei pra pegar chama-se WinDowse

esse programa muito bom, mostra muitaa informação sobre uma janela, e por exemplo, eu coloquei o mouse emcima dos icones ele mostrou

SysPager

TrayNotifyWnd

Shell_TrayWnd

a ordem correta é de baixo pra cima, então como TrayNotifyWnd é child da Shell_TrayWnd e SysPage também então eu usei o FindWindowEx...

putz mais te juro mesmo que aqui funciona auhahus, aqui a janelinha dos icones é a SysPager, se acha

que eu ia postar algo que não funciona...

"Mas isso é bom, sabe porque, já mostra que não vai ser igual pra todos os computadores, sei lá, talvez

algo como versão do Windows, Service Pack mude..."

baixa o WinDowse ai...

http://baixaki.ig.com.br/site/detail3965.htm

abraços

Link to comment
Share on other sites

  • 0
baixa o WinDowse ai...
Pow, valeu Churc, vou baixar. Com truques qualquer um sabe :lol: . Brincadeira.

putz mais te juro mesmo que aqui funciona auhahus, aqui a janelinha dos icones é a SysPager, se acha

que eu ia postar algo que não funciona...

Mil perdões, seu código funciona perfeitamente, eu é que sou uma besta e fiz errado. Agora sim está perfeito. Conseguí capturar somente os ícones. Mais uma vez desculpe.
Link to comment
Share on other sites

  • 0
baixa o WinDowse ai...
Muito bom esse programa. É a solução para vários mistérios que de outro modo não saberíamos sem ver o código dos programas. Ele mostra até o nome das classes. É feito em Delphi, não é?
Link to comment
Share on other sites

  • 0
Olá, tente assim:
  ShowWindow(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'TrayNotifyWnd', nil), SW_Hide);

É quase isso, esse pega o handle da janela que contém os ícones de notificação e o relógio. Dentro dela ainda tem outra janela só para os ícones. Mas já está bem melhor, agora o mouse já vai pra perto do ícone e é possível capturar o tray. Onde é que você descobre essas coisas?

Bom, é só ir dando umas fuçadas.

Por ex, para mim no XP a janela Shell_TrayWnd é a última barra do Windows e se der um SW_Hide ela some por inteiro. Aí é só ir fazendo uma recursão com o Handle dessa janela e utilizando GetWindow com parâmetros GW_Child e GW_HwndNext para descobrir suas janelas descendentes.

Pelo que entendí, os ícones no tray não são janelas e sim botões que pertencem à janela 'Notification Area'.

Esse link mostra como capturar o TRect desses botões, mas para saber qual programa pertence a qual botão do tray, isso também queria saber porque aí dá para colocar o mouse em cima dele.

Olá s3c, bom ver você de novo por aqui.

Como o Thales disse no tópico acima pelo menos agora o ponteiro já vai para cima do tray.

Pois é, estava meio ocupado nesse último mês.
Link to comment
Share on other sites

  • 0

opa

bom acho que assim da certo, pelo seguinte, o windows adiciona o último ícone no Tray em primeira posição, então, se ele colocar o ícone e logo em seguida fazer o movimento do mouse, acho difícil outra aplicação já jogar o ícone lá no mesmo momento...

seria algo assim

Function GetTrayHandle: HWND;

var

h1, h2, h3: HWND;

begin

//Pega o handle da barra do menu iniciar

h1 := FindWindow('Shell_TrayWnd', nil);

//Pega o handle da barra que contém o relógio e o Tray

h2 := FindWindowEx(h1, 0, 'TrayNotifyWnd', nil);

//Pega o handle do Tray, onde ficam os ícones...

h3 := FindWindowEx(h2, 0, 'SysPager', nil);

//Se h3 é maior que zero, então achou a janela, e o resultado

//é o handle desta

Result := h3;

end;

var

hrect: TRect;

begin

if (GetWindowRect(gettrayhandle, hrect)) then

SetCursorPos(hrect.Left + 8, hrect.Top + 8) else

ShowMessage('Opss... tray não encontrado =P');

end;

Ai o mouse vai parar emcima do Tray, na posição Left 0

Sendo assim, como o Windows coloca todo novo ícone no Left 0 ai o mouse vai parar certinho emcima...

O + 8 seria pelo seguinte, os ícones do tray tem o tamanho de 16, então pra colocar o mouse bem no meio

do primeiro ícone, seria left 0 + 8 que é a metade do tamanho 16 blah asuhasuh

mas ainda da pra melhorar...

abraço

Link to comment
Share on other sites

  • 0

Com esse link que o s3c postou daria pra pegar exatamente o retangulo do ícone do seu programa, porque alí você fornece o handle do ícone, aquele que está na estrutura NotifyIconData do seu ícone. Pena que está em C.

Link to comment
Share on other sites

  • 0

Pessoal, dando um pitaco por aqui...

Uma outra opção, que depende de estar instalado no mínimo o IE 5 (bastante comum ser posterior), seria mostrar a informação num balãozinho (como aquele que aparece quando você pluga algo na USB).

Para tal, faz-se uso da função API Shell_NotifyIcon (ref. msdn).

Exemplo 1 (AJPD Software - Espanhol) -> link

Exemplo 2 (Torry's Delphi Pages - Inglês) -> link

Se a idéia for válida, acho que pouparia alguma dor de cabeça.

Churc, esse WinDowse faz mais ou menos o que fazia o WinSight que vinha com o Delphi3?

[]s

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.8k
    • Total Posts
      648.8k
×
×
  • Create New...