Avatar billede davi_72 Nybegynder
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
Avatar billede bertelbrander Novice
08. maj 2007 - 20:13 #1
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);
}
Avatar billede davi_72 Nybegynder
25. maj 2007 - 16:13 #2
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.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester