Что такое код windowfrompoint


Что такое код windowfrompoint

Возвращает дескриптор окна находящегося под точкой с указанными координатами

#include
_WinAPI_WindowFromPoint ( ByRef $tPoint )

$tPoint Структура $tagPOINT содержащая координаты точки
Успех: Возвращает дескриптор окна находящегося под указанной точкой
Ошибка: Возвращает 0

Функция WindowFromPoint не возвращает дескриптор скрытого или отключенного окна, даже если точка находится в пределах окна.

Искать WindowFromPoint в библиотеке MSDN

While 1
Sleep ( 100 )
$xy = MouseGetPos ()
DllStructSetData ( $Struct , «x» , $xy [ 0 ])
DllStructSetData ( $Struct , «y» , $xy [ 1 ])
$hWnd = _WinAPI_WindowFromPoint ( $Struct ) ; дескриптор окна под курсором
If $hTmpWnd <> $hWnd Then ; если дескриптор изменился, то запрос новых данных
$a = WinGetClientSize ( $hWnd ) ; клиентские размеры
$b = WinGetPos ( $hWnd ) ; коорд. и размеры окна
$tStru = _WinAPI_GetWindowRect ( $hWnd ) ; тоже что WinGetPos
$info = _
‘Текст = ‘ & WinGetTitle ( $hWnd ) & @CRLF & _
‘Класс = ‘ & _WinAPI_GetClassName ( $hWnd ) & @CRLF & _
‘Идентификатор = ‘ & _WinAPI_GetDlgCtrlID ( $hWnd ) & @CRLF & _
‘Прямоугольник = ‘ & DllStructGetData ( $tStru , 1 ) & ‘ — ‘ & DllStructGetData ( $tStru , 2 ) & ‘ — ‘ & DllStructGetData ( $tStru , 3 ) & ‘ — ‘ & DllStructGetData ( $tStru , 4 ) & @CRLF & _
‘x=’ & $b [ 0 ] & @CRLF & ‘y=’ & $b [ 1 ] & @CRLF & ‘w=’ & $b [ 2 ] & ‘ (кл.’ & $a [ 0 ] & ‘)’ & @CRLF & ‘h=’ & $b [ 3 ] & ‘ (кл.’ & $a [ 1 ] & ‘)’
ToolTip ( $info )
$hTmpWnd = $hWnd
EndIf
WEnd

Нажмите кнопку, используя WindowFromPoint () и SendMessage ()

Я пытаюсь использовать WindowFromPoint (), чтобы получить дескриптор кнопки, а затем использовать SendMessage (), чтобы нажать кнопку.

Я не получаю ошибку с моим кодом, но кнопка не нажата тоже ..
В принципе ничего не происходит.

Я уже подтвердил, что координаты указывают непосредственно на расположение кнопки.

Я также попытался ChildWindowFromPoint (), но это ничего не изменило.

Надеюсь, кто-нибудь скажет мне, где моя ошибка ..

WindowFromPoint возвращает дескриптор элементов управления, но мне нужно только основное окно

Я пишу вещь типа шпиона окна, чтобы добавить функцию в приложение, которое у меня есть. У меня есть весь код, но иногда WindowFromPoint возвращает дескриптор элемента управления вместо содержащего окна. Для моих целей меня интересует только основное окно. Есть ли способ для меня исключить элементы управления? Или можно обнаружить, что результатом является управление и рекурсия вверх до тех пор, пока я не доберусь до содержащего окна?

CWnd::WindowFromPoint

A pointer to the window object in which the point lies. It is NULL if no window exists at the given point. The returned pointer may be temporary and should not be stored for later use.

Specifies a CPoint object or POINT data structure that defines the point to be checked.

Retrieves the window that contains the specified point; point must specify the screen coordinates of a point on the screen.

WindowFromPoint does not retrieve a hidden or disabled window, even if the point is within the window. An application should use the ChildWindowFromPoint member function for a nonrestrictive search.

Что такое код windowfrompoint

This just seems to return the same value no matter what window the form is over.

I want to get the hwnd for any application the form is moved over (not just my app).

Answers

There are two different overloads you can use of this Api. Here is an example of both of them.

Is the top left corner of your form over the window you want the handle of? If it is over a control on the other window, it will get the controls handle, not the windows handle.

I changed the example to match what you are doing and it works fine on my end too. 8)

If you say it can`t be done then i`ll try it

All replies

I can’t repro the issue. I’ve tried placing the Windows Form over several different apps and each time a different window handle is returned.

BTW, the Location property does refer to the upper left corner coordinates of the Window Form.

Microsoft MVP (Visual Basic)

There are two different overloads you can use of this Api. Here is an example of both of them.

Is the top left corner of your form over the window you want the handle of? If it is over a control on the other window, it will get the controls handle, not the windows handle.

I changed the example to match what you are doing and it works fine on my end too. 8)

If you say it can`t be done then i`ll try it

I can’t repro the issue. I’ve tried placing the Windows Form over several different apps and each time a different window handle is returned.

BTW, the Location property does refer to the upper left corner coordinates of the Window Form.

Microsoft MVP (Visual Basic)

What version of Windows do you have and is it a 32 or 64 bit system?

Илон Маск рекомендует:  Что такое код globalunfix

Yes the location is just for temporary.

Microsoft MVP (Visual Basic)

There are two different overloads you can use of this Api. Here is an example of both of them. I am guessing you want to test getting the handle of your form so, being it has a rounded corner on the top left, you would have to add 5 or 10 to the X and Y location or it would get the handle of the Window behind your form.

If you say it can`t be done then i`ll try it

No I want the app behind my form. Its for the other thread on move two apps together really. But first I need to get the hwnd of the app behind the form.

But good point I did not think about the rounding however it really makes it work the way I wanted I think. Lucky I guess. I will play with your api.

Did my example work on your system with apps other than the form?

On my win7 64 it just shows one value that never changes as you move the form around on top of other apps on the desktop.

Ohhhhhhhhh, thats it! But on my system location is returning the handle of the form. Thats why its not changing. So I just subtract a little from the point and now it works.

Paul,

Your system must have rounder corners? Or mine has a shadow around the form so maybe that comes to play.

Anyway problem solved.

If you say it can`t be done then i`ll try it

Paul,

Your system must have rounder corners? Or mine has a shadow around the form so maybe that comes to play.

Just the standard Windows 7 style (or XP style or whatever they call it) with the top corners rounded.

Microsoft MVP (Visual Basic)

Yeah, it worked. You must have a shadow or something around your forms like you said. I kind of figured it had something to do with that thread you mentioned. I might put an example together for that too. I was thinking that the DeferWindowPos Api would be good for that one. 8)

If you say it can`t be done then i`ll try it

I figured you would have answered the move window one by now! After all, you are the api Master.

This is the first time I have played much with this part of windows so I am poking along.

DeferWindowPos has lots of big words. I am not sure what it does.

There are lots of givens and druthers on the move together problem so there are many ways it could operate. I am sure the OP will have something else in mind. :)

