Узнать handle окна программа

Delphi , Программа и Интерфейс , Приложения чужие

Как узнать handle окна, над которым находится курсор мышки?

Для того чтобы получить handle окна под курсом в WinAPI есть функция:

HWND WINAPI WindowFromPoint(
__in POINT Point
);

Возвращаемое значение Дескриптор окна, которое содержит точку. Если окно не существует в данной точке, возвращается значение NULL. Если точка над статическим текстом, возвращается значение дескриптора окна под статическим текстом.

Примечание: Функция WindowFromPoint не может извлеч указать на скрытые или отключенные окна, даже если точка находится в пределах указателя. Приложение должно использовать ChildWindowFromPoint для подобного поиска.

HWND WINAPI ChildWindowFromPoint(
__in HWND hWndParent,
__in POINT Point
);

Определяет, если таковые имеются, дочерние окна принадлежащие родительскому окну содержие указанную точку. Поиск ограничивается дочерними оконами приложения указанного при вызове функции. Внуки, и более глубие потомки в поиске не учавствуют .

Как узнать Класс Окна Приложения (C++)

PS: Функция GetCursorPos может возврать точку над которой находится указатель мыши.

Статья Получить handle окна под курсом раздела Программа и Интерфейс Приложения чужие может быть полезна для разработчиков на Delphi и FreePascal.

Комментарии и вопросы

Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.

Источник: www.kansoftware.ru

Получение дескриптора окна (HWND)

В этом разделе показано, как в классическом приложении получить дескриптор окна для окна. Область охватывает библиотеку пользовательского интерфейса Windows (WinUI) 3, Windows Presentation Foundation (WPF) и приложения Windows Forms (WinForms); примеры кода представлены в C# и C++/WinRT.

Перечисленные выше платформы разработки и пользовательского интерфейса основаны на API Win32 (за кулисами). В Win32 объект окна определяется значением, известным как дескриптор окна. А тип дескриптора окна — это HWND (хотя он отображается в C# как IntPtr). В любом случае вы услышите термин HWND , используемый в качестве сокращенного для дескриптора окна.

Существует несколько причин получения HWND для окна в классическом приложении WinUI 3, WPF или WinForms. Одним из примеров является использование HWND для взаимодействия с определенными объектами среда выполнения Windows (WinRT), которые зависят от CoreWindow для отображения пользовательского интерфейса. Дополнительные сведения см. в разделе «Отображение объектов пользовательского интерфейса WinRT», зависящих от CoreWindow.

Читайте также:
Программа настройки rs bolid

WinUI 3 с C #

В приведенном ниже коде C# показано, как получить дескриптор окна (HWND) для объекта Окна WinUI 3. В этом примере вызывается метод GetWindowHandle в классе взаимодействия WinRT.Interop.WindowNative C#. Дополнительные сведения о классах взаимодействия C# см. в разделе API взаимодействия вызовов из приложения .NET.

Уроки WinApi C++ | Работа с окнами виндовс | HWND на примерах


// MainWindow.xaml.cs private async void myButton_Click(object sender, RoutedEventArgs e) < // Retrieve the window handle (HWND) of the current WinUI 3 window. var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this); >

WinUI 3 с C++

Приведенный ниже код C++/WinRT показывает, как получить дескриптор окна (HWND) для объекта Окна WinUI 3. В этом примере вызывается метод IWindowNative::get_WindowHandle .

// pch.h . #include // MainWindow.xaml.cpp void MainWindow::myButton_Click(IInspectable const) < // Retrieve the window handle (HWND) of the current WinUI 3 window. auto windowNative< this->try_as() >; winrt::check_bool(windowNative); HWND hWnd< 0 >; windowNative->get_WindowHandle( >

WPF с C #

В приведенном ниже коде C# показано, как получить дескриптор окна (HWND) для объекта окна WPF. В этом примере используется класс WindowInteropHelper .

// MainWindow.xaml.cs private void Button_Click(object sender, RoutedEventArgs e)

WinForms с C #

В приведенном ниже коде C# показано, как получить дескриптор окна (HWND) для объекта формы WinForms. В этом примере используется свойство NativeWindow.Handle .

// Form1.cs private void button1_Click(object sender, EventArgs e)

Связанные темы

  • Отображение объектов пользовательского интерфейса WinRT, зависящих от CoreWindow
  • Вызов API взаимодействия из приложения .NET
  • Библиотека пользовательского интерфейса Windows (WinUI) 3
  • Windows Presentation Foundation (WPF)
  • Windows Forms (WinForms)
  • C++/WinRT
  • API Win32

Источник: learn.microsoft.com

Узнать handle окна программа

The GetWindowThreadProcessId function retrieves the identifier of the thread that created the specified window and, optionally, the identifier of the process that created the window.

т.е. можно все окна пребрать.

> Можно ли по ID просесса узнать хендл окна этого просесса?

Задумайтесь на минутку — а что, если процесс породил несколько окон? Какое из них Вам нужно? А ведь такое бывает очень часто.

HWND hWnd, // handle of window
LPDWORD lpdwProcessId // address of variable for process identifier
);

var
h: HWND;
pid: DWord;

function EnumWnd(Handle: hwnd; UnicID: LPARAM): boolean; stdcall;
begin
Result := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;

SearchHandle ищет все окна заданного процесса. При нахождении очередного окна вызывается функция CallbackFunction, которой в данном случае является EnumWnd. Она посылает WM_CLOSE всем окнам.

> function EnumWnd(Handle: hwnd; UnicID: LPARAM): boolean;
> stdcall;

Читайте также:
Как открыть все программы на Макбуке

