Leudassdf Posted July 5, 2012 at 12:02 PM Report #467406 Posted July 5, 2012 at 12:02 PM 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
Will_dvp Posted July 5, 2012 at 02:55 PM Report #467461 Posted July 5, 2012 at 02:55 PM 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.
jlpcalado Posted July 5, 2012 at 04:44 PM Report #467513 Posted July 5, 2012 at 04:44 PM (edited) 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 July 6, 2012 at 01:16 PM by Weasel Geshi
Lukas S. Posted July 5, 2012 at 04:45 PM Report #467514 Posted July 5, 2012 at 04:45 PM (edited) 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 July 5, 2012 at 04:51 PM 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.
Leudassdf Posted July 5, 2012 at 05:52 PM Author Report #467528 Posted July 5, 2012 at 05:52 PM 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
jlpcalado Posted July 5, 2012 at 07:42 PM Report #467539 Posted July 5, 2012 at 07:42 PM 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)
Leudassdf Posted July 6, 2012 at 09:18 AM Author Report #467617 Posted July 6, 2012 at 09:18 AM 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now