I would not say i am the Api master. There are several others that are much better at using them than me. I just love playing with them because i got use to using them when i did a lot with unmanaged C++, not to mention there are a lot things that you can do with them that can`t be done in managed code.

Yes, i was quite surprised this morning when i saw that you had posted an example using Win32 Api functions on that thread. The question was quite vague. No mention of how to select the windows or anything else besides «I want to move them all like in this image» basically.

The DeferWindowPos allows you to move all the (selected) windows at one time, using fewer paint messages being sent which reduces the screen flickering. Of coarse on newer machines it might not make a lot of difference.

Maybe i will let you post an example first so that i can catch all the «but, i need this and that» replies before making an example. haha 8)

If you say it can`t be done then i`ll try it

Maybe i will let you post an example first so that i can catch all the «but, i need this and that» replies before making an example. haha 8)

If you say it can`t be done then i`ll try it

Yeah ha ha. Don’t hold your breath. :)

I am still stuck on which app I am over.

What part are you stuck on? Are you getting a handle from the window? As i mentioned, if you are getting the handle from a point that is actually over a control on the other window, you will get the handle of the control, not the window it is on.

I can show you an example of using the GetParent Api in a loop to get the handle of the window instead of the control if that is giving you a problem. Give me a few minutes, i am finishing up working on that Xml document reader i told you about. 8)

If you say it can`t be done then i`ll try it

What part are you stuck on? Are you getting a handle from the window? As i mentioned, if you are getting the handle from a point that is actually over a control on the other window, you will get the handle of the control, not the window it is on.

I can show you an example of using the GetParent Api in a loop to get the handle of the window instead of the control if that is giving you a problem. Give me a few minutes, i am finishing up working on that Xml document reader i told you about. 8)

Илон Маск рекомендует:  Export - Директива Delphi

If you say it can`t be done then i`ll try it

Thanks but you don’t need show me. Its not that important.

To be honest I dont know what windows I am getting. I am still stuck on finding when the point is not over anything for now. It seems there is a whole lot of windows to choose from.

So there appears to be mucho details and I am not sure I want to spend much more time on it. I was thinking I could quickly determine when over an app but. then there is still all the rest of the overall problem.

I was just playing around mostly. So no need to show me thanks. I will see it if anyone else answers the question.

Что такое код windowfrompoint

В Init’е формы
declare GetCursorPos in Win32api string @
declare integer WindowFromPoint in Win32api string @
В событии Timer таймера:
priv cCursorPos
cCursorPos = spac(4)
= GetCursorPos(@cCursorPos)
wait wind nowa tran(WindowFromPoint(@cCursorPos))

P.S.Буду отсутствовать до 13:00

RE: Примерно такой
YuriWhite

Сообщений: 558
Откуда: Челябинск

Дата: 14.01.03 10:44:50
Не стану спорить, но
po2
Автор

Сообщений: 2468
Откуда: Иркутск

Дата: 14.01.03 11:31:20
RE: Примерно такой
YuriWhite

Сообщений: 558
Откуда: Челябинск

Дата: 14.01.03 11:39:04
Опечатка(-)
po2
Автор

Сообщений: 2468
Откуда: Иркутск

Дата: 14.01.03 12:03:46
RE: Примерно такой
Влад Гринчишин

Сообщений: 732

Дата: 14.01.03 12:54:08

declare integer GetCursorPos ;
in user32 ;
as __GetCursorPos__ ;
string @lcPointStructure
declare integer WindowFromPoint ;
in user32 ;
as __WindowFromPoint__ ;
integer lnX, ;
integer lnY

lcPointStructure = replicate(chr(0), 8)
= __GetCursorPos__(@lcPointStructure)
lnMouseX = DWordStringToNumber(m.lcPointStructure)
lnMouseY = DWordStringToNumber(right(m.lcPointStructure, 4))

HWND = __WindowFromPoint__(m.lnMouseX, m.lnMouseY)

Учтите что если на форме OLE(ActiveX) или пр. ерунда (типа окна проэкта), могут быть приколы Для проверки на OLE-объект используйте функцию SYS(1270) — если возвратится объект, и он имеет .Base , то WindowFromPoint возвратит HWND окна ActiveX, через который можно получить HWND формы как parent-окна.

Вот фнукция DWordStringToNumber:

if vartype(m.pcStr)==»C» AND len(m.pcStr)>=4
return (((asc(substr(m.pcStr, 4, 1)) * 256) + ;
asc(substr(m.pcStr, 3, 1))) * 256 + ;
asc(substr(m.pcStr, 2, 1))) * 256 + ;
asc(substr(m.pcStr, 1, 1))
else
return 0
endif

Типы параметров! (+)
Vit

Сообщений: 3653

Дата: 14.01.03 13:02:23

BOOL GetCursorPos(
LPPOINT lpPoint // address of structure for cursor position
);

HWND WindowFromPoint(
POINT Point // structure with point
);

Т.е. правильно декларировать так

declare integer GetCursorPos in Win32api string @
declare integer WindowFromPoint in Win32api long, long

соответственно в методе таймера

Local lnX, lnY
cCursorPos = spac(8)
= GetCursorPos(@cCursorPos)
lnX = Str2Long(left(cCursorPos, 4))
lnY = Str2Long(right(cCursorPos, 4))

Wait wind nowa tran(WindowFromPoint(lnX, lnY))

Где Str2Long что-то типа

lnResult = Asc(SUBSTR(lcStr , 1,1)) + ;
Asc(SUBSTR(lcStr , 2,1)) * 256 +;
Asc(SUBSTR(lcStr , 3,1)) * 65536 +;
Asc(SUBSTR(lcStr , 4,1)) * 16777216

Почему кнопки системы формы выделяются при вызове WindowFromPoint в событии MouseMove? — windows

Вызов WindowFromPoint в событии MouseMove для TWinControl вызывает событие MouseOver в точке, переданной в WindowFromPoint. Это ошибка VCL? Кто-нибудь знает, есть ли способ обхода?

Я использую Delphi XE2 на Windows 7 Pro 64bit. Я также могу воспроизвести с помощью Delphi 7.

    1 1
  • 30 окт 2020 2020-10-30 11:17:03
  • norgepaul

1 ответ

Я тестировал это с помощью простейшего приложения на С++ и наблюдал такое же поведение, это не ошибка VCL (как упоминал Давид в комментариях). Это не связано с движением мыши BTW, в любое время, когда вы вызываете WindowFromPoint , передавая координаты кнопки заголовка, возникает особенность. И это происходит только в окнах, принадлежащих потоку, который вызывает вызов функции.

Итак, для обходного пути вы можете вызвать WindowFromPoint из потока. Простой пример ниже, на самом деле не фоновый поток, так как код ждет его завершения:

Было бы целесообразно протестировать условия, которые отображают ошибку (ОС, темы..), и сделать код условным, чтобы избежать лишних затрат, если это не нужно.

Использование WindowFromPoint P / Invoke, чтобы получить ручку вкладки браузера

December 2020

649 раз

Я пишу приложение # C, который взаимодействует с игрой веб-браузера (не в злонамеренных целях, только для задачи автоматизации) и иметь взаимодействие рабочего, перемещая мышь, нажав и затем переместить курсор назад к предыдущей точке.

То, что я пытаюсь сделать сейчас, это сделать, нажмите на точку, не перемещая курсор, так что при перемещении мыши в то время как она работает, не будет вызывать misclicks. Я нашел крючки WindowFromPoint и SendMessage, что я могу использовать, чтобы нажать на позиции, и в моем тестировании я был в состоянии получить эту комбинацию работать. Но при попытке получить эту комбинацию крючков работать на моем веб-браузере Chrome, где игра находится не сделает щелчок.

Я предполагаю, что неправильная ручка собираемый, видя, как хром настолько сложен. Но, как я полагал, что это будет работать это WindowFromPoint бы предоставить мне с ручкой для текущей вкладки браузера, который открыт, таким образом, SendMessage сможет выполнить щелчок, где я хочу.

Вот код, который я использую, начало и конец являются точечными объектами, расположенные в месте, где я хочу нажать:

Есть ли что-нибудь другое, что должен делать, чтобы выполнить щелчок на игру во вкладке браузера?

1 ответы

Это не будет так просто:

Сообщение BM_CLICK предполагает владелец обработчика окна обрабатывает сообщения BM_CLICK. Это сообщение «более высокого уровня», который генерируется, когда получает сообщения «нижнего уровня» (например, мыши вниз / вверх, клавиатуры прессы и т.д.), обрабатывается. В случае стандартных элементов управления Windows, такие как кнопки это происходит под сценой, но я не верю, что браузер (или флэш-плагин, или любой другой) использует стандартный Win32 управления для визуализации своих страниц, так что может или не может обрабатывать щелчки мыши / клавиатура прессы и выпуск BM_CLICK событий.

Там замечательный инструмент в большинстве версий Visual Studio (даже некоторые C ++ выразить те), чтобы помочь вам в вашем стремлении под названием Spy ++. Этот инструмент позволяет «ходить» дескриптор окна структуры, выберите окно (с несколько причудливым инструментом искателя в Spy-> Журнал сообщения) и событие, обрабатываемое конкретными окнами журнал.

В соответствии с этим инструментом нажатием кнопки тег «C #» в вашем вопросе в Chrome не владеет ручку и смотрит на события в элементе управления визуализации не создавшего его нет BM_CLICK событий.

Использование WindowFromPoint P / Invoke для получения дескриптора вкладки браузера

Я пишу приложение на C #, которое взаимодействует с веб-браузерной игрой (не для злонамеренных целей, а только для задач автоматизации), и оно работает, перемещая мышь, щелкая и затем возвращая мышь к предыдущей точке.

Сейчас я пытаюсь щелкнуть точку, не перемещая курсор, чтобы перемещение мыши во время ее работы не вызывало ошибок. Я нашел хуки WindowFromPoint и SendMessage, которые я могу использовать для нажатия на позицию, и в ходе тестирования я смог заставить эту комбинацию работать. Но при попытке заставить эту комбинацию хуков работать в моем веб-браузере Chrome, где находится игра, он не сделает щелчок.

Я предполагаю, что собирается неправильный дескриптор, потому что хром такой сложный. Но я рассчитывал, что это сработает, а WindowFromPoint предоставит мне дескриптор текущей вкладки браузера, которая открыта, поэтому SendMessage сможет выполнить щелчок там, где я хочу.

Вот код, который я использую, start и end — оба объекта Point, расположенные в той позиции, где я хочу нажать:

Есть ли что-то другое, что я должен сделать, чтобы выполнить клик по игре на вкладке браузера?

1 ответ

Это не будет так просто:

Сообщение BM_CLICK предполагает, что владелец обработчика окна обрабатывает сообщения BM_CLICK. Это сообщение «более высокого уровня», которое генерируется при обработке сообщений «более низкого уровня» (таких как нажатие мыши вверх / вверх, нажатие клавиатуры и т. Д.). В случае стандартных элементов управления Windows, таких как кнопки, это происходит под сценой, но я не верю, что браузер (или флэш-плагин, или что-то еще) использует стандартные элементы управления Win32 для рендеринга своих страниц, поэтому он может обрабатывать или не обрабатывать щелчки мыши / клавиатура нажимает и выдает события BM_CLICK.

В большинстве версий Visual Studio (даже в некоторых C ++ Express) есть замечательный инструмент, который поможет вам в вашем стремлении под названием Spy ++. Этот инструмент позволяет вам «пройтись» по структуре дескриптора окна, выбрать окна (с несколько странным инструментом поиска в Spy-> Log Messages) и записывать события, обработанные определенными окнами.

Согласно этому инструменту нажатие кнопки тега «C #» в вашем вопросе в Chrome не имеет дескриптора и, глядя на события в элементе управления рендерингом, события BM_CLICK не создаются.

c# windowfrompoint Как узнать об API Win32?

windowfrompoint c# (4)

Win32 API — документы справки и образцы должны быть загружены в Windows SDK. http://www.microsoft.com/download/en/details.aspx? >

Я хочу узнать, как использовать Win32 API, так как в последнее время у меня есть много задач, которые мне нужно выполнить, для чего требуются функции из user32.dll , поэтому я пытаюсь учиться, и я Googled, но дело в том, : каждый учебник есть об этом, просто говорит вам, как делать что-то. например, показывать MessageBox через API Win32, но вы не можете фактически изучить среду Win32.

Итак, как вы на самом деле это узнаете? Откуда вы знаете все функции? с управляемыми библиотеками это довольно просто, особенно с Visual Studio, которая предоставляет IntelliSense, обозреватель объектов и т. д., но API Win32 настолько запутан (по крайней мере, с точки зрения разработчика C #).

То, как я использую это до сих пор, — это просто поиск в Google задачи и понимание того, что это можно сделать с помощью Win32 API (я понятия не имел) и просто скопировать функцию и использовать ее (и это ужасно для меня, Я чувствую, что мне не хватает «власти»).

Итак, как я могу это узнать?

Быть ясным: меня не интересует книга. так плохо, как мне кажется, мне нужны эти знания для проекта, и у меня просто нет времени инвестировать в книгу. Я действительно получил свой ответ.
Спасибо вам всем.

Я лично считаю, что вы должны начать с Calling Win32 DLL в C # с P / Invoke

Это предоставит вам большинство базовых знаний, которые вам нужно знать о WINAPI, используя pinvoke в c #. У меня также была автономная версия функций WINAPI, предоставляемых MSDN, но я не могу вспомнить, откуда я ее загрузил.

Наконец, возьмитесь за базовый простой для понимания код WINAPI, для этого есть http://mwinapi.sourceforge.net/ .

Во-первых, Win32 представляет собой набор подсистем. Вы, возможно, не можете легко их освоить. Вам просто нужно расставить приоритеты.

Но тогда, чтобы быть в состоянии сказать, что вы хотели бы узнать, вам, вероятно, нужна большая картина. Я считаю, что лучший способ приблизиться к Win32 — это «Программирование Windows» Чарльзом Петцольдом. Это очень ясно читать и легко понять. Есть много примеров, которые вы можете подобрать и поэкспериментировать самостоятельно.

После изучения основного материала я рекомендую «Microsoft Windows Internals» Марка Руссиновича. Он довольно продвинутый, но позволяет понять, что внутри ядра Windows.

попытки заставить вас начать разработку с помощью Win32 API как можно быстрее и четко ».

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL