Как узнать хендл "перетаскиванием иконки"?

Тема в разделе "WASM.WIN32", создана пользователем rep0A, 4 сен 2005.

  1. rep0A

    rep0A New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2005
    Сообщения:
    6
    Всем привет!

    На этом сайте в разделe Инструменты->Всякое есть прога spysharp. Так она узнаёт хендл(окна) когда перетаскивают иконку на это окно. Вот как можно это реализовать? Может у кого-то есть исходники подобной проги?

    Заранее благодарен.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Что-то мне подсказывает, что под "перетаскиванием" иконки понимается отрисовка её поверх топ-лежащего (GetForegroundWindow) окна в позиции курсора. А хэндл окна берётся из WindowFromPoint.
     
  3. rep0A

    rep0A New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2005
    Сообщения:
    6
    Спасибо за ответ, но с отрисовкой вроде всё нормально.

    Вот я нажимаю на иконку и вместо курсора становится та иконка. Веду мышку не отпуская на нужное мне окно(иконка всё-ещё вместо нормального курсора), отпускаю мышку и курсор становится нормальным. Всё как и в spysharp. Но после этого моему окну не посылается сообщение WM_LBUTTONUP(мышка ведь была поднята за пределами моего окна), a в spysharp-e посылается.
     
  4. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    rep0A





    Попробуй сначала "захватить" мышку с помощью SetCapture(...).
     
  5. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    У меня есть исходники такой штуки. Но они исключительно на Delphi, и причем не просто на Delphi, а с активным исспользованием VCL. Подойдет?
     
  6. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    WinSpy++



    попробуй найти его исходники, т.к. раньше они были доступны в сети

    цитата из readme:


    Код (Text):
    1.  
    2. You can download the full C source-code to WinSpy++. No external
    3. libraries such as MFC/ATL are required - pure Win32 API!
    4.  
    5. [url=http://www.catch22.uk.net]www.catch22.uk.net[/url] - Source-code section
    6.  




    только на данный момент по тому адресу я исходников не нашёл ;(
     
  7. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    А что мешает хучить мыша и проверять хендл форточки по ним? В уроках Акзелиона (никогда не выговаривал правильно :) есть пример...
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Вроде SetCapture нормально справляется с задачей:


    Код (Text):
    1.     .elseif uMsg==WM_LBUTTONDOWN
    2.         invoke SetCapture,hWin
    3.    
    4.     .elseif uMsg==WM_LBUTTONUP
    5.         invoke ReleaseCapture
    6.         invoke GetCursorPos,addr Pt
    7.         invoke WindowFromPoint,Pt.x,Pt.y
     
  9. rep0A

    rep0A New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2005
    Сообщения:
    6
    Спасибо всем за ответы, с этим вроде разобрался :)

    Но у меня ещё одна проблема:

    Вот этот код не берёт текст из едита(такого как в icq).



    Код (Text):
    1. .elseif uMsg==WM_LBUTTONUP
    2.       invoke ReleaseCapture
    3.       invoke GetCursorPos,addr Point
    4.       invoke WindowFromPoint,Point.x,Point.y
    5.       mov edx, eax
    6.       invoke GetWindowText,edx,addr buffer,128
    7.       invoke MessageBoxA,hDlg,addr buffer,addr buffer,128 ;MessageBox пустой




    Самое интересноe что если вызвать сначала SetWindowText(hDlg,"ТЕКСТ"), а потом GetWindowText и MessageBox, то в MessageBox-e будет "ТЕКСТ", но само поле в icq останется не изменённым. Так как в таком случае можно получить хендл именно того окна в котором лежит текст?
     
  10. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Попробуй не GetWindowText, а SendMessage ,,WM_GETTEXT,,
     
  11. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    rep0A

    Самое интересноe что если вызвать сначала SetWindowText(hDlg,"ТЕКСТ"), а потом GetWindowText и MessageBox, то в MessageBox-e будет "ТЕКСТ", но само поле в icq останется не изменённым.



    Не ты первый, не ты последний, эту тему на моей памяти два раза поднимали, ты третьим будешь :) В последний раз пришли к тому, что 1. Get\SetWindowText в чужой процес - это нехорошо и против документации, хотя и [пока] работает. 2. У edit'ов помимо обычного текста окна есть некий внутренний буфер, с которым работает *WindowText и содержимое которого в общем случае может не совпадать с текстом окна.
     
  12. rep0A

    rep0A New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2005
    Сообщения:
    6
    CyberManiac

    Спасибо что разъяснил. :)



    Надеюсь я не надоел вам со своими вопросами, потомучто у меня есть ещё два.



    1. Возможно ли этим "хуком" вытащить текст из текст-поля в IE(такого в котором пишут сообщения на форуме)?

    2. Можно ли вызвать SetWindowLong( ,GWL_WNDPROC, ) для "чужого"(не из моей программы) хендла? Вернее получить тотже эффект который я получаю для "своего".
     
  13. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    rep0A





    Вряд ли, цитата из MSDN:





    то есть тебе придется забираться в этот чужой процесс.
     
  14. rep0A

    rep0A New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2005
    Сообщения:
    6




    Так?
    Код (Text):
    1.     invoke GetWindowThreadProcessId,hDlg,NULL
    2.     mov edi, eax
    3.     invoke GetWindowThreadProcessId,esi,NULL  ; esi= хендлу "чужого" окна
    4.     invoke AttachThreadInput,edi,eax,TRUE
     
  15. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    rep0A





    Проблема в том, что адрес новой оконной процедуры(который передается в третьем параметре SetWindowLong) должен быть относительно того процесса, к которому относится окно. То есть сама процедура должна находится в адресном пространстве чужого процесса. Добиться этого можно разными способами(например хуком), но AttachThreadInput здесь по-моему ничем не поможет.
     
  16. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Как оказалось, сейчас не везде можно копировать текст

    из Edit'а :derisive:

    [​IMG] _1024196264__Edit.PNG