как узнать хендл окна

Как узнать хендл окна


Суслик © ( 2004-12-15 18:19 ) [1]

можно по хандлу окна узнать принадлежит ли он процесу

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.

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

Может иначе можно, я не знаю.


Юрий Зотов © ( 2004-12-15 18:31 ) [2]

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

Как сказано в [1], можно перебрать все окна процесса. Но для того, чтобы выделить из них нужное Вы должны знать об этом окне еще что-то, кроме того, что оно принажлежит данномк процессу.

Огромное спасибо за направление но всё же
DWORD GetWindowThreadProcessId(

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

что опередавать в hWnd если у меня никакого окна нету предаю 0 ноль и возвращает 🙁


Суслик © ( 2004-12-15 19:21 ) [4]

Ну напрагись, задай вопрос нормально :)) С знаком вопроса, с запятыми и пр.
Я не издеваюсь, я вопроса не понял. Честно. 🙂


Суслик © ( 2004-12-15 19:49 ) [6]

var
h: HWND;
pid: DWord;

h := FindWindowEx(0, 0, nil, nil);
while (h <> 0) do
begin
GetWindowThreadProcessId(h, @pid);
if (pid = pi.dwProcessId) then
<окно принадлежит потоку запущенного процесса>
h := FindWindowEx(0, h, nil, nil); // ищем следующее окно
end;

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

procedure TForm1.Button1Click(Sender: TObject);
begin
SearchHandle(GetCurrentProcessId, @EnumWnd, 0);
end;

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

Так как вызывается:
SearchHandle(GetCurrentProcessId, @EnumWnd, 0);
то код приводит к посылке сообщений WM_CLOSE всем окнам данного процесса.


> Piter © (15.12.04 22:14) [10]

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

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

PS Кстати, Toolhelp32 отсутствует в NT4.


Piter © ( 2004-12-16 00:42 ) [12]

Leonid Troyanovsky © (15.12.04 23:03) [11]
BOOL CALLBACK EnumThreadWndProc
Хотя, в данном случае это, возможно, не принципиально,
но, вообще-то, надо поаккуратней с хидерами.

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


Игорь Шевченко © ( 2004-12-16 10:43 ) [13]

Piter © (16.12.04 00:42) [12]


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

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


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

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

Ах да, для моего примера [10] нужно подключить юнит TLHelp32

Leonid Troyanovsky © (15.12.04 23:03) [11]
Игорь Шевченко © (16.12.04 10:43) [13]

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


> Piter © (16.12.04 20:16) [15]
> Ах да, для моего примера [10] нужно подключить юнит TLHelp32

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


Piter © ( 2004-12-16 23:09 ) [18]

-=SS=- © (16.12.04 22:34) [17]
Незнаю почему но под DELPHI 7 TollHelp32 не работает


Piter © ( 2004-12-16 23:12 ) [19]

И вместо абстрактного «не работает» почему бы не сказать где именно затык?

Я конечно извеняюсь но причем тут EnumWnd.

begin
H := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Memo1.Clear;
If Process32First(H, P) then
Memo1.Lines.Add(P.szExeFile)
until Process32Next(H, P) = False;
Этот код на D5 работает т.е показывает всё процессы, а на D7 не работает т.е не показывает ни одной записи (WIN XP)
кстати Директива stdcall стоит но она используется пожже, но всё равно все работает (Под D5)


Piter © ( 2004-12-17 19:30 ) [21]

Ну и какой смысл в молчанку играть? Почему информацию надо вытягивать, как будто это мне нужно? 🙂

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

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

Тупой Copy-Paste приводит к ошибкам 🙂


Piter © ( 2004-12-17 20:50 ) [22]

Сори, это я уже лажанулся. Ты просто переделал пример для поиска процессов. Ок, тогда остаются вопросы:

Piter © (17.12.04 19:30) [21]
Ну и какой смысл в молчанку играть? Почему информацию надо вытягивать, как будто это мне нужно? 🙂

