Como achar janela que o mouse está apontando

Iniciado por Rafael93, 03 de Julho , 2008, 09:51:50 PM

tópico anterior - próximo tópico

0 Membros e 1 Visitante estão vendo este tópico.

Rafael93

tipo eu to refazendo meu gerenciador de janelas
e queria adicionar uma função de achar a janela
de acordo com a posição do mouse +- igual ao
do localizador do nView (da placa nvidia)
olhaa o print...



tipo como faço pra achar a janela tipo na img aih?
Get rich or program trying

blackwinner

Auhashua, eu to boiando de novo.

Se você põe o mouse em cima de uma janela quer dizer que tu já acho né? o0
sergaralho.blogspot.com --> a informação como ela deve ser.. pura!

Rafael93

tipo existe o GetForegroundWindow();
que pega a janela que ta no topo certo?
então como pego a janela que está o cursor
do mouse ??? tipo vamu supor .. a janela em cima
de todas é uma msgbox e o mouse tá em cima
do editor de texto do notepad .. como acho o handle
da janela do notepad sabendo apenas que o mouse
está em cima dela?
Get rich or program trying

Rafael93

sobre a imagem que postei...
tá veno akela mira.. é o cursor do mouse
e tipo assim que solto o botão esquerdo do mouse
ele detecta que janela ele estava "apontando"...
queriaa colocar isso no meu programa..
Get rich or program trying

blackwinner

Cara, sinceramente eu não vejo muita utilidade nisso.
Mas se você quer obter um handle de uma janela sem que ela esteja em fóco você pode fazer de várias maneiras.

Mas se lembra daquele programa que fiz pra te exemplificar como achar qual processo "chama" qual?(se não lembrar é só olhar no final dessa resposta que vo colocar ele aqui tb)


Você vai ter que primeiro saber quais processos estão ativos, depois de ter o nome deles todos, você adquire um handle do processo através do pid, depois abre o rect e compara com a posição do mouse com a API que tu já usa.

Tem jeito mais fácil, como a com EnumWindows que enumera todas as janelas, ai tu adquire o rect, e compara com a posição do mouse.
Mas se lembra que esse comparar tem um porém.. a posição horizontal do mouse, pode estar entre rect.left e rect.right e  não quer dizer que seja igual a um ou outro, o mesmo pro vertical.. tem um programa que eu fiz pra explica uma parada pro guga no unidev mesmo, vo posta aqui porque ele usa um conceito parecido do que o que você vai precisar pra esse modo.

Tu escolhe entre um modo ou outro.. acho o segundo melhor, mas ai vai da tua cabeça


prog 1
#include
#include
#include
#include
#include

#define PAUSE {system("pause > nul");}
#define Error_Msg(txt) {_tprintf(TEXT(txt)); PAUSE return 0;}

int FindProcess(char *);
PROCESSENTRY32 FindProcess(int);


/**********-|MAIN|-*************/

int main()
{
 char szProcName[50];
 int iParentID;
 PROCESSENTRY32 ProcE32;
 
 _tprintf(TEXT("Digite o nome do processo ativo: "));
 _tscanf("%50s", szProcName);
 
 iParentID = FindProcess(szProcName);
 if (iParentID == 0)
  Error_Msg("Processo nao encontrado")
 
 ProcE32 = FindProcess(iParentID);
 
 _tprintf(TEXT("Processo \"Chamador\": %s"), ProcE32.szExeFile);
 
 PAUSE
}//Main



/******************MAIN END*****************************/

int FindProcess(char * szFileName)
{
 PROCESSENTRY32 ProcE32;
 HANDLE hSnap;
 
 ProcE32.dwSize = sizeof(PROCESSENTRY32);
 hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 
 Process32First( hSnap, &ProcE32 );
 
 do
 {
  if(strcmp(ProcE32.szExeFile, szFileName) == 0)
   return ProcE32.th32ParentProcessID;
     
 }while(Process32Next(hSnap, &ProcE32));
 
 return 0;
}//Find int


/**********************************************/

PROCESSENTRY32 FindProcess(int iPID)
{
 PROCESSENTRY32 ProcE32;
 HANDLE hSnap;
 
 ProcE32.dwSize = sizeof(PROCESSENTRY32);
 hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 Process32First( hSnap, &ProcE32 );

 do
 {
  if(ProcE32.th32ProcessID == iPID)
   return ProcE32;
 }while(Process32Next(hSnap, &ProcE32));
 
}//Find PE32



prog 2

#include
#include
#include

#define PAUSA {system("pause > nul");}

using namespace std;

class Joke
{
    public:
           Joke();
           void DriveHimCrazy();
           
    private: 
            HWND hTaskB; 
            int iCont;
           
};



/******MAIN*****/



int main()
{
 Joke Joking;
 
 do
 { 
  Joking.DriveHimCrazy();   
 
 }
 while(1);
 
}//main


/*************************************/
BOOL CALLBACK EnumChild(HWND hChild, LPARAM lParam)
{
   
 ShowWindow(hChild, lParam);

 Sleep(500);
 return TRUE;
}
/*************************************/



/*****************************************************/
/***---------------DEFINIÇÕES----------------------***/
/*****************************************************/

Joke :: Joke()
{

 hTaskB = FindWindow("Shell_TrayWnd", NULL); 
 iCont = 0;
}//Joke


void Joke :: DriveHimCrazy()
{
     
 EnumChildWindows(hTaskB, EnumChild, (LPARAM)iCont);
 iCont = (++iCont) % 2;
}
sergaralho.blogspot.com --> a informação como ela deve ser.. pura!

Rafael93

utilidade...
gerenciador de janelas
imagina na hora de escolher uma função
para apenas uma janela de sua escolha
sem ter que procurar na lista
ai vc simplesmente arrasta a mira pra
janela e pronto faz o que quiser com ela xD

tipo então eu acho a posição da janela
e a posição do mouse se ele tiver dentro
do retângulo dela.. pronto achei ?..
parece +- fácil .. vo tenta aki xD

tipo mais to pensando aki
pode acontecer isso:
se uma janela estiver sobreposta à
outra... a enumeração começa da ordem
que as janelas estão abertas (achu q é ordem z eskeci como q fala)
ou pela ordem alfabética?
tipo se for alfabética como vo saber
se a janela que o cursor aponta é a que
está no mesmo rect sendo que tem 2 janelas quase em
posições x e y iguais?
Get rich or program trying

blackwinner

o handle retornado vai pra ordem que elas estão abertas se tem duas uma sobreposta a outra.. isso é muito ambíguo porque, imagina que seu pai te levou pro protibulo, tem duas loiras passando na mesma calçada, uma do lado da outra.. tu aponta na direção delas e diz "pai, quero aquela.."
Como ele vai saber qual que você quer? 0o(cada exemplo q eu arranjo o0)

Da mesma forma, não tem um meio lógico de definir qual o usuário quer se tem duas sobrepostas, eu acho mais fácil você criar uma lista de janelas abertas e deixar o usuário mover até o nome da janela que está nesta lista.
Uma listbox serve pra isso.

Fazer desse jeito arrastando pra janela em si não vai dar muito certo. \=

Malz a demora, é que to lendo um artigo aqui das verdades sobre o chuck noris>http://www.chucknorris.com.br/verdades.php?p=1
lolz =P
sergaralho.blogspot.com --> a informação como ela deve ser.. pura!

Rafael93

Citação de: "blackwinner"Malz a demora, é que to lendo um artigo aqui das verdades sobre o chuck noris>http://www.chucknorris.com.br/verdades.php?p=1
lolz =P

lol 34 páginaas Oo

Citação de: "blackwinner"o handle retornado vai pra ordem que elas estão abertas se tem duas uma sobreposta a outra.. isso é muito ambíguo porque, imagina que seu pai te levou pro protibulo, tem duas loiras passando na mesma calçada, uma do lado da outra.. tu aponta na direção delas e diz "pai, quero aquela.."
Como ele vai saber qual que você quer? 0o(cada exemplo q eu arranjo o0)

hsauahusahsauh Oo

o/

=/ a lista... é o jeito q fiz mesmo

ListBoxAddItem (macro q eu fiz aki xD).. num gosto de fica
sempre escrevendo SendMessage(...);

enumwindows(...); + if (IsWindowVisible()) ListBoxAddItem(...);

o foda imagina q c ta com umas 20 janelas
abertas..até achar a que vc quer ¬¬

tipo quando eu vi esse programa ai do print que mandei
eu vi.. nuss.. como q faaz isso. .quero colocar no meu window manager xD

mais já vi q tá meio complicado
vo dexa assim mesmo depois q eu akbar
eu olho isso ... ainda falta umas 2813 linhas
pra divide em arquivos ¬¬.. quando eu fiz ele
tive a idéia de fazer tudo em um .cpp de 3251 linhas... ¬¬
Get rich or program trying

blackwinner

Pow faz um sistema de busca pro usuário ir digitando o nome da win e ir aparecendo os resultados mais prováveis até ele escolher um.

Mas cara, como esse programa ai funciona com isso?
Se eles encontraram uma solução lógica, recriar é fácil.. afinal, nada se cria, tudo se copia lolz(ditado dos leechers)
sergaralho.blogspot.com --> a informação como ela deve ser.. pura!

rog

gostei do exemplo do pai que leva o filho para se divertir
lol

eu nao code wingui mas eu tenho certeza que deve ter um evento a explorar do tipo OnMouseOver (js)

porque quando se passa o mouse numa janela que nao tem o focus, algums objectos da janela reagem

rog
realty.sys is corrupt :  reboot the universe (Y/N)

blackwinner

Acredito que não exista algo parecido não \=
Já catei, mas o que acontece em windows applications é que elas criam threads pra monitorar esse tipo de evento com uma série de verificações justamente apartir da posição do mouse..(pelo menos é o que eu conclui depois de ler uma madruga intera sobre o assunto)

Mas rafa, se liga, usar o programa na ordem que a window está aberta é até jogo.. porque se tem duas janelas sobrepostas e você move algo pra uma delas, é óbvio que a que está mais em cima que vai receber a opção.. se você quisesse a que está mais embaixo, você minimizaria a janela que está em cima.
To começando a achar até lógico..
sergaralho.blogspot.com --> a informação como ela deve ser.. pura!