(C++) Identificando processo

Ir em baixo

(C++) Identificando processo

Mensagem por Willian Luigi em Sex Ago 09, 2013 8:52 pm

Vim compartilhar com vocês uma maneira bacana que eu achei de identificar um determinado processo, ou mais de um processo.

O código faz uma listagem com o nome de todos os processos, para identificar um determinado processo só é preciso fazer um loop na lista e ir comparando cada resultado com o nome do processo...

Existem outras formas mais simples de se fazer isso, só estou compartilhando esta porque a achei interessante. Smile

Código teste:
Código:


//--------------------------------------------------------------------------------------
// Copyright (c) CODE.ME - since 2013.1. All rights reserved.
//--------------------------------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
#include <psapi.h>

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

HWND    g_hWnd = NULL;

HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow );
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );

int searchGTAProcess( DWORD processID )
{
TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID );
if (NULL != hProcess )
{
    HMODULE hMod;
    DWORD cbNeeded;

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

if (wcsstr(szProcessName, L"gta_sa.exe")) return 1;
return 0;
}

int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow )
{
UNREFERENCED_PARAMETER( hPrevInstance );
UNREFERENCED_PARAMETER( lpCmdLine );

if( FAILED( InitWindow( hInstance, nCmdShow ) ) )
    return 0;

MSG msg = {0};
while( GetMessage( &msg, NULL, 0, 0 ) )
{
    TranslateMessage( &msg );
    DispatchMessage( &msg );
}

return ( int )msg.wParam;
}

HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow )
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof( WNDCLASSEX );
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
wcex.hbrBackground = ( HBRUSH )GetStockObject(LTGRAY_BRUSH);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = L"codeme";
if( !RegisterClassEx( &wcex ) )
    return E_FAIL;

RECT rc = { 0, 0, 470, 240 };
AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, FALSE );
g_hWnd = CreateWindow( L"codeme", L"Localizando GTA.", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, NULL, NULL, hInstance, NULL );

CreateWindow(L"BUTTON", L"Localizar", WS_CHILD + WS_VISIBLE + WS_TABSTOP, 235, 120, 80, 25, g_hWnd, (HMENU)1, hInstance, NULL);

if( !g_hWnd )
    return E_FAIL;

ShowWindow( g_hWnd, nCmdShow );

return S_OK;
}

LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
PAINTSTRUCT ps;
HDC hdc;

switch( message )
{
case WM_COMMAND:
    {
        if (LOWORD(wParam) == 1)
        {
        DWORD allProcess[1024], currProcess, id;

if (!EnumProcesses(allProcess, sizeof(allProcess), &id))
{
MessageBox(NULL, L"Não foi possível executar a função.", L"ERRO", MB_IConerror);
}
currProcess = id / sizeof(DWORD);

for (int i = 0; i < currProcess; ++i)
{
if (allProcess[i] != 0)
{

if (searchGTAProcess(allProcess[i]))
{
MessageBox(NULL, L"GTA localizado !", L"Aviso", MB_ICONINFORMATION);
}
}
}
}
break;
}
case WM_PAINT:
        hdc = BeginPaint( hWnd, &ps );
        EndPaint( hWnd, &ps );
        break;

case WM_DESTROY:
PostQuitMessage( 0 );
break;

default: return DefWindowProc( hWnd, message, wParam, lParam );
}

return 0;
}

Código de comparação do nome do processo que você quer, com o ID do processo que você tem:
Código:
int searchGTAProcess( DWORD processID )
{
TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID );
if (NULL != hProcess )
{
    HMODULE hMod;
    DWORD cbNeeded;

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

if (wcsstr(szProcessName, L"gta_sa.exe")) return 1;
return 0;
}
Código usado para montar a lista dos processos em execução, id por id...
Código:
DWORD allProcess[1024], currProcess, id;

if (!EnumProcesses(allProcess, sizeof(allProcess), &id))
{
MessageBox(NULL, L"Não foi possível executar a função.", L"ERRO", MB_IConerror);
}
currProcess = id / sizeof(DWORD);

for (int i = 0; i < currProcess; ++i)
{
if (allProcess[i] != 0)
{

if (searchGTAProcess(allProcess[i]))
{
MessageBox(NULL, L"GTA localizado !", L"Aviso", MB_ICONINFORMATION);
}
}
}
É isso, abraços..

_________________
<br>
avatar
Willian Luigi
Fundador
Fundador

