功能:根据进程名称对进程进行两种操作:
1.启动进程:进程的主窗体本身是设置成topmost的,如果进程未启动则启动进程,如果已经启动则设置成topmost并且显示在最前。
2.隐藏进程:如果进程启动,则隐藏进程。未启动不做任何操作。
几年不用vc,很多api想不起来了,望大家提醒下,最好给代码。---
我想到的,启动进程是否用CreateProcess,但是如果进程已经启动,怎么获取句柄?
显示窗体好像可以用ShowWindow,设置topmost好像用SetWindowPos
但是好像实现不了,1.无法把进程隐藏?(已经设置成topmost的程序,.net程序)
2.无法显示成topmost?

解决方案 »

  1.   

    EnumWindows枚举所有窗口,在回调函数中GetWindowThreadProcessId获取进程ID,再OpenProcess、GetModuleFileName、CloseHandle等到进程名称,如果发现目标进程,则SetWindowPos设置为TopMost窗口,如果不存在目标进程则CreateProcess。
      

  2.   

    我如果枚举进程:EnumProcess,怎么根据返回的handle来获取进程的HWND?
      

  3.   

    可以参考一下MSDN上面的说明:#include <windows.h>
    #include <stdio.h>
    #include <tchar.h>
    #include "psapi.h"void PrintProcessNameAndID( DWORD processID )
    {
        TCHAR szProcessName[MAX_PATH] = 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) );
            }
        }    // Print the process name and identifier.    _tprintf( TEXT("%s  (PID: %u)\n"), szProcessName, processID );    CloseHandle( hProcess );
    }void main( )
    {
        // Get the list of process identifiers.    DWORD aProcesses[1024], cbNeeded, cProcesses;
        unsigned int i;    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
            return;    // 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++ )
            PrintProcessNameAndID( aProcesses[i] );
    }
      

  4.   

    直接FindWindow直接返回你要的窗口句柄,不是更简单,何必枚举进程!
      

  5.   

    你想做到什么程度的“进程隐藏”?是不显示窗口,还是任务管理器里面不显示?
    如果是隐藏窗口就简单啦,还是用ShowWindow就可以隐藏如果要任务管理器里面不显示进程,也有很多方法。
    有Hook API、摘除进程链,也有直接发送消息给任务管理删除自身的。
      

  6.   

    看过上述示例。但是枚举出进程,不知道怎么根据进程的HANDLE来获取进程的HWND。好像只能够先获取HWND,而后获取HANDLE...
      

  7.   

    先取窗口HANDLE,再取进程HANDLE