Форум » [x]Harbour » Как получить "хендл" запущенных программ ? » Ответить

Как получить "хендл" запущенных программ ?

Andrey: Всем привет ! Народ подскажите как получить для хХарбора список "хендлов" запущенных программ, и чтоб названия их тоже были.

Ответов - 5

Dima: http://clipper.borda.ru/?1-4-0-00000265-000-0-0-1212227414

Loach: FUNCTION MAIN() LOCAL cFile mama() RETURN NIL /////////////////////////////////////////////////////// #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include <stdio.h> #include <windows.h> #include <tlhelp32.h> // заголовочный файл библиотеки TOOLHELP32 HB_FUNC( MAMA ) { HANDLE h; PROCESSENTRY32 pe; LPSTR szMsg = "1"; // создание "слепка" состояния всех процессов // второй аргумент при "слепке" состояния процессов // игнорируется и может принимать какие угодно // значения h=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL); // для инициализации структуры PROCESSENTRY32 // необходимо указать ее размер pe.dwSize=sizeof(PROCESSENTRY32); // получение сведений о первом процессе в списке Process32First(h,&pe); while(1) { // в поле szExePath содержится имя исполняемого // файла, ассоциированного с процессом, без пути // printf("szExeFile\t-\t%s\n",pe.szExeFile); MessageBox( GetActiveWindow(), pe.szExeFile , pe.szExeFile, 0x40 ); // в поле th32ProcessID содержится идентификатор // процесса, с помощью которого можно получить // список модулей данного процесса. // Это необходимо для выяснения полного имени // исполняемого файла GetModuleList(pe.th32ProcessID); // получение сведений о следующем процессе // или выход, если конец if (!Process32Next(h,&pe)) break; } return 0; } // функция выводит список модулей, ассоцированных // с данным процессом GetModuleList(DWORD th32ProcessID) { HANDLE h; MODULEENTRY32 mdl; // создание "слепка" состояния всех // модулей процесса th32ProcessID h=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, th32ProcessID); // для инициализации структуры MODULEENTRY32 // необходимо указать ее размер mdl.dwSize=sizeof(MODULEENTRY32); // получение сведений о первом модуле в списке Module32First(h,&mdl); while(1) { // в поле szExePath содержится полное имя // файла-модуля printf("\tszExePath\t-\t%s\n",mdl.szExePath); // получение сведений о всех остальных модулях // или выход, если конец if (!Module32Next(h,&mdl)) break; } // уничтожение "слепка" CloseHandle(h); } #pragma ENDDUMP Все слямзил отсюдава: http://citforum.gatchina.net/book/cook/instances.shtml

Andrey: Вопрос задавал для того чтобы поднять ранее запущенную программу. см. в конце топика: http://clipper.borda.ru/?1-4-15-00000348-000-10001-0-1220264471 Типа: =========================================================== Procedure Main LOCAL nI:=0, nKey, hWnd := GetForegroundWindow() LOCAL cExeRun := SUBSTR(EXENAME(), RAT("\",EXENAME())+1 ) SETCOLOR("15/3") CLEAR SCREEN ? "Номер окна:", hWnd ? "Имя ЕХЕ-файла: ", cExeRun if isexerunning(cExeRun) ALERT("Прога уже запущена !") // Как сделать переключение на ренее запущенную программу ? // Получить "хендл" ранее запущенной программы hWnd2 := Func_Pol_hWnd(cExeRun) // ???? // MAXIMIZE( hWnd2 ) // переключаюсь на ранее запущенную задачу QUIT // выхожу из этой программы endif DO WHILE .T. nKey := INKEY(1) IF nKey == 27 // K_ESC EXIT ENDIF @ 4,2 SAY "ESC-выход Режим ожидания:" ?? nI++ ENDDO return #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include <shlobj.h> HB_FUNC( ISEXERUNNING ) // ( cExeNameCaseSensitive ) --> lResult HANDLE hMutex = CreateMutex( NULL, TRUE, (LPTSTR) hb_parc(1) ); hb_retl( GetLastError() == ERROR_ALREADY_EXISTS ); ReleaseMutex( hMutex ); HB_FUNC( GETFOREGROUNDWINDOW ) hb_retnl( (LONG) GetForegroundWindow() ); HB_FUNC( MINIMIZE ) ShowWindow( (HWND) hb_parnl(1), SW_MINIMIZE ); HB_FUNC( MAXIMIZE ) ShowWindow( (HWND) hb_parnl(1), SW_RESTORE ); #pragma ENDDUMP ==================================================