Mensagens : 63
Data de inscrição : 22/07/2013
Idade : 23
Localização : CODE.ME company

Ver perfil do usuário http://codeme.forumeiros.com

Voltar ao Topo Ir em baixo

Fala Broew! WINAPI na veia.

Mensagem por Voltz em Qua Ago 14, 2013 3:12 am

Oi, também estou estudando WINAPI, gostei do forum e vou participar. E aproveitando a oportunidade, queria saber se você faz idéia de como deixar o estilo da janela conforme o sistema operacional? Já pesquisei de tudo mas tudo que eu tento fazer é em vão Sad  Abrçs boa sorte pra nóis aew!

lol!
avatar
Voltz
Novato
Novato

Mensagens : 7
Data de inscrição : 14/08/2013
Idade : 24
Localização : Barueri

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: (C++) Identificando processo

Mensagem por Willian Luigi em Qui Ago 15, 2013 8:08 pm

O estilo da janela ? Isso já é padrão, a janela sempre assume o estilo conforme seu SO, mas você deve estar falando sobre o design dos handles filhos, tipo botão, fundo, textbox... Esse tipo de coisa certo ? Eu ainda não cheguei a olhar isso, meu ponto de vista para aplicativos Win32 são mais a questão da funcionalidade, mas a sua questão é boa...

Se for esse lance dos handles filhos, eu posso te dar uma resposta mais tarde.

_________________
<br>
avatar
Willian Luigi
Fundador
Fundador

Mensagens : 63
Data de inscrição : 22/07/2013
Idade : 23
Localização : CODE.ME company

Ver perfil do usuário http://codeme.forumeiros.com

Voltar ao Topo Ir em baixo

Re: (C++) Identificando processo

Mensagem por Voltz em Sex Ago 16, 2013 5:22 am

Willian Luigi escreveu:O estilo da janela ? Isso já é padrão, a janela sempre assume o estilo conforme seu SO, mas você deve estar falando sobre o design dos handles filhos, tipo botão, fundo, textbox... Esse tipo de coisa certo ? Eu ainda não cheguei a olhar isso, meu ponto de vista para aplicativos Win32 são mais a questão da funcionalidade, mas a sua questão é boa...

Se for esse lance dos handles filhos, eu posso te dar uma resposta mais tarde.
sim, para ficar mais claro o que estou tentando fazer é isso:













Quero tirar o tema de windows 98 e deixar o tema conforme o sistema operacional.Embarassed Embarassed 

bounce
avatar
Voltz
Novato
Novato

Mensagens : 7
Data de inscrição : 14/08/2013
Idade : 24
Localização : Barueri

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: (C++) Identificando processo

Mensagem por Willian Luigi em Sex Ago 16, 2013 10:19 am

Acho que entendi perfeitamente, vou te dar umas dicas aqui sobre um artigo que havia lido uma vez passada...

Você usa VS(Visual Studio) ? ou qualquer outra instância desse tipo ? VC++ ? Se sim...

Clique com o botão direito na solução, vá em ADD->new item.
Digite o nome da solução que no meu caso é "GAME", então ficará: "GAME.exe.manifest"

Após ter criado você adiciona o seguinte código dentro desse arquivo:
Código:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="*"
    name="CompanyName.ProductName.YourApplication"
    type="win32"
/>
<description></description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>
Depois disso você vai na include principal que você usa, ou então no próprio .cpp principal e adiciona isto:
Código:
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
Resultado:

_________________
<br>
avatar
Willian Luigi
Fundador
Fundador

Mensagens : 63
Data de inscrição : 22/07/2013
Idade : 23
Localização : CODE.ME company

Ver perfil do usuário http://codeme.forumeiros.com

Voltar ao Topo Ir em baixo

Re: (C++) Identificando processo

Mensagem por Voltz em Sex Ago 16, 2013 7:43 pm

Olha eu utilizo Notepad++, codeblocks, e o Visual C++, sempre utilizo o notepad++ porque ainda estou em fase de aprendizado, entretando para fazer isso aí que vc falou eu utilizei o VC++.
Só que não funcionou, o programa até que roda, porém alguns componentes(1 botão, 1 messagebox em um menu), simplesmente não aparecem, sabe qual o problema?Suspect Rolling Eyes 
Eu estava querendo voltar pro Java, porém to gostando de WINAPI, mas com esse problema da aparência do programa eu fico meio que na dúvida, sanando ela vou começar a estudar mais a WINAPI e futuramente OpenGL;



Obrigado pela resposta.

Eu codei o seguinte:

Código:
#include <Windows.h>
#include <tchar.h>

#define CLASSE_JANELA "janelaWindows"
#define SAIR 1

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){

   MSG msg;
   HWND hWnd;
   WNDCLASSEX wc;

   wc.cbSize = sizeof(WNDCLASSEX);
   wc.hInstance = hInstance;
   wc.lpszClassName = CLASSE_JANELA;
   wc.lpszMenuName = NULL;
   wc.lpfnWndProc = WndProc;
   wc.style = CS_DBLCLKS;
   wc.cbWndExtra = 0;
   wc.cbClsExtra = 0;
   wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
   wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
   wc.hCursor = LoadCursor(NULL, IDC_HAND);
   wc.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);

   if(!RegisterClassEx(&wc)){

      return 0;

   } else{

      hWnd = CreateWindowEx( WS_EX_CLIENTEDGE, CLASSE_JANELA, CLASSE_JANELA, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL);

      ShowWindow(hWnd, nCmdShow);
      UpdateWindow(hWnd);

   }

   while(GetMessage(&msg, NULL, 0, 0)){

      TranslateMessage(&msg);
      DispatchMessage(&msg);

   }
   return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){

   switch(message){

      case WM_CREATE:{
         CreateWindow("button", "clique", WS_VISIBLE | WS_CHILD | WS_BORDER, 10, 10, 70, 50, hWnd, NULL, NULL, NULL);
         HMENU menu, subMenu;

         menu = CreateMenu();
         subMenu = CreateMenu();

         AppendMenu(menu, MF_POPUP, (UINT_PTR)subMenu, "Files");
            AppendMenu(subMenu, MF_STRING, SAIR, "Exit");

         SetMenu(hWnd, menu);
         break;
         }

      case WM_COMMAND:{
         if(LOWORD(wParam) == 1){

            MessageBox(NULL, "Ola", "Atenção", MB_OK | MB_ICONERROR);
            break;

         } else{break;}
      }
      case WM_CLOSE:
         DestroyWindow(hWnd);
         break;

      case WM_DESTROY:
         PostQuitMessage(0);
         break;

      default:
         return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}
avatar
Voltz
Novato
Novato

Mensagens : 7
Data de inscrição : 14/08/2013
Idade : 24
Localização : Barueri

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: (C++) Identificando processo

Mensagem por Willian Luigi em Sex Ago 16, 2013 8:41 pm

Em relação a IDE eu recomendo utilizar VC++ ou o próprio VS(opinião pessoal) pois eu trabalho com o visual studio a 3 anos mais ou menos, e nunca me decepcionou.

Você tem que ter a estrutura do WinAPI montada, eu dei alguns exemplos nos tutoriais de WinAPI que criei aqui no fórum:
Introdução(pt1)
Eventos(pt2)

depois que você tiver o WinAPI montado, para mudar a aparência das janelas você faz oque eu citei no post acima, cria um arquivo manifest e cola aquele XML dentro, salva e ai adiciona o outro código no .cpp ou .h principal...

Você mencionou JAVA, dependendo do que você queira fazer amigo, ai você pode se redirecionar a determinadas linguagens...
Eu só mexo com JAVA na faculdade, trabalho com C#/JAVA e tenho também meus projetos e meus estudos em cima de OpenGL/DirectX. Very Happy

_________________
<br>
avatar
Willian Luigi
Fundador
Fundador

Mensagens : 63
Data de inscrição : 22/07/2013
Idade : 23
Localização : CODE.ME company

Ver perfil do usuário http://codeme.forumeiros.com

Voltar ao Topo Ir em baixo

Re: (C++) Identificando processo

Mensagem por Voltz em Sab Ago 17, 2013 8:28 pm

Willian Luigi escreveu:
depois que você tiver o WinAPI montado, para mudar a aparência das janelas você faz oque eu citei no post acima, cria um arquivo manifest e cola aquele XML dentro, salva e ai adiciona o outro código no .cpp ou .h principal...
Não adianta, não funciona! pale 

_________________
_____lol!
avatar
Voltz
Novato
Novato

Mensagens : 7
Data de inscrição : 14/08/2013
Idade : 24
Localização : Barueri

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: (C++) Identificando processo

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Voltar ao Topo


 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum