请教!!

解决方案 »

  1.   

    谢谢高人!
    请教:如何由由phn得到hwnd???
      

  2.   

    代码比较长一点,我就不翻译了//FindPidWin.cpp
    //试验使用EnumWindows函数
    //给定进程pid,查找它的可见的主窗口句柄,实现对进程主窗口的某些操作#include <windows.h>
    #include <stdio.h>
    #include <tlhelp32.h>
    BOOL CALLBACK MyEnumWindowsProc(
        HWND hwnd, // handle to parent window
        LPARAM lParam  // application-defined value
       );
    DWORD pidwin;
    HWND  Myhwnd;
    DWORD  ProcessId;//欲查找的进程pid
    HANDLE ProcessHandle;//目标进程的句柄
    DWORD State;
    BOOL FindPid(DWORD Pid);//查找给定的pid值是否存在
    char ProcessName[20];//存储进程名字
    char WindowText[512];//假设512字节已足够装下窗口的标题
    void main(int argc,char *argv[])
    {
    //=====================查找输入的pid是否存在=======================  char   pid[8];
     int i = 0;
     if(argc != 2)
     {
      printf("Usage: FindPidWin /[pid]\n");
      Sleep(2000);
      return;
     }
     //变量初始化
     ZeroMemory(pid,8); 
     ZeroMemory(ProcessName,20);
     ZeroMemory(WindowText,512);
      //获取输入的pid
     do{
      (*argv)++;
     }while(**argv != '/');
     
     while((**argv != '\0')&&(i<8))
     {
      (*argv)++;
      pid[i++] = **argv;  
      
     }
     //字符串转变成整型
     ProcessId = atoi(pid);  if(!FindPid(ProcessId))
     {
      printf("没有找到PID为%d的进程!\n",ProcessId);  
      return;
     }
     printf("Find Process Pid:%d Name:%s Successfully!\n",ProcessId,ProcessName);
    //===================================================================== DWORD command; 
     pidwin = NULL;
     Myhwnd = NULL; 
     EnumWindows(MyEnumWindowsProc,0);
     if(Myhwnd == NULL)//没有找到窗口
     {
      printf("进程%s\tpid:%d当前没有可见窗口!\n",
       ProcessName,ProcessId);
      return;
     }
     else//找到目标进程的主窗口
     {
      GetWindowText(Myhwnd,WindowText,512);
      printf("进程%s的主窗口句柄为:0x%X\n",ProcessName,Myhwnd);
      printf("窗口0x%X的标题: %s\n",Myhwnd,WindowText);
      ProcessHandle = OpenProcess(SYNCHRONIZE,FALSE,ProcessId);
      if(ProcessHandle == NULL)//有错误发生
      {
       printf("打开目标进程时候出错,错误码:%d",GetLastError());
       return;
      }
      else//可以对窗口进行处理了
      {
       printf("命令码\n");
       printf("0-隐藏窗口\t1-显示窗口\t2-最小化窗口\n");
       printf("3-最大化窗口\t4-禁止窗口\t5-使能窗口\n");   
       printf("6-发送WM_CLOSE消息到窗口\t7-退出程序\n");
    Input:      
       printf("Command:");
       scanf("%u",&command);
       if(command>7)
       {
        printf("illegal operation!\7\n");
        goto Input;
       }
       if(command==7)
        return;
       if(command>=0 &&command<=3)//窗口显示控制
        ShowWindow(Myhwnd,command);
       else
        if(command>=4 && command<=5)//窗口使能控制
         EnableWindow(Myhwnd,command-4);
        else//输入为6,关闭窗口所在应用程序
        {
         printf("Send WM_CLOSE Message to window:0x%X\n",Myhwnd);
         SendMessage(Myhwnd,WM_CLOSE,0,0);    
         State = WaitForSingleObject(ProcessHandle,5000);
         switch( State )
         {
         case WAIT_TIMEOUT:
          printf("在发送WM_CLOSE消息5秒后目标进程%s仍未结束!\n",ProcessName);
          break;
         case WAIT_OBJECT_0://目标进程退出,发信号
          printf("目标进程%s已经退出!\n",ProcessName);
          return;//退出本程序
          
         default:
          break;
         } 
        }
        goto Input;//继续输入操作命令
      }
     }
    }
    BOOL CALLBACK MyEnumWindowsProc(HWND hwnd,LPARAM lParam)
    {
     
     if(IsWindowVisible(hwnd))
     {
     GetWindowThreadProcessId(hwnd,&pidwin);
        if(pidwin == ProcessId)  
     {
      //找到其主窗口句柄放入Myhwnd中
      Myhwnd = hwnd;
      for(;;)
      {
       hwnd = GetParent(Myhwnd);
       if(hwnd != NULL)//传入的hwnd不是主窗口
       {
        printf("Window:%XH的父窗口是:%XH\n",Myhwnd,hwnd);
        Myhwnd = hwnd;
       }
       else //hwnd为NULL,Myhwnd已是主窗口句柄
        return FALSE;
      }  
     }
     }
     return TRUE;//继续枚举
    }//查找指定的pid是否存在
    BOOL FindPid(DWORD Pid)

     BOOL Exist = FALSE;
     HANDLE hSnapshot = NULL;
     hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
     PROCESSENTRY32 pe;
     pe.dwSize = sizeof(PROCESSENTRY32);
     
     Process32First(hSnapshot,&pe);
     do
     {
      if(pe.th32ProcessID == Pid)
      {
       //存储进程名
       strcat(ProcessName,pe.szExeFile);
       Exist=TRUE;
       break;
      }
     }
     while(Process32Next(hSnapshot,&pe) == TRUE);
     CloseHandle(hSnapshot);
     return Exist;}
      

  3.   

    谢谢大侠了!
    辛苦了!可惜我看不懂VC的东东,哪能位大侠帮忙给个VB的?或者翻译一下?谢谢先!
      

  4.   

    看 MSDN 比较好一些,*_*
    关键在于:
    GetWindowThreadProcessId
    CreateToolhelp32Snapshot
    Process32Next
      

  5.   

    用 EnumWindow 将窗口句柄对应的线程ID与进程列表的线程ID相比较