On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 707
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.10.08 17:54. Заголовок: Как получить "хендл" запущенных программ ?


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


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 5 [только новые]


администратор




Пост N: 1021
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.10.08 11:36. Заголовок: http://clipper.borda..

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 11
Зарегистрирован: 02.10.08
ссылка на сообщение  Отправлено: 21.10.08 14:22. Заголовок: FUNCTION MAIN() LOC..


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




Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 708
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.10.08 19:39. Заголовок: Вопрос задавал для т..


Вопрос задавал для того чтобы поднять ранее запущенную программу.
см. в конце топика:
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
==================================================




Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 13
Зарегистрирован: 02.10.08
ссылка на сообщение  Отправлено: 22.10.08 16:33. Заголовок: Тада значицца так.....


Тада значицца так... Вот кусок реально работающей проги:
В самом начале:
......................
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, поэтому я выцепляю окно по его заголовку.
Вроде всё...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 730
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 11.11.08 19:13. Заголовок: Сделал то что хотел ..


Сделал то что хотел !
Если у кого есть поправки и замечания то пишите !!!

Кому интересно привожу полный текст:
*************************************************************************
* 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



Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 11
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет