Форум » [x]Harbour » Хендл окна из процесса » Ответить

Хендл окна из процесса

fil: Всем привет ! Чего-то забыл как получить хендл окна из процесса (оно там одно, но попапное, за заголовок не ухватищь) oList:= oWmi:ExecQuery(.. for each oProc in oList oProc - вот из него получить хендл окна

Ответов - 23, стр: 1 2 All

Dima: http://fivetechsupport.com/forums/viewtopic.php?f=3&t=29279 https://www.activexperts.com/admin/scripts/wmi/perl/0413/

fil: И чего ? Всяких сврйств много, но хендла окна процесса я не увидел Можно пойти от обратного - прокрутить по Enum все окна и найти принадлежащее нужному мне процессу

Dima: fil пишет: И чего ? Ты или ссылки не смотрел или я не то дал :) Я про это fil пишет: oProc - вот из него получить хендл окна oProc:Handle


fil: Ну, некий хендл получаю. Вот тока сомневаюсь, что это хендл окна Проверил это сделав Parent'ом окно своего приложения - не встраивается

Haz: fil пишет: Вот тока сомневаюсь, Чтобы не сомневаться. Найди две маленькие программы 1)WinSpy 2)WmiExplorer Обе бесплатные, и работают без установки. Первая отображает полную инфу о любом окне в системе. Вторая визуализирует Wmi запросы Без них с окнами и вимиаями в слепую можно тыкаться долго)

Haz: Haz пишет: некий хендл получаю. Это хендл процесса

Haz: fil пишет: Чего-то забыл как получить хендл окна из процесса В завершение Только через WMI эту задачу не решишь. Нет в WMI окон процесса. Можно получить хендл процесса, потом хендл потока в котором этот процесс живет. Потом перебирая окна системы сравнивать из какого потока окно с нашим потоком. Возможно есть путь и короче ... я не нашел . Ломаешь чей то софт ? Лучше WinSpy++ посмотри характеристики окна и попробуй выделить уникальные (класс, размеры, стиль, текст в окне , дочерние окна такие как кнопки и надписи на них и пр) и искать уже по этим признакам через перебор окон системы. Хендл процесса ничего тебе не даст , тк то что ты видишь одно окно не гарантирует что у процксса нет еще сотни

fil: Возможно.

fil: Ну вроде так я его поймал hWn:=GetWindowThreadProcessID(GetForegroundWindow(), oProc:Handle) Хотя, конечно, условие, что искомое приложение на переднем плане..

Haz: fil пишет: Ну вроде так я его поймал Я запутался, ты что ловил то ? GetForegroundWindow() и так возвращает хендл приоритетного( выделенного) окна GetWindowThreadProcessID() - возвращает ID потока который создал указанное в параметрах окно , и также возвращает ID процесса через ссылку в параметрах вроде тебе нужен хендл окна и ты его получил выделив на передним плане через GetForegroundWindow(), тогда к чему огород с GetWindowThreadProcessID

Haz: fil пишет: hWn:=GetWindowThreadProcessID(GetForegroundWindow(), oProc:Handle) oProc:Handle в этот параметр (если задан) копируется ID процесса который создал окно а не наоборот hWn - это правильнее обозначить как hTh т.к. это хендл потока вызов такой hTh := GetWindowThreadProcessID(hWnd, @hPid) в hTh запишется хендл потока , который создал hWnd в hPid запишется хендл процесса, который создал hWnd таким образом перебирая все окна и скармливая их в GetWindowThreadProcessID() сравниваем полученный hPid с oProc:Handle и если совпали то это окно создано из процесса oProc:Handle Пример перебора окон на форуме был , я точно кидал в теме по Excel

fil: GetForegroundWindow Haz это да, каюсь перемудрил. Очень уж хотелось прямо из процесса окно достать. Ну через Enum сделаю. Спасибо

