比如一个可执行文件 abc.exe 该程序运行时会有一个窗体
可以通过可执行文件的名称获取其运行时的 HWND吗?

解决方案 »

  1.   

    根据其 Class 或者窗口标题可以得到:HWND FindWindow(
      LPCTSTR lpClassName,  // class name
      LPCTSTR lpWindowName  // window name
    );
      

  2.   

    1.遍历进程,查找abc.exe 进程id and 句柄
    2.通过进程句柄,找到窗口句柄
      

  3.   

    如果你知道该应用程序窗口的名字可以使用FindWindow(NULL,"应用程序窗口名");查找该应用程序的窗口句柄
      

  4.   

    1.遍历进程,查找abc.exe 进程id and 句柄
    2.通过进程句柄,找到窗口句柄=============想听1。2的详解
      

  5.   

    二楼所说的方法操作起来是很烦的,代码也很长.
    用一楼的最快捷:
    如:
    CWnd *pwnd=FindWindow(NULL,"程序标题");
    pwnd->m_hWnd即为它的HWND当然,你也可以用SPY+来得到它的类名,
    比如为XXXX,
    这样就可以:
    CWnd *pwnd=FindWindow("XXXX",NULL);
      

  6.   

    有两种方法:
    1.用toolhelp32函数枚举系统线程,再用EnumThreadWindows函数枚举线程窗体2。遍历进程,toolhelp32或PSAPI函数实现。再用EnumWindows或EnumDesktopWindows没举系统窗体,获得窗口句柄,再用GetWindowThreadProcessId函数获得窗口对应的进程ID,和toolhelp32或PSAPI函数得到的进程名比对
      

  7.   

    我来抢分,1年多没来抢分了。HWND FindWindow(
      LPCTSTR lpClassName,  // class name
      LPCTSTR lpWindowName  // window name
    );确实很简单的,也好用.
      

  8.   

    FindWindow 可以不过
    如果窗体的标题是动态的呢?
    xuanzg(小钢娃) 
    1.遍历进程,查找abc.exe 进程id and 句柄
    2.通过进程句柄,找到窗口句柄你说的查找进程应该如何做?
    又该如何判断该进程是否存在?
      

  9.   

    查找进程:BOOL FindProc(LPCSTR appName)
    {
    PROCESSENTRY32 ProcEntry;
    BOOL isExist(0); HANDLE hproc = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    memset(&ProcEntry, 0, sizeof(ProcEntry));
    ProcEntry.dwSize = sizeof(ProcEntry);
    ProcEntry.cntUsage = 1; strcpy(ProcEntry.szExeFile, "hh.exe"); if(Process32First(hproc, &ProcEntry))
    {
    for(;;)
    {
    if(!Process32Next(hproc, &ProcEntry))
    break;
    // HANDLE h=OpenProcess(PROCESS_ALL_ACCESS,TRUE,info->th32ProcessID);

    char lpFileName[256] = {0};
    HANDLE hProcess =
    OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
    FALSE, 
    ProcEntry.th32ProcessID
    );
    //得到进程完全路径
    if(NULL != hProcess)
    {
    HMODULE hMod;
    DWORD cbNeeded;

    //得到模块句柄
    if( EnumProcessModules(hProcess, &hMod, sizeof( hMod ), &cbNeeded))
    {
    DWORD dw = GetModuleFileNameEx(hProcess, hMod, lpFileName, 256);
    }
    CloseHandle(hProcess); //比较
    if(0 == strcmp(appName, lpFileName))
    {
    isExist = 1;
    break;
    }
    }
    }
    }
    CloseHandle(hproc);
    return isExist;
    }
      

  10.   

    找到进程,发送消息
    void SendMessageToProcess(LPPROCESS_INFORMATION lpProcessInformation, 
                              UINT Msg, WPARAM wParam, LPARAM lParam);
    static BOOL CALLBACK EnumWindowCallBack(HWND hwnd, LPARAM lParam);                  
    void CMyWinApp:: SendMessageToProcess(LPPROCESS_INFORMATION lpProcessInformation, 
                                          UINT Msg, WPARAM wParam, LPARAM lParam)
    {
    FINDWINDOWHANDLESTRUCT fwhs;
    fwhs.ProcessInfo = lpProcessInformation;
    fwhs.hWndFound  = NULL; EnumWindows ( EnumWindowCallBack, (LPARAM)&fwhs ) ; SendMessage ( fwhs.hWndFound, Msg, wParam, lParam );
    }CMyWinApp::EnumWindowCallBack(HWND hwnd, LPARAM lParam) 

    FINDWINDOWHANDLESTRUCT * pfwhs = (FINDWINDOWHANDLESTRUCT * )lParam; 
    DWORD ProcessId; 
    CString Title; 
    GetWindowThreadProcessId ( hwnd, &ProcessId );  CWnd::FromHandle( hwnd )->GetWindowText(Title);
    if ( ProcessId  == pfwhs->ProcessInfo->dwProcessId && Title.GetLength() != 0) 

    pfwhs->hWndFound = hwnd; 
    return false; 

    else 

    // Keep enumerating 
    return true; 

    }