Avatar billede nuab Nybegynder
13. december 2004 - 21:41 Der er 5 kommentarer og
1 løsning

Info fra en anden process!!

Er det muligt at hente informationer fra et kørende program, fra et andet program. Det jeg helt præcis skal have fat i er alle de vinduer som er åbnet inden i et anden program, for at kunne overvåge det. Jeg har ikke mulighed for at kode noget til det program hvor jeg vil have info'en fra. Jeg er selv lidt bange at det ikke kan lade sig gøre pga. af rettinghed til de enkelte Windows processer. Men er der en som har anden erfaring eller kender et lille hack som kan klare det?
Avatar billede bertelbrander Novice
13. december 2004 - 21:49 #1
Det er ret let, man bruger EnumWindows og EnumChildWindows eller EnumProcesses.

Hvis du fortæller lidt mere om hvad det er du vil, kan jeg se om jeg kan finde et eksempel.
Avatar billede nuab Nybegynder
14. december 2004 - 08:11 #2
Det jeg skal bruge er ikke bare lige som en taskmanager, men de enkelte Vinduer som kan åbnes inden i et program. min Monitor som skal observere disse ændringer i et andet program er dog java, så det skal laves om JNI, men det er lige meget lige nu.

Jeg skal have navne på de vinduer som er åbne i det pågældende program, eller hvis deres thread/process har mere info, vil da gerne have den.
Avatar billede bertelbrander Novice
14. december 2004 - 19:39 #3
Man kunne starte med:

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

void GetFileAndExt(const char *FullPath, char *Name)
{
  char Ext[MAX_PATH];
  _splitpath(FullPath, NULL, NULL, Name, Ext);
  strcat(Name, Ext);
}

BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
  char Text[1024] = "";
  GetWindowText(hwnd, Text, sizeof(Text));
  if(Text[0])
  {
      printf(">>%s\n", Text);
  }
  EnumChildWindows(hwnd, EnumChildProc, lParam);
  return TRUE;
}

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM Param)
{
  DWORD ProcessID = -1;

  GetWindowThreadProcessId(hwnd, &ProcessID);
  if(ProcessID == (DWORD )Param)
  {
    char Text[1024] = "";
    GetWindowText(hwnd, Text, sizeof(Text));
    if(Text[0])
    {
        printf(">%s\n", Text);
    }
    EnumChildWindows(hwnd, EnumChildProc, 0);
  }
  return TRUE;
}

int main(int argc, char *argv[])
{
  DWORD Processes[1024], ProcessesNeeded;
  DWORD NumProcesses, i;

  if(argc != 2)
  {
    printf("You have to specify which program you want to bring to front\n");
    return EXIT_FAILURE;
  }

  if(!EnumProcesses(Processes, sizeof(Processes), &ProcessesNeeded))
    return EXIT_FAILURE;

  NumProcesses = ProcessesNeeded/sizeof(DWORD);

  for(i = 0; i < NumProcesses; i++)
  {
    HMODULE ModHandle[1024];
    DWORD ModulesNeeded;
    HANDLE ProcessHandle;

    ProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE, FALSE, Processes[i]);
    if(EnumProcessModules(ProcessHandle, ModHandle, sizeof(ModHandle), &ModulesNeeded))
    {
      char ModuleName[MAX_PATH], FileName[MAX_PATH];
      if(GetModuleFileNameEx(ProcessHandle, ModHandle[0], ModuleName, sizeof(ModuleName)))
      {
        GetFileAndExt(ModuleName, FileName);
        if(!stricmp(FileName, argv[1]))
        {
          printf("Found a match: %s\n", ModuleName);
          EnumWindows(EnumWindowsProc, (LPARAM )Processes[i]);
          return EXIT_SUCCESS;
        }
      }
    }
    CloseHandle(ProcessHandle);
  }

  return EXIT_FAILURE;
}

Det lister alle vindue's titler for alle vinduer ejet af et program (angivet som parameter til programmet, f.ex. explorer.exe).

Se også:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/perfmon/base/psapi_functions.asp
Avatar billede nuab Nybegynder
13. juni 2006 - 15:53 #4
Hvis du vil have point for din deltagelse skal du ligge et svar bertelbrander
Avatar billede bertelbrander Novice
13. juni 2006 - 19:55 #5
Jeg samler ikke på point.
Avatar billede nuab Nybegynder
08. februar 2008 - 21:10 #6
*
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