Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Узнать хендл активного окна


Автор: Doff 15.11.2007, 17:03
Здравствуйте, уважаемые коллеги!
Я начинающий программист, студент.
В процессе работы над своим проектом у меня возник следующий вопрос:
Как на VB.NET узнать хэндл текущего окна? GetActiveWindow, как я понимаю, позволяет узнать только хэндл окна самой программы. Надо же узнать хэндл активного окна, а по нему узнать: заголовок окна, .exe программы, размеры окна и его положение на экране. Важно то, что хэндл необходимо узнать у окна в фокусе, а не под курсором. Нашел много исходников, но они узнают хэндл под курсором.
Почитав MSDN, узнал, что есть функция GetGUIThreadInfo, но как ей воспользоваться, я не знаю.
У кого-нибудь есть идеи?

Автор: Baa 16.11.2007, 17:04
GetForegroundWindow 4 life ;-)

Автор: Doff 16.11.2007, 19:22
Спасибо! Заработало кое-как.
Но вопрос до конца не решен: как теперь узнать .exe процесса? Какой API-функцией можно это сделать?
И вопрос на засыпку - где можно достать самый полный список описаний API-функций? Я пользуюсь программой "WinAPI Справочник" с сайта kas-cor.narod.ru, но там не все функции описаны.

Автор: Baa 17.11.2007, 00:54
GetWindowModuleFileName ;-)
msdn.microsoft.com

Автор: Doff 17.11.2007, 16:55
В MSDN я нашел инфу об этой функции:
"GetWindowModuleFileName & GetModuleFileName Work Only with the Calling Process         
It doesn't work for other processeses on Windows 2000, XP and Vista. See http://support.microsoft.com/?id=228469."
Зато есть функция GetModuleFileNameEx, которая требует прямого указания файла (зачем?).
Так вот, я никак не могу взять в толк, как заставить программу считывать .exe текущего окна. Неужели это такая трудноступная функция?
Baa, за помощь спасибо, но все-таки тема до конца не раскрыта.

Автор: Baa 17.11.2007, 23:10
Тогда можно отыскать по процессу. Получим ид процесса по окошку, дальше не сложно smile
GetWindowThreadProcessId

Автор: Walker 19.11.2007, 10:59
Цитата

И вопрос на засыпку - где можно достать самый полный список описаний API-функций? Я пользуюсь программой "WinAPI Справочник" с сайта kas-cor.narod.ru, но там не все функции описаны. 

Самая полная информация о Win Platform API в http://www.microsoft.com/downloads/details.aspx?FamilyId=484269E2-3B89-47E3-8EB7-1F2BE6D7123A&displaylang=en, если Вы решили серьёзно копаться в этом направлении. Для большинства задач обычно вполне хватает ресурса http://pinvoke.net/. Там представлено подробное описание с заточкой под .NET.

Удачи!

Автор: Baa 19.11.2007, 12:46
Вообще, ничего сложного...
Код

IntPtr hWnd = GetForegroundWindow();
uint lpdwProcessId = 0;
GetWindowThreadProcessId(hWnd, out lpdwProcessId);
Console.WriteLine("Process id: {0}", lpdwProcessId);
Console.WriteLine("Process name: {0}", Process.GetProcessById((int)lpdwProcessId).MainModule.FileName);

Автор: Doff 19.11.2007, 16:10
Вы меня прямо завалили советами smile Спасибо огромное всем! Буду пробовать... Потом отпишусь о результатах.

Автор: Doff 20.11.2007, 20:28
Вопрос решен, спасибо всем, кто помог и особенно товарищу Baa за его бескорыстную помощь. Привожу его пример на VB.NET (может, кому пригодится):
Код

Module Module1
    <DllImport("user32.dll", SetLastError:=True)> _
Private Function GetForegroundWindow() As IntPtr
    End Function

    <DllImport("user32.dll", SetLastError:=True)> _
Private Function GetWindowThreadProcessId(ByVal hwnd As IntPtr, _
                          ByRef lpdwProcessId As Integer) As Integer
    End Function

    Sub Main()
        Dim hWnd As IntPtr = GetForegroundWindow()
        Dim lpdwProcessId As Integer = 0
        GetWindowThreadProcessId(hWnd, lpdwProcessId)
        Console.WriteLine(Process.GetProcessById(lpdwProcessId).MainModule.FileName)
    End Sub

End Module

Автор: Firster 28.11.2007, 02:40
А как быть в такой ситуации, когда, например, известно хендл какого-нить компонента формы и НУЖНО узнать хендл самой формы, чтобы ее спрятать (SW_HIDE). SetForegroundWindow не предлагать. Может какие стандартные функции.....

Автор: bom 27.12.2007, 02:39
GetParent

Автор: Firster 27.12.2007, 03:04
http://forum.vingrad.ru/forum/topic-184386/anchor-entry1332636/0.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)