Andrey: Dima пишет: http://fivetechsupport.com/forums/viewtopic.php?f=3&t=29279 [pre2] WsaStartUp() if upper(cEquipo) == "LOCAL" cIP := GetHostByName( GetHostName() ) //IP equipo local elseif upper(cEquipo) == "SERVIDOR" cIP := GetHostByName(cNombServ) //IP equipo en red segun nombre dado endif //GetHostByAddress("192.168.0.14") // NOMBRE del equipo en RED segun IP dada WsaCleanUp()[/pre2] Не нашёл чем заменить в МиниГиу функции GetHostName() и GetHostByName( GetHostName() ) . [pre2]Нашёл 3 библиотеки: C:\MiniGUI\Harbour\lib\ hbrtl.lib libeay32.lib socket.lib[/pre2] Какую использовать нужно для Харбора ? Перепробовал все, всё равно ошибка компиляции: Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland Error: Unresolved external '_HB_FUN_WSASTARTUP' referenced from \OBJ\DEMO.OBJ Error: Unresolved external '_HB_FUN_GETHOSTNAME' referenced from \OBJ\DEMO.OBJ Error: Unresolved external '_HB_FUN_GETHOSTBYNAME' referenced from \OBJ\DEMO.OBJ Error: Unresolved external '_HB_FUN_WSACLEANUP' referenced from \OBJ\DEMO.OBJ Вот код программы: [pre2] ? "." WsaStartUp() ? "GetHostName() - ", GetHostName() ? "GetHostByName( GetHostName() ) - ", GetHostByName( GetHostName() ) WsaCleanUp()[/pre2] Может ещё чего нужно прикрутить для этого кода ? IP адрес компа определяю через функцию, которую ранее давал Григорий. http://clipper.borda.ru/?1-4-0-00000393-000-0-0-1526386398

Dima: Andrey пишет: Не нашёл чем заменить в МиниГиу функции GetHostName() и GetHostByName( GetHostName() ) . Мыло кинь мне в личку закину....впрочем налью наверное к Сергею на Ftp :) PS Налил в твою папку

gfilatov2002: Andrey пишет: Не нашёл чем заменить в МиниГиу Лови [pre2]HB_FUNC ( WSASTARTUP ) { WSADATA wsa; hb_retni( WSAStartup( 0x101, &wsa ) ); } HB_FUNC ( WSACLEANUP ) { hb_retni( WSACleanup() ); } HB_FUNC ( GETHOSTNAME ) { BYTE Name[ 255 ]; gethostname( ( char * ) Name, 255 ); hb_retc( ( char * ) Name ); } HB_FUNC (GETHOSTBYNAME) { struct hostent * pHost; BYTE addr[ 20 ]; strcpy( ( char * ) addr, "0.0.0.0" ); pHost = gethostbyname( ( char * ) hb_parc( 1 ) ) ; if( pHost ) { wsprintf( ( char * ) addr, "%i.%i.%i.%i", ( BYTE ) pHost->h_addr[ 0 ], ( BYTE ) pHost->h_addr[ 1 ], ( BYTE ) pHost->h_addr[ 2 ], ( BYTE ) pHost->h_addr[ 3 ] ); } hb_retc( ( char * ) addr ); } [/pre2]

Dima: gfilatov2002 пишет: Лови Поздно , уже дал ему от FW

Andrey: Спасибо вам БОЛЬШОЕ !!! А чем заменить #include <fwh.h> в winsock.c ? За комментировал, всё равно не собирает: Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland Error: Unresolved external '_fw_parH' referenced from W:\HB_PROJECT WINSOCK.OBJ

Dima: Andrey пишет: А чем заменить #include <fwh.h> в winsock.c ? Налил и его , впрочем можно использовать что дал Григорий

Andrey: Вот код: [pre2]#ifdef __HARBOUR__ HB_FUNC( WSAASYNCSELECT ) // ( nSocket, nHWnd, nMsg, nModes ) --> nReturn #else HB_FUNC( WSAASYNCSE ) // LECT( nSocket, nHWnd, nMsg, nModes ) --> nReturn #endif { hb_retni( WSAAsyncSelect( hb_parni( 1 ), ( HWND ) fw_parH( 2 ), hb_parni( 3 ), hb_parnl( 4 ) ) ); }[/pre2] Только в одном месте такое. Подойдёт ли замена ( HWND ) fw_parH( 2 ) на ( HWND ) hb_parH( 2 ) ? P.S. Не подошла.... Чем можно заменить ? P.S.S. Нашёл чем заменить. Взял из fwh.h [pre2]#ifndef _WIN64 #define fw_parH( i ) ( (HANDLE) hb_parnl( i ) ) #define fw_retnll( l ) hb_retnl( (LONG) l ) #else #define fw_parH( i ) ( (HANDLE) hb_parnll( i ) ) #define fw_retnll( l ) hb_retnll( (LONGLONG) l ) #endif[/pre2]

Andrey: Dima пишет: Налил и его , впрочем можно использовать что дал Григорий Да, можно и его, но там больше функций. Вдруг пригодятся... Залил к Сергею пример. Посмотри его, может что и посоветуешь.



полная версия страницы