Loach: Тада значицца так... Вот кусок реально работающей проги: В самом начале: ...................... if IsExeRunning( 'dispan.exe' ) //Программа в данный момент уже работает pppp() return .f. endif ...................... #PRAGMA BEGINDUMP #include "Windows.h" #include "ClipApi.h" HB_FUNC( PPPP ) { HWND hWnd; if (hWnd=FindWindow(NULL,"АРМ \"ДИСПАНСЕРИЗАЦИЯ\"")) { ShowWindow(hWnd,SW_RESTORE); SetForegroundWindow(hWnd); _retni(0); } _retni(1); } #PRAGMA ENDDUMP .......................................................... Тут штука в функции FindWindow. Причем параметры: FindWindow("имя класса","заголовок окна"). Смотря на чем вы работаете. У меня FWH, там имя класса всегда TWINDOW, поэтому я выцепляю окно по его заголовку. Вроде всё...

Andrey: Сделал то что хотел ! Если у кого есть поправки и замечания то пишите !!! Кому интересно привожу полный текст: ************************************************************************* * Copyright : (c) 2008, Verchenko Andrey. E-mail: 30195@mail.ru * : Все права сохраняются. * Date : 11/11/2008 * Avtor : Верченко Андрей Геннадьевич * Rem : Проверка запуска "копии" программы для xHarbour * : Отдельное СПАСИБО модераторам: Петру и Григорию http://clipper.borda.ru * : и Вячеславу Садонину ************************************************************************** #define MYPROGRAM " Программа проверки запуска ! " Procedure Main LOCAL nI:=0, nKey, hWnd := GetForegroundWindow() LOCAL cNameWin, cExeRun := SUBSTR(EXENAME(), RAT("\",EXENAME())+1 ) LOCAL cLstRun := SUBSTR(EXENAME(), 1, RAT(".",EXENAME()) )+"lst" LOCAL aStart := {}, aMenu:={}, cTemp, lSeek, lAnsiYes, nStartHendl REQUEST HB_CODEPAGE_RU866 HB_SETCODEPAGE( "RU866" ) REQUEST HB_LANG_RU866 HB_LANGSELECT( "RU866" ) IF hb_gt_version() == "WVT" // Если используется граф.терминал GTWVT.LIB cNameWin := HB_OEMTOANSI( MYPROGRAM ) lAnsiYes := .T. // Раскоментировать строки если используется терминал GTWVT.LIB //Wvt_SetCodePage(255) // #define OEM_CHARSET 255 - from wingdi.h //Wvt_SetFont( 'Terminal', 18, 10, 0 ) ELSE cNameWin := MYPROGRAM lAnsiYes := .F. ENDIF GTInfo( 26, cNameWin ) SETCOLOR("15/2") CLEAR SCREEN ? "Тек.номер окна:", hWnd, ' - Поиск окна: "'+UPPER(cNameWin)+'"' ? " Имя ЕХЕ-файла: ", cExeRun, " Путь:", SUBSTR(HB_ANSITOOEM(EXENAME()),1,RAT("\",EXENAME())) STRFILE("","Process.lst") aStart := GetWindowList() // Считать ХЕНДЛ окна и ИМЯ окна FOR nI:= 1 TO LEN(aStart) IF lAnsiYes AADD( aMenu, { aStart[nI,1], HB_ANSITOOEM(aStart[nI,2]) } ) ELSE AADD( aMenu, { aStart[nI,1], HB_ANSITOOEM(aStart[nI,2]) } ) ENDIF cTemp := STR(aMenu[nI,1])+", "+aMenu[nI,2] STRFILE( cTemp+CHR(13)+CHR(10),"Process.lst",.T.) NEXT if isexerunning(cExeRun) // Создания лог файла для просмотра результата. STRFILE("Прога уже запущена !"+CHR(13)+CHR(10)+CHR(13)+CHR(10),cLstRun) // ALERT("Прога уже запущена !") // Ищем и Переключяем на ранее запущенную программу... lSeek := .F. FOR nI := 1 TO LEN(aMenu) cTemp := STR(nI,3)+","+STR(aMenu[nI,1])+", "+aMenu[nI,2] STRFILE( cTemp+CHR(13)+CHR(10),cLstRun,.T.) IF lAnsiYes cTemp := HB_ANSITOOEM(cNameWin) ELSE cTemp := cNameWin ENDIF IF UPPER(cTemp) == UPPER(aMenu[nI,2]) cTemp := " хендлы:"+STR(hWnd)+" -?-"+STR(aMenu[nI,1]) STRFILE( cTemp+CHR(13)+CHR(10),cLstRun,.T.) IF hWnd # aMenu[nI,1] nStartHendl := aMenu[nI,1] lSeek := .T. EXIT ENDIF ENDIF NEXT cTemp := "Результат поиска: "+IIF(lSeek==.T.," T "," F ")+", ХЕНДЛ запущенный ранее проги = "+ALLTRIM(STR(nStartHendl)) STRFILE( cTemp+CHR(13)+CHR(10),cLstRun,.T.) IF lSeek MAXIMIZE( nStartHendl ) ELSE cTemp := "Не нашел ХЕНДЛ окна "+MYPROGRAM+" !" TONE(400,2) STRFILE( cTemp+CHR(13)+CHR(10),cLstRun,.T.) ENDIF quit endif DO WHILE .T. nKey := INKEY(1) IF nKey == 27 // K_ESC EXIT ENDIF @ 4,2 SAY "ESC-выход Режим ожидания:" ?? nI++ ENDDO return #define GW_HWNDFIRST 0 #define GW_HWNDLAST 1 #define GW_HWNDNEXT 2 #define GW_HWNDPREV 3 #define GW_OWNER 4 #define GW_CHILD 5 function GetWindowList() LOCAL aWindows := {}, cTitle := "" LOCAL hWnd := GetWindow( GetForegroundWindow(), GW_HWNDFIRST ) WHILE hWnd != 0 // Loop through all the windows if !empty(cTitle := GetWindowText( hWnd )) AADD( aWindows, {hWnd, cTitle} ) endif hWnd := GetWindow( hWnd, GW_HWNDNEXT ) // Get the next window ENDDO return aWindows #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include <shlobj.h> HB_FUNC( ISEXERUNNING ) // ( cExeNameCaseSensitive ) --> lResult { HANDLE hMutex = CreateMutex( NULL, TRUE, (LPTSTR) hb_parc(1) ); hb_retl( GetLastError() == ERROR_ALREADY_EXISTS ); ReleaseMutex( hMutex ); } HB_FUNC( GETFOREGROUNDWINDOW ) { hb_retnl( (LONG) GetForegroundWindow() ); } HB_FUNC( MINIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_MINIMIZE ); } HB_FUNC( MAXIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_RESTORE ); } HB_FUNC( GETWINDOWTEXT ) { int iLen = SendMessage( (HWND) hb_parnl(1), WM_GETTEXTLENGTH, 0, 0 ) + 1; char *cText = ( char * ) hb_xgrab( iLen ); GetWindowText( (HWND) hb_parnl(1), (LPTSTR) cText, iLen ); hb_retc( cText ); hb_xfree( cText ); } HB_FUNC( GETWINDOW ) { hb_retnl( (LONG) GetWindow((HWND) hb_parnl(1), hb_parni(2)) ); } #pragma ENDDUMP



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