Всем привет! На этом сайте в разделe Инструменты->Всякое есть прога spysharp. Так она узнаёт хендл(окна) когда перетаскивают иконку на это окно. Вот как можно это реализовать? Может у кого-то есть исходники подобной проги? Заранее благодарен.
Что-то мне подсказывает, что под "перетаскиванием" иконки понимается отрисовка её поверх топ-лежащего (GetForegroundWindow) окна в позиции курсора. А хэндл окна берётся из WindowFromPoint.
Спасибо за ответ, но с отрисовкой вроде всё нормально. Вот я нажимаю на иконку и вместо курсора становится та иконка. Веду мышку не отпуская на нужное мне окно(иконка всё-ещё вместо нормального курсора), отпускаю мышку и курсор становится нормальным. Всё как и в spysharp. Но после этого моему окну не посылается сообщение WM_LBUTTONUP(мышка ведь была поднята за пределами моего окна), a в spysharp-e посылается.
У меня есть исходники такой штуки. Но они исключительно на Delphi, и причем не просто на Delphi, а с активным исспользованием VCL. Подойдет?
WinSpy++ попробуй найти его исходники, т.к. раньше они были доступны в сети цитата из readme: Код (Text): You can download the full C source-code to WinSpy++. No external libraries such as MFC/ATL are required - pure Win32 API! [url=http://www.catch22.uk.net]www.catch22.uk.net[/url] - Source-code section только на данный момент по тому адресу я исходников не нашёл ;(
А что мешает хучить мыша и проверять хендл форточки по ним? В уроках Акзелиона (никогда не выговаривал правильно есть пример...
Вроде SetCapture нормально справляется с задачей: Код (Text): .elseif uMsg==WM_LBUTTONDOWN invoke SetCapture,hWin .elseif uMsg==WM_LBUTTONUP invoke ReleaseCapture invoke GetCursorPos,addr Pt invoke WindowFromPoint,Pt.x,Pt.y
Спасибо всем за ответы, с этим вроде разобрался Но у меня ещё одна проблема: Вот этот код не берёт текст из едита(такого как в icq). Код (Text): .elseif uMsg==WM_LBUTTONUP invoke ReleaseCapture invoke GetCursorPos,addr Point invoke WindowFromPoint,Point.x,Point.y mov edx, eax invoke GetWindowText,edx,addr buffer,128 invoke MessageBoxA,hDlg,addr buffer,addr buffer,128 ;MessageBox пустой Самое интересноe что если вызвать сначала SetWindowText(hDlg,"ТЕКСТ"), а потом GetWindowText и MessageBox, то в MessageBox-e будет "ТЕКСТ", но само поле в icq останется не изменённым. Так как в таком случае можно получить хендл именно того окна в котором лежит текст?
rep0A Самое интересноe что если вызвать сначала SetWindowText(hDlg,"ТЕКСТ"), а потом GetWindowText и MessageBox, то в MessageBox-e будет "ТЕКСТ", но само поле в icq останется не изменённым. Не ты первый, не ты последний, эту тему на моей памяти два раза поднимали, ты третьим будешь В последний раз пришли к тому, что 1. Get\SetWindowText в чужой процес - это нехорошо и против документации, хотя и [пока] работает. 2. У edit'ов помимо обычного текста окна есть некий внутренний буфер, с которым работает *WindowText и содержимое которого в общем случае может не совпадать с текстом окна.
CyberManiac Спасибо что разъяснил. Надеюсь я не надоел вам со своими вопросами, потомучто у меня есть ещё два. 1. Возможно ли этим "хуком" вытащить текст из текст-поля в IE(такого в котором пишут сообщения на форуме)? 2. Можно ли вызвать SetWindowLong( ,GWL_WNDPROC, ) для "чужого"(не из моей программы) хендла? Вернее получить тотже эффект который я получаю для "своего".
Так? Код (Text): invoke GetWindowThreadProcessId,hDlg,NULL mov edi, eax invoke GetWindowThreadProcessId,esi,NULL ; esi= хендлу "чужого" окна invoke AttachThreadInput,edi,eax,TRUE
rep0A Проблема в том, что адрес новой оконной процедуры(который передается в третьем параметре SetWindowLong) должен быть относительно того процесса, к которому относится окно. То есть сама процедура должна находится в адресном пространстве чужого процесса. Добиться этого можно разными способами(например хуком), но AttachThreadInput здесь по-моему ничем не поможет.