我的mfc对话框程序在运行中需要用到FindWindow来查找指定标题的窗口,然后根据是否找到来决定是否新建窗口,FindWindow的两个参数都使用了,其中类名称为"#32770",可如果遇到其他类名称相同标题也相同的窗口就不行了(比如其他用vc开发的mfc程序),请问如何解决这样的问题?

解决方案 »

  1.   

    用GetWindowThreadProcessId获取进程ID,来判断是不是你感兴趣的目标进程的窗口.
    另外,只用类肯定不行,如果目标窗口标题固定,最好再加上标题进行判断.
      

  2.   

    Enumwindow
    在里面判定找到的窗口所有在processid是否与自己程序的processid相同
      

  3.   

    如果你要找的窗口是自己写的程序,完全可以把类名称起的复杂一些,让它不可能重名,比如
    window_DDC72340_9660_4DB9_B4E1_403114C0FB45
    这类
      

  4.   

    类名称在createwindow的时候有一个参数可以指定
      

  5.   

    我的对话框是类似这样创建的
    CDlg * pDlg=new CDlg;
    pdlg->Create(IDD_DLG,父窗口句柄);
    里边没那个类名称参数阿,改成CreateWindow是不是很费事阿,创建的地方比较多...呵呵 楼上的方法感觉不是很好
      

  6.   

    用的CDialog就不能像我说那么弄了,因为类名是不能变的了。给你从网上抄了一段通过exe文件名取程序窗口的代码,参考一下吧。#include <tlhelp32.h>struct ID_HWND
    {
    HWND hWnd;
    DWORD dwID;
    };BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
    {
    DWORD dwID;
    ID_HWND* pih;pih = (ID_HWND*)lParam;
    GetWindowThreadProcessId(hwnd, &dwID);
    if (dwID == pih->dwID) {
    pih->hWnd = hwnd; return FALSE;
    }
    return TRUE;
    }HWND GetProgramWnd(LPCSTR ExeName)
    {
    ID_HWND ih;
    HANDLE hProcessSnap;
    PROCESSENTRY32 pe32;if (ExeName==0 || ExeName[0]=='\0')
    return NULL;
    hProcessSnap = CreateToolhelp32Snapshot(
    TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap==(HANDLE)-1) return NULL;ih.hWnd = NULL;
    memset(&pe32, 0, sizeof(pe32));
    pe32.dwSize = sizeof(PROCESSENTRY32);
    if (Process32First(hProcessSnap, &pe32))
    {
    do {
    if (!strcmpi(pe32.szExeFile,ExeName)) {
    ih.dwID = pe32.th32ProcessID;
    EnumWindows((WNDENUMPROC)EnumProc,
    (long)&ih);
    break; //此时的
    }
    }
    while(Process32Next(hProcessSnap,&pe32));
    }
    CloseHandle(hProcessSnap); return ih.hWnd;
    }