Jump to content
Leudassdf

saber a localizaçao de uma janela de um outro programa

Recommended Posts

Leudassdf

Boas pessoal,

Estive a procurar como obter as coordenadas de um programa que esteja aberto no meu computador. Imaginemos que temos o notpad e o word aberto. Eu tenho o meu form e quero saber qual a localizaçao do notpad. Alguem sabe como se pode fazer?

Ate agora so encontrei algumas informaçoes me c# mas nao e uma linguagem que eu perceba.

Quem poder ajuda agradeço

Cumprimentos

Share this post


Link to post
Share on other sites
Will_dvp

Oi,

Não sei se o .net framework te oferece métodos para isso, pois acredito que o notepad não foi desenvolvido em ambiente gerenciado, portanto acredito que deverás usa InterOperabilidade, fiz um exemplo e deu certo, abaixo o código (infelizmente em c#, pois não sei vb :B):


using System;
using System.Runtime.InteropServices;

namespace InterOp
{
class Program
{
static void Main(string[] args)
{
WindowHandler wh = new WindowHandler();

Console.WriteLine("Top: {0}, Bottom: {1}, Left: {2}, Right: {3}", wh.rect.top, wh.rect.bottom, wh.rect.left, wh.rect.right);
}
}

class WindowHandler
{
[DllImport("User32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("User32.dll")]
public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);

[structLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}

public IntPtr handle = (IntPtr)0;
public RECT rect;

public WindowHandler()
{
handle = WindowHandler.FindWindow(null, "Sem título - Bloco de notas");
WindowHandler.GetWindowRect(handle, out rect);
}
}
}
Eu testei e ele me gerou a seguinte saida:
Top: 192, Bottom: 459, Left: 321, Right: 840
Ps: eu utilizei uma ferramenta online que converte códigos entre c# e vb.net, a saida foi a seguinte:
Imports System.Runtime.InteropServices

Namespace InterOp
Class Program
	Private Shared Sub Main(args As String())
		Dim wh As New WindowHandler()

		Console.WriteLine("Top: {0}, Bottom: {1}, Left: {2}, Right: {3}", wh.rect.top, wh.rect.bottom, wh.rect.left, wh.rect.right)
	End Sub
End Class

Class WindowHandler
	<DllImport("User32.dll")> _
	Public Shared Function FindWindow(lpClassName As String, lpWindowName As String) As IntPtr
	End Function

	<DllImport("User32.dll")> _
	Public Shared Function GetWindowRect(hwnd As IntPtr, ByRef lpRect As RECT) As Boolean
	End Function

	<StructLayout(LayoutKind.Sequential)> _
	Public Structure RECT
		Public left As Integer
		Public top As Integer
		Public right As Integer
		Public bottom As Integer
	End Structure

	Public handle As IntPtr = CType(0, IntPtr)
	Public rect As RECT

	Public Sub New()
		handle = WindowHandler.FindWindow(Nothing, "Sem título - Bloco de notas")
		WindowHandler.GetWindowRect(handle, rect)
	End Sub
End Class
End Namespace
 

Espero ter ajudado, talvez alguem com mais experiência possa te dar uma resposta melhor amigo.

Abs.

Share this post


Link to post
Share on other sites
jlpcalado

Um exemplo:

Public Class Form1
Declare Function GetWindowRect Lib "user32.dll" (ByVal hwnd As Int32, ByRef lpRect As RECT) As Int32
Declare Function SetCursorPos Lib "user32.dll" (ByVal x As Int32, ByRef y As Int32) As Int32
Structure RECT
 Public Left As Int32
 Public Top As Int32
 Public Right As Int32
 Public Bottom As Int32
End Structure
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 'Carregar os processos numa listbox
 ListBox1.Items.Clear()
 For Each p As Process In Process.GetProcesses
	 If p.MainWindowTitle = String.Empty = False Then
		 ListBox1.Items.Add(p.ProcessName & " - " & p.MainWindowTitle & " # " & p.Id)
	 End If
 Next
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
 Try
	 Dim pid = ListBox1.SelectedItem.ToString.Substring(ListBox1.SelectedItem.ToString.IndexOf(" # "))
	 pid = pid.Replace(" # ", "") 'Identificador daa aplicaçao
	 Dim p As Process = Process.GetProcessById(pid)
	 Dim r As RECT
	 GetWindowRect(p.MainWindowHandle, r)
	 'Coordenadas da janela da aplicaçao - se estiver minimizada os valores podem ser negativos
	 MsgBox(R.Left.ToString & ", " & R.Top.ToString & ", " & R.Bottom.ToString & ", " & R.Right.ToString)
	 'Colocar o rato no canto superior esquerdo
	 Dim Pnt As Point
	 Pnt.X = R.Left
	 Pnt.Y = R.Top
	 Me.Cursor = New Cursor(Cursor.Current.Handle)
	 Cursor.Position = New Point(Pnt.X, Pnt.Y)
 Catch ex As Exception
 End Try
End Sub
End Class

Edited by Weasel
Geshi

Share this post


Link to post
Share on other sites
Lukas S.

Tanto código esta gente xD .... Eis uma forma simples e limpa de fazer

Dim hwnd As IntPtr = WindowFromPoint(Cursor.Position)
 RefreshWindow(hwnd)
 Dim rect As Rectangle = GetWindowRect(hwnd)
 Dim bmp As New Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb)
 Dim g As Graphics = Graphics.FromImage(bmp)
 g.InterpolationMode = Drawing2D.InterpolationMode.Bicubic
 g.CopyFromScreen(rect.Left, rect.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy)
 imageall = bmp
 'Dim Box As MsgBoxResult = MsgBox("Do you want to save this screenshot?", MsgBoxStyle.YesNo)
 'If Box = MsgBoxResult.Yes Then
 ' bmp.Save("Lucas" & Now.Second & ".Png", ImageFormat.Png)
 'Else
 ' MsgBox("Limpo!")
 ' bmp.Dispose()
 'End If

Mete o meu nome nesses créditos... já resolvi metade do teu programa xD .... quanto aos ' foi porque eu pus esse código num form para confirmar tipo se ele se enganou ou não ... tá girito o programa mas nunca mais toquei nele e ficou pendente

Att: Este código dá te a Imagem do programa que está aberto e só do programa mais nada .... se quiseres da cordenada é simples e até menos linhas que isso .. procura um bocado o fórum não pode programar por ti ... em menos de 1 semana vários tópicos em relação a este programa ... exprimenta tu fazer uma pesquisa básica no google que encontras depois é adaptares o código... neste caso eu tinha cá o programa mas o pessoal não pode tar sempre aqui a disponibilizar códigos ...

Edited by Lukas S.

E o Impossível foi criado por pessoas fracas pra acabar com o sonho das pessoas fortes. Não deixes que acabem com o teu. Sonha , luta , ambiciona e realiza. Se amas , se gostas tu vais conseguir. Cala todas as pessoas que um dia duvidaram de ti e prova que foste mais forte de qualquer outro.

Share this post


Link to post
Share on other sites
Leudassdf
Em 7/5/2012 às 17:44, jlpcalado disse:

Um exemplo:


Public Class Form1
Declare Function GetWindowRect Lib "user32.dll" (ByVal hwnd As Int32, ByRef lpRect As RECT) As Int32
Declare Function SetCursorPos Lib "user32.dll" (ByVal x As Int32, ByRef y As Int32) As Int32
Structure RECT
 Public Left As Int32
 Public Top As Int32
 Public Right As Int32
 Public Bottom As Int32
End Structure
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 'Carregar os processos numa listbox
 ListBox1.Items.Clear()
 For Each p As Process In Process.GetProcess ' o que faz aqui?
	 If p.MainWindowTitle = String.Empty = False Then
		 ListBox1.Items.Add(p.ProcessName & " - " & p.MainWindowTitle & " # " & p.Id)
	 End If
 Next
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
 Try
	 Dim pid = ListBox1.SelectedItem.ToString.Substring(ListBox1.SelectedItem.ToString.IndexOf(" # ") 'o indexof faz mesmo o que?
	 pid = pid.Replace(" # ", "") 'Identificador daa aplicaçao
	 Dim p As Process = Process.GetProcessById(pid)
	 Dim r As RECT
	 GetWindowRect(p.MainWindowHandle, r)
	 'Coordenadas da janela da aplicaçao - se estiver minimizada os valores podem ser negativos
	 MsgBox(R.Left.ToString & ", " & R.Top.ToString & ", " & R.Bottom.ToString & ", " & R.Right.ToString)
	 'Colocar o rato no canto superior esquerdo
	 Dim Pnt As Point
	 Pnt.X = R.Left
	 Pnt.Y = R.Top
	 Me.Cursor = New Cursor(Cursor.Current.Handle)
	 Cursor.Position = New Point(Pnt.X, Pnt.Y)
 Catch ex As Exception
 End Try
End Sub
End Class
 

Boas jlp

Antes de mais obrigada pelo seu exemplo. Muito bom mesmo. antes de mais seria possivel explicar os pontos acima citados?

ja agora o que representa o: hwnd e o lpRect?

E tambem como faço para conseguir mudar a sua localizaçao?

Mais uma vez obrigada

Cumprimentos

Share this post


Link to post
Share on other sites
jlpcalado

hnwd e lpRect sao acr´onimos para handle window e apontador para uma estrutura RECT. Sao uma mera indicaç~ao para o tipo de objetos a que se referem - podes substituir pelo que quiseres.

Como diz o Lukas, convem que faças um pouco de pesquisa por ti proprio.

Pesquisa a API user32.dll - podes ver que existem varias funçoes ...

No caso do que pretendes, por esta vez:

Public Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, _

ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long

No exemplo que te mandei podes colocar a seguir a 'GetWindowRect(p.MainWindowHandle, r)':

MoveWindow(p.MainWindowHandle, r.Left + 100, r.Top + 100, r.Right - r.Left, r.Bottom - r.Top,

True)

Share this post


Link to post
Share on other sites
Leudassdf

Tanto código esta gente xD .... Eis uma forma simples e limpa de fazer

Dim hwnd As IntPtr = WindowFromPoint(Cursor.Position)
 RefreshWindow(hwnd)
 Dim rect As Rectangle = GetWindowRect(hwnd)
 Dim bmp As New Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb)
 Dim g As Graphics = Graphics.FromImage(bmp)
 g.InterpolationMode = Drawing2D.InterpolationMode.Bicubic
 g.CopyFromScreen(rect.Left, rect.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy)
 imageall = bmp
 'Dim Box As MsgBoxResult = MsgBox("Do you want to save this screenshot?", MsgBoxStyle.YesNo)
 'If Box = MsgBoxResult.Yes Then
 ' bmp.Save("Lucas" & Now.Second & ".Png", ImageFormat.Png)
 'Else
 ' MsgBox("Limpo!")
 ' bmp.Dispose()
 'End If

Mete o meu nome nesses créditos... já resolvi metade do teu programa xD .... quanto aos ' foi porque eu pus esse código num form para confirmar tipo se ele se enganou ou não ... tá girito o programa mas nunca mais toquei nele e ficou pendente

Att: Este código dá te a Imagem do programa que está aberto e só do programa mais nada .... se quiseres da cordenada é simples e até menos linhas que isso .. procura um bocado o fórum não pode programar por ti ... em menos de 1 semana vários tópicos em relação a este programa ... exprimenta tu fazer uma pesquisa básica no google que encontras depois é adaptares o código... neste caso eu tinha cá o programa mas o pessoal não pode tar sempre aqui a disponibilizar códigos ...

OK

eu compreendo mas eu fiz varias pesquisas acreditem ou nao mas aquilo que encontrei era em c# e eu nao percebo nada daquilo.

Obrigada

Cumprimentos

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.