Problem z uzyskaniem uchwytu okna

0

Witam!
Piszę program w WinAPI. Potrzebuję uzyskać uchwyt do pewnego procesu. Z tego co do tej pory wyczytałem można go uzyskać poprzez uchwyt okna związanego z tym procesem.
Otóż próbowałem już paru sposobów i żaden nie chce poskutkować - aplikacja zdaje się być w jakiś sposób zabezpieczona.
Wywołując pętle z funkcją EnumWindows z funkcją zwrotną zmieniającą tekst tytuły okna. Efekt - wszystkie okna, oprócz tego jednego mają zmienioną nazwę.
Kolejny krok - wykorzystałem program spy++. Po tytule okna również nie znajduje uchwytu. Podobnie po nazwie klasy okna odczytanej również z tego programu. (czyli wykorzystane funkcje FindWindow, GetForegroundWindow(),GetWindow()).

Z góry przepraszam, jeżeli nie trafiłem w dział, bo w sumie te sprawy okienkowe to nie tylko C, ale jednak w tym języku szukam rozwiązania problemu.
Z góry dziękuję za pomoc, tudzież może jakiś inny sposób na pozyskanie uchwytu procesu.

Pozdrawiam

0

jeśli szukać uchwytu procesu, to dlaczego nie
EnumProcesses()?

0

Nie znałem tej funkcji. Dzięki, dzisiaj spróbuje w ten sposób! Mam nadzieje, że tym razem zadziała.

0

Ok, teraz tak jakby dalsza część problemu. Skorzystałem z tej funkcji, którą wspomniałeś. Jednak nie mogę pozyskać nazwy wszystkich procesów (program wstawia tam <unknown>). Więc spróbowałem znaleźć wszystkie okna, od nich pozyskać ID procesu i porównać z danym procesem. I okazuje się, że żaden nie pasuje. Co jest źle?

#include <stdafx.h>
#include <windows.h>
#include <stdio.h>
#include <psapi.h>

#pragma comment(lib, "psapi.lib")

DWORD processId;

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lparam)
{
	//if(!hwnd) return false;
	DWORD id=GetWindowThreadProcessId(hwnd,&id);
	printf("process id: %d %d\n", id, processId);
	if(id==processId)
	{
		printf("THEY MATCH!process id: %d\n", id);
		char buffer[256];
		GetWindowText(hwnd,(LPWSTR)buffer,255);
		printf("%s ", buffer);

	}

	return true;

}

void PrintProcessNameAndID( DWORD processID )
{

	processId=processID;
    TCHAR szProcessName[256] = TEXT("<unknown>");

    // Get a handle to the process.

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

    // Get the process name.

    if (NULL != hProcess )
    {
        HMODULE hMod;
        DWORD cbNeeded;

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

	EnumWindows(&EnumWindowsProc,NULL);

    // Print the process name and identifier.

    _tprintf( TEXT("%s  (PID: %u)\n"), szProcessName, processID );

    CloseHandle( hProcess );
	system("PAUSE");
}

int main()
{
    // Get the list of process identifiers.

    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;

    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
        return 0;

    // Calculate how many process identifiers were returned.

    cProcesses = cbNeeded / sizeof(DWORD);

    // Print the name and process identifier for each process.

    for ( i = 0; i < cProcesses; i++ )
        if( aProcesses[i] != 0 )
            PrintProcessNameAndID( aProcesses[i] );

        return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1