Pomost

14 отговора 294 прегледа
#1

Pomost

Znae li niakoj kak moga da poluca imeto na izpalnimia fajl (.EXE) ako znam WND-to na glawniq ili niakoj drug ot prozorcite na programata. Blagodaria vi predvaritelno :)

Отговор
в отговор на Me #2

Отг: Pomost

с GetWindowThreadProcessId() получаваш ID на процеса.
за да намериш името на файла можеш да претърсиш стартираните в момента процеси за съответния Process ID.

Отговор
в отговор на Me #3

Отг: Pomost

Значи с FindWindow с вземаш HWND на прозореца. След това използваш GetWindowThreadProcessId за да вземеш идентификатора на процеса (process identifier). След това можеш да използваш нещо от сорта (взел съм го дусловно от MSDN) ама ще работи само под NT/2000. Може и да има и друг начин ама не знам. Успех!!!. Ето го сорса:

void PrintProcessNameAndID( DWORD processID )
{
char szProcessName[MAX_PATH] = "unknown";

// Get a handle to the process.

HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, processID );

// Get the process name.

if ( hProcess )
{
HMODULE hMod;
DWORD cbNeeded;

if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
&cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,
sizeof(szProcessName) );
}
}

// Print the process name and identifier.

printf( "%s (Process ID: %u)\n", szProcessName, processID );

CloseHandle( hProcess );
}


Отговор
в отговор на Lubo #4

Отг: Pomost

Ako e neshto koeto trjabva da raboti na Win9x i NT moze da se polzvat Process32First() i Process32Next(). Opisani sa v MSDN.

Отговор
в отговор на Someone #5

Отг: Pomost

Ah, ne iskam da podvezdam horata, obache tova njama da raboti na NT 4, samo 5. Taka che za starite NT-ta GetModuleBaseName() shte svurshi rabotata.

Отговор
в отговор на ___ #6

Pomost

Triabva da ima "nesto" v API funkciite oste ot Win3.xx s koeto da se polucava. Horata go praviat v programi za Win3.11 - tova mi triabva. Blagodaria :)

Отговор
в отговор на Me #7

3.1 solution

при win 3.x нещата (на пръв поглед) са сходни.
HTASK GetWindowTask(HWND hwnd);
след това използваш небезизвестната TOOLHELP.DLL. :)
ТaskFirst(), TaskNext() или направо ТaskFindHandle()

по принцип е възможно директно да се бръкне в heap-a на USER.EXE и от структурата за прозореца да се види кой е task-ът който го е създал (и оттам името на файла) - имаше една тъничка книжка за недокументираните функции в win 3.x на руски (несъмнено попреписана от Andrew Schulman), но е в къщи и не мога да погледна в момента в нея...

Отговор
в отговор на Me #8

Отг: Pomost

delphi /марко канти/ II том има пример как се прави това.

Отговор
в отговор на Me #9

Pak ne za vsichki varianti na Win

UINT WINAPI GetWindowModuleFileName(
HWND hwnd, // handle to window
LPTSTR lpszFileName, // file name buffer
UINT cchFileNameMax // max size of file name buffer
);

Requires Windows NT 4.0 SP3 or later.
Requires Windows 98.


Отговор
в отговор на Пламен #10

Отг: Ne si prav.....

Ne si prav moj covek tova raboti i za Win3.x. Tocno tova mi triabvashe Blagodaria ti MNOGO |(Kakto i na vsicki ostanali za ideite)! :)

Отговор
в отговор на Me #11

Имате ли e-book za Win32 API ?

например на Пецолд или някоя подобна ?

Благодаря ви.

Отговор
в отговор на Me #12

Отг: Ne si prav.....

ми аз не съм го ползжал (не ми се е налагало).
просто в MSDN-а така пише

Отговор
в отговор на InfoMatic #13

Отг: Имате ли e-book za Win32 API ?

help-a ot MSDN shte ti swyrshi li rabota

Отговор
в отговор на Lolit #14

Отг: Имате ли e-book za Win32 API ?

Имам го, искаше ми се нещо по-"така"...

Благодаря!

Отговор
в отговор на Пламен #15

Tap vapros ama

Kakvo e tova MSDN i ot kade moga da go nameria za da go proceta :)

Отговор