Если под «главным окном» понимать окно для которого создаётся кнопка на панели задач, то можно проверить (с пом GetWindowLong) extended style на наличие признака кнопки на панели задач (WS_EX_APPWINDOW).


Игорь Шевченко © ( 2004-12-17 23:53 ) [24]

GuAV © (17.12.04 23:22) [23]

Читайте также:  команды очистки системы linux

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


Piter © ( 2004-12-18 00:44 ) [25]

GuAV © (17.12.04 23:22) [23]

имхо, первое окно, созданное приложением и есть «главное», то есть отображается на Панели Задач

Игорь Шевченко © (17.12.04 23:53) [24]

WS_EX_APPWINDOW
Forces a top-level window onto the taskbar when the window is visible.


Игорь Шевченко © ( 2004-12-18 00:54 ) [27]

GuAV © (18.12.04 00:44) [26]

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

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

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

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

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

CreateWindowEx(WS_EX_APPWINDOW or WS_EX_TOOLWINDOW,
«BUTTON», «I»»m on taskbar», WS_VISIBLE, 0, 0, 0, 0, HWND_DESKTOP, 0, 0, 0);


Игорь Шевченко © ( 2004-12-18 01:56 ) [29]

GuAV © (18.12.04 01:28) [28]

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

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

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


Piter © ( 2004-12-18 02:21 ) [30]

GuAV © (18.12.04 1:28) [28]

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

Piter © (18.12.04 0:44) [25]
имхо, первое окно, созданное приложением и есть «главное», то есть отображается на Панели Задач


> Игорь Шевченко © (18.12.04 01:56) [29]

> Проверка, очевидно должна выглядеть так (надо проверить):
>
> 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;


> Piter © (18.12.04 02:21) [30]
> GuAV © (18.12.04 1:28) [28]
>
> а что ты скажешь на:
>
> Piter © (18.12.04 0:44) [25]
> имхо, первое окно, созданное приложением и есть «главное»,
> то есть отображается на Панели Задач

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

PS Собс-но, проще руководстваться целью: «что нужно от
этого окна».

Piter © (18.12.04 2:21) [30]
а что ты скажешь на:

Piter © (18.12.04 0:44) [25]
имхо, первое окно, созданное приложением и есть «главное», то есть отображается на Панели Задач

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

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

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

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

GuAV © (18.12.04 17:45) [33]
, что проверка должна выглядеть так:

Хотя нет, правильно в [29]


> GuAV © (18.12.04 17:45) [33]
..
> Немного поэксперементировав пришел к выводу, что проверка
> должна выглядеть так:

От:Tomas Restrepo (winder@bigfoot.com)
Тема:Re: How to EnumWindows.
Группы новостей:microsoft.public.win32.programmer.kernel
Дата:1999/04/06

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

Leonid Troyanovsky © (18.12.04 18:31) [35]

PS: интересный спор ни о чём.


Piter © ( 2004-12-18 18:51 ) [37]

Leonid Troyanovsky © (18.12.04 14:04) [32]
В отсутствии определения «главное окно» любое высказывание
может быть представлено как истинное


> > имхо, первое окно, созданное приложением и есть
>»главное»,
> > то есть отображается на Панели Задач

2 Piter © (18.12.04 18:51) [37]
GuAV © (18.12.04 17:45) [33]

GuAV © (18.12.04 17:45) [33]
То что имеет значение не порядок, а стили и владалец.


> GuAV © (18.12.04 18:43) [36]

А причем тут WS_CHILD?
Речь шла про EnumWindows & top-level windows.


> PS: интересный спор ни о чём.

Источник

Как узнать хендл чужого окна свёрнутого в трей?

Ребята подскажите по такому вопросу можно ли как-нть узнать хендл чужого окна свёрнутого в трей?

Если можно, то можно ли потом добраться до конкретного контрола?

Как узнать хендл окна
Здравствуйте Уважаемые товарищи программисты! Подскажите, пожалуйста, как можно узнать хендл.

Найти хендл чужого окна, зная его атом
как можно найти хендл чужого окна по атому??

Узнать размер рамки чужого окна
Нужно узнать размер рамки чужого окна.

Как обратиться к компоненту форму, зная хендл ее окна?
Знаю HWND. формы. TForm *f; HWND *h=f->Handle; Как обратиться к форме и её компоненту по.

[C++ Error] Unit1.cpp(26): E2451 Undefined symbol ‘WM_SHOW’

Добавлено через 27 минут
Сделал так

Добавлено через 6 минут
Sasha,
можно и

К сожалению ни один из твоих способов не помогает. Я не могу заставить запуститься главное окно из иконки возле часов.

К сожалению этот код не помог

Уверен, что окно так называется? Выведи весь список и посмотри =)

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Как отследить событие сворачивания окна в системный трей?
Добрый день. Помогите разобратся, как можно отследить сворачивание окна в системный трей. И.

Как, зная Хендл объекта чужого приложения, узнать поля этого объекта?
Как зная Хендл объекта чужого приложения, узнать поля этого объекта?

Как узнать хендл окна (кнопки), если есть часть его текста?
Как узнать хендл окна(кнопки) если есть часть его текста, и хендл родительського окна, и хендл.

Источник

Findwindow

Содержание

Описание

Поиск хендла окна по его заголовку или PID.
Поиск производится среди окон верхнего уровня, т.е. функция не ведет поиск в дочерних окнах, таких как кнопка, поле ввода и т.д..
Для получения хендла дочернего окна используйте функцию Getwindow.
Подробнее про устройство системы окон Windows вы можете прочитать в Оконная система Windows.

Синтаксис

Привязка к окну: нет.
Работа со свернутым окном: да.

— полное название окна либо его часть.

— номер идентификатора процесса.
Указывается только один из параметров: либо заголовок, либо PID, но не оба сразу.
Порядок поиска следующий:

1. ищем указанную строку в качестве точного названия окон 2. в качестве класса окон 3. в начале названия окон 4. в середине названий окон 5. в качестве ‘pid’ окна

Если в качестве приемника указана числовая переменная, то будет найдено последнее активное окно с заданным заголовком.

Если в качестве приемника указан массив, то будут найдены все окна с заданным заголовком.

Примеры

Смотрите также

История развития

2.14
Добавил функцию:

Возвращает хендл окна, необходимый предыдущей команде. Заголовок окна следует указывать полностью, с соблюдением регистра символов. Если нужное окно не найдено, то регистронезависимо ищем указанную строку в начале названия всех окон. Поиск в скрытых окнах зависит от состояния переключателя «Показывать все окна». если опять ничего не нашли, то считаем, что указан PID процесса и ищем первое попавшееся окно этого процесса.

2.20
Добавил в ‘findWindow’ возможность искать по классу окна
Добавил в ‘findWindow’ возможность искать в середине названий всех окон. Порядок поиска следующий:

1. ищем указанную строку в качестве точного названия окон 2. в качестве класса окон 3. в начале названия окон 4. в середине названий окон 5. в качестве ‘pid’ окна

Добавил в ‘findWindow’ вывод в лог каким способом найдено окно.

2.21
Отключил вывод в лог ‘findWindow’ каким способом найдено окно, до лучших времен.

2.30
Функция ‘findwindow’, вызванная без параметров (но со скобками) вернет хэндл активного окна.
Добавил в ‘findwindow’ поиск по имени процесса.
Если в качестве приемника в команде ‘findwindow’ указан массив, то записываем в него хендлы и имена ВСЕХ окон, в заголовке которых содержится указанная строка, или процессов, полностью совпадающих с указанным. Регистрозависимо.

Читайте также:  сделать автостоянку на даче

2.39
Исправил функцию ‘findwindow’. Ничего не находила при нажатых клавишах «Alt+Tab».
Исправил ошибку в команде ‘set %arr findwindow (caption)’, возникающую при наличии в найденных «caption» символов ‘|’ и ‘/’.

Источник

Как получить handle окна?

В шаблонизаторе сделал окно надо получить его handle.

В билдере например можно использовать класс формы Form1->Handle.

hwnd := FindWindow (nil, ‘Form1’); //ищем окнo с заголовком «Form1»
if hwnd <> 0 then <нашлось>;

Добавлено через 39 секунд
но хотел бы все таки через ui что ли как-то посмотреть как сделать можно

Добавлено через 22 минуты
я баловался. такую абракадабру написал

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Handle окна
Как мне получить чужой процесс айди? В винапи это делается через 2 строчки, неужели в qt нет.

Как получить координаты окна программы на экране?
Как получить координаты окна программы на экране?

Как получить снимок окна по Handle
Подскажите как проще всего на vc++ в консольном приложении получить скриншот окна по Handle и.

Как получить Handle Окна при наведении мышкой
Здравствуйте! Как получить Handle Окна при наведении мышкой и как обозначить окно красным цветом?

В шаблонизаторе сделал окно надо получить его handle.

я баловался. такую абракадабру написал

Нет, так нельзя! Так Вы не получите HWND нужного окна. Всё гораздо прозаичнее. Так как окна наследуют QWidget и не переопределяют публичный метод winId, то для выполнения наследуемых методов достаточно написать:

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Получить handle дочернего окна
Есть следующее дерево окон (из Spy++): Пытаюсь получить хэндл дочернего окна следующим.

Получить handle окна по клику на нем курсором
Здравствуйте! Хочу написать программу аналогичную под линуксом. Программа предназначена для.

Как узнать handle окна по ID процесса
Коллеги, подскажите, что делать. Ситуация в двух словах такая: нужно сделать скриншоты окна.

Источник

Как найти HWND нужного окна?

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Найти HWND окна, зная HWND окна, породившего его
Здравствуйте! Имеется основное окно «А». Это окно создаёт новое недочернее окно «Б». Необходимо.

Как проверить состояние окна hwnd
Возможно ли узнать состояние окна hwnd, когда свёрнуто, когда открыто?

Как получить HWND окна/процесса/консоли
Как получить HWND окна/процесса/консоли? мне надо для Shellexecute. Реализация в Dll #include.

Добавлено через 30 минут
блин не находит нечего кроме блокнота (

ExpressS, может лутше не по заголовку искать, а по классу.

HWND FindWindow(
LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);

ExpressS, может лутше не по заголовку искать, а по классу.

HWND FindWindow(
LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);

не разбираюсь в этих классах я, могешь что то подсказать?

Добавлено через 58 минут
почитал о классах понял как узнать что за класс,я пишу воттак

все всем кто помогал огромное спс проблема решена

Добавлено через 13 часов 50 минут
Появилась новая проблема, если у меня запущены 2 приложения с одинаковыми заголовками как мне их различать, и зная хендел в виде 00010010 как мне его подставить в функцию? пробовал вот так

все всем кто помогал огромное спс проблема решена

Добавлено через 13 часов 50 минут
Появилась новая проблема, если у меня запущены 2 приложения с одинаковыми заголовками как мне их различать, и зная хендел в виде 00010010 как мне его подставить в функцию? пробовал вот так

все всем кто помогал огромное спс проблема решена

Добавлено через 13 часов 50 минут
Появилась новая проблема, если у меня запущены 2 приложения с одинаковыми заголовками как мне их различать, и зная хендел в виде 00010010 как мне его подставить в функцию? пробовал вот так

После приводишь int к hwnd (HWND)»твоя переменная инт которой ты присвоил хендл»

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Как получить HWND, созданного функцией CreateProcess, окна консоли
Есть обычное оконное прижоление на Win Api. В какой-то момент вызываю CreateProcessW и подсовываю.

Как получить HWND окна на панели задач по координатам мыши?
Как получить хэндл свернутого на панель задач окна, на которое наведена мышка?) Добавлено через.

Как найти HWND окна по имени, открытое последним? windows.h
Когда я использую: #include FindWindowA(0, («Starbound»));мне выводит один и тот же.

По нажатию кнопки найти HWND окна
Добрый день, прошу сапогами не пинать. У меня стоит следующая задача: Нужно по нажатию.

Источник

Образовательный портал