BOOL CALLBACK EnumThreadWndProc
Хотя, в данном случае это, возможно, не принципиально,
но, вообще-то, надо поаккуратней с хидерами.


С уважением, LVT.

> а что не так? Я не понял.

Я бы написал вместо

> function EnumWnd(Handle: hwnd; UnicID: LPARAM): boolean;
> stdcall;

function EnumWnd(Handle: hwnd; UnicID: LPARAM): BOOL; stdcall;

не знаю. И вообще сомневаюсь, что в WinApi есть понятие «главное окно».

Это само собой. Но, этим ты не отвертишься 😉
Формально, NT4 еще имеет право на жизнь, а там такого
понятия, как ToolHelp functions, нет.
Т.е., включаешь ремарку «исключая NT4».

ЧТО возвращает CreateToolhelp32Snapshot? Если ошибочный Handle — что возвращает GetLastError?

begin
H := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Memo1.Clear;
If Process32First(H, P) then
Memo1.Lines.Add(P.szExeFile)
until Process32Next(H, P) = False;

Нда, я плакаль. Предлагаю найти самому ошибку.

P.S. А также неплохо было бы узнать — откуда ты это собственно взял, если в [10] я привел рабочий код? Из моего FAQ»а что ли?

У окон, отображаемых на Taskbar не обязательно имеется стиль WS_EX_APPWINDOW. Точнее, большинство отображаемых на таскбаре окон этого стиля не имеет 🙂

А как тогда определить отображается окно на taskbar ?

> А как тогда определить отображается окно на taskbar ?

(Только сделал апгрейд, файлы черт знает где, прошу прощения, что приходится ссылку на сайт давать)

Мой склероз. Я это смотрел несколько дней назад.

Кстати, Ваш критерий тоже неточен 🙂

Проверку из EnumFunctions_60
if (WindowOwner = 0) AND
((ExStyle AND WS_EX_TOOLWINDOW) = 0) AND
((WinStyle AND WS_VISIBLE) <> 0) then

не проходит такое окно

Спасибо. К сожалению, я практически не обновляю сайт.

Проверка, очевидно должна выглядеть так (надо проверить):

if (WindowOwner = 0) and ((WinStyle and WS_VISIBLE) <> 0) and
(((ExStyle and WS_EX_TOOLWINDOW) = 0) or ((ExStyle and WS_EX_APPWINDOW) <> 0)) then

а что ты скажешь на:

> Проверка, очевидно должна выглядеть так (надо проверить):
>
> if (WindowOwner = 0) and ((WinStyle and WS_VISIBLE) <> 0)
> and
> (((ExStyle and WS_EX_TOOLWINDOW) = 0) or ((ExStyle and
> WS_EX_APPWINDOW) <> 0)) then

Проверка должна выглядеть так (можешь проверить):

function IsTaskbarBtnExist(h: HWND): Boolean;
var
exstyle: Longint;
begin
Result:= IsWindowVisible(h);
if Result then
begin
exstyle := GetWindowLong(h, GWL_EXSTYLE);
Result := exstyle and WS_EX_APPWINDOW <> 0;
if not Result and
(exstyle and WS_EX_TOOLWINDOW = 0) then
Result := GetWindowLong(h, GWL_HWNDPARENT) = 0;
end;
end;

В отсутствии определения «главное окно» любое высказывание
может быть представлено как истинное.

Читайте также:
Как высчитать проценты в программе excel


С уважением, LVT.

То что имеет значение не порядок, а стили и владалец.
В VCL приложении обычно ни одна форма не видна на TaskBar, для этого исспользуется окно Application.Handle.

type
TForm1 = class(TForm)
private
< Private declarations >
protected
procedure CreateParams(var Params: TCreateParams); override;
public
< Public declarations >
end;

var
Form1: TForm1;

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited;
// любая из нижеследуючих строк приводит к появлению формы на taskbar
Params.WndParent := HWND_DESKTOP;
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;

You have to do some test on each of the windows returned by EnumWindows() to
decide wheter to show it or not. The test were described by Jeffrey Richter in
the Nov «97 issue of MSJ. Quoting:

«The rules the taskbar uses to decide whether a button should be shown
for a window are really quite simple, but are not well documented.
When you create a window, the taskbar examines the window»s extended
style to see if either the WS_EX_APPWINDOW (defined as 0x00040000) or
WS_EX_TOOLWINDOW (defined as 0x00000080) style is turned on. If
WS_EX_APPWINDOW is turned on, the taskbar shows a button for the
window, and if WS_EX_ TOOLWINDOW is turned on, the taskbar does not
show a button for the window. You should never create a window that
has both of these extended styles.

You can create a window that doesn»t have either of these styles. If a
window has neither style, the taskbar decides to create a button if
the window is unowned and does not create a button if the window is
owned.

One final note: before making any of the above tests, the taskbar
first checks to see if a window has the standard WS_VISIBLE window
style turned on. If this style bit is off, the window is hidden; the
taskbar never shows a button for a hidden window. Only if the
WS_VISIBLE style bit is on will the taskbar check the WS_EX_APPWINDOW,
WS_ EX_TOOLWINDOW, and window ownership information.»

Which, BTW, David Lowndes has posted in this group several times in the past

Неточность в том, что если окно WS_CHILD, то никакие WS_EX_APPWINDOW не помогут — можете проверить.

> Неточность в том, что если окно WS_CHILD, то никакие WS_EX_APPWINDOW
> не помогут — можете проверить.

А причем тут WS_CHILD?
Речь шла про EnumWindows PS: интересный спор ни о чём.

Это называется обсуждением, IMHO.

Источник: delphimaster.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru