Pomost
14 отговора
294 прегледа
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 :)
Отг: Pomost
с GetWindowThreadProcessId() получаваш ID на процеса.
за да намериш името на файла можеш да претърсиш стартираните в момента процеси за съответния Process ID.
за да намериш името на файла можеш да претърсиш стартираните в момента процеси за съответния Process ID.
Отг: 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 );
}
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 );
}
Отг: Pomost
Ako e neshto koeto trjabva da raboti na Win9x i NT moze da se polzvat Process32First() i Process32Next(). Opisani sa v MSDN.
Отг: 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.
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 :)
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), но е в къщи и не мога да погледна в момента в нея...
HTASK GetWindowTask(HWND hwnd);
след това използваш небезизвестната TOOLHELP.DLL. :)
ТaskFirst(), TaskNext() или направо ТaskFindHandle()
по принцип е възможно директно да се бръкне в heap-a на USER.EXE и от структурата за прозореца да се види кой е task-ът който го е създал (и оттам името на файла) - имаше една тъничка книжка за недокументираните функции в win 3.x на руски (несъмнено попреписана от Andrew Schulman), но е в къщи и не мога да погледна в момента в нея...
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.
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.
Отг: 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)! :)
Отг: Ne si prav.....
ми аз не съм го ползжал (не ми се е налагало).
просто в MSDN-а така пише
просто в MSDN-а така пише
Отг: Имате ли e-book za Win32 API ?
Имам го, искаше ми се нещо по-"така"...
Благодаря!
Благодаря!