08. maj 2007 - 14:44
												Der er
									2 kommentarer													
									
		 
		
			
Hvordan får man fat i skærmkoordinaterne på en app i windows?
			Hej alle
Jeg har brug for at finde ud af koordinaterne og evt. størrelsen for en givet applikation fundet igennem windowsjobliste.
Jeg tror at det kan lade sig gøre igennem mfc, men siden jeg koder med c++ builder er jeg ikke helt sikker på hvordan jeg skal gribe det an.
Håber på at der er nogle kloge hoveder der kan hjælpe.
Mvh
					
		
	 
		
		
			Man kan ikke noget med MFC som man ikke kan uden.
Jeg ved ikke om der findes en BCB specifik måde at gøre det på, men følgende bør virke med BCB også.
Programmet lister position for alle "top level" vinduer med navnet på deres program.
Der kommer nok nogle "falske" hits, dem kan vi så sortere fra.
#include <iostream>
#include <windows.h>
#include <psapi.h>
#include <map>
std::map<DWORD /* ProcessId */, std::string /* ProgId */>MyMap;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM)
{
   DWORD ProcessId;
   GetWindowThreadProcessId(hwnd, &ProcessId);
   if(MyMap.find(ProcessId) != MyMap.end())
   {
      RECT R;
      if(GetWindowRect(hwnd, &R))
      {
         std::cout << "Got: " << MyMap[ProcessId] << std::endl;
         std::cout << "At: " << R.left << ", " << R.top << ", " << R.right << ", " << R.bottom << std::endl;
      }
   }
   return TRUE;
}
int main()
{
   DWORD Processes[1024], ProcessesNeeded;
   DWORD NumProcesses, x;
   int ProcessIndex;
   if(!EnumProcesses(Processes, sizeof(Processes), &ProcessesNeeded))
      return 1;
   NumProcesses = ProcessesNeeded/sizeof(DWORD);
   for(x = 0, ProcessIndex = -1; x < NumProcesses && ProcessIndex == -1; x++)
   {
      HMODULE ModHandle[1024];
      DWORD ModulesNeeded;
      HANDLE ProcessHandle;
      ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, TRUE, Processes[x]);
      if(EnumProcessModules(ProcessHandle, ModHandle, sizeof(ModHandle), &ModulesNeeded))
      {
         char ModuleName[MAX_PATH];
         if(GetModuleFileNameEx(ProcessHandle, ModHandle[0], ModuleName, sizeof(ModuleName)))
         {
            MyMap[Processes[x]] = ModuleName;
         }
      }
      CloseHandle(ProcessHandle);
   }
   EnumWindows(EnumWindowsProc, 0);
}
		
		
	 
	
		
		
			Tak, dit svar ledte mig til løsningen. 
Lavede statiske metoder ud af begge, og det virker fint.
Smid et svar for point, ellers tak for input.