none
FindWindow根据class name无法拿回窗口句柄 RRS feed

  • 问题

  • 谢谢热心人帮我解答了前面的问题,但是现在我的情况可能比较特殊——就是应用的窗口title可能是变动的,因此需要通过class name来找回窗口句柄

    下面大致是我的代码

    <span style="white-space:pre">		</span>ATOM ret;
    		WNDCLASS wc;
    		HANDLE hMutex = ::CreateMutex(NULL, FALSE, _T("XXX"));
    		if(hMutex && (ERROR_ALREADY_EXISTS == GetLastError()))
    		{	
    			HWND hWnd = FindWindow(_T("MY_CLASS_NAME"), NULL);
    			if(hWnd)
    			{
    				if(::IsIconic(hWnd))
    				{
    					::ShowWindow(hWnd, SW_RESTORE);
    				}
    				::BringWindowToTop(hWnd);
    				::SetForegroundWindow(hWnd);
    			}
    			return FALSE;
    		} else {
    			::GetClassInfo(AfxGetInstanceHandle(), _T("#32770"), &wc);
    			wc.lpszClassName = _T("MY_CLASS_NAME");
    			ret = ::RegisterClass(&wc);
    		}
    

    其中GetClassInfo这个函数是抄其他应用中的

    应用启动后能够正常注册,但是再启动应用找不到该class

    请帮我看看代码有什么问题——我是通过启两个vs来进行调试的

    2011年3月8日 8:10

答案

全部回复

  • ::RegisterClass(&wc);
    是否成功?

    另外是否应该使用::RegisterClassW


    麻烦把正确答案设为解答。
    2011年3月8日 8:24
    版主
  • RegisterClass Function

    If the function succeeds, the return value is a class atom that uniquely identifies the class being registered. 

    If the function fails, the return value is zero. 

    RegisterClass 能够返回一个非0值,并且我用RegisterClassW也是同样的问题,找不回window

    2011年3月8日 8:56
  • 你没有创建窗口吧

    FindWindow不是FindWindowClass

    2011年3月9日 5:39
  • 你用Spy++看看,你的程序类名改过来了没有。

    .rc的文件中你修改了没有?类似下面这样?

    IDD_A_DIALOG DIALOGEX 0, 0, 320, 200
    STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
    EXSTYLE WS_EX_APPWINDOW
    CAPTION "A"
    CLASS "MY_CLASS_NAME" // 修改这里
    FONT 8, "MS Shell Dlg", 0, 0, 0x1
    BEGIN
        DEFPUSHBUTTON   "OK",IDOK,209,179,50,14
        PUSHBUTTON      "Cancel",IDCANCEL,263,179,50,14
        CTEXT           "TODO: Place dialog controls here.",IDC_STATIC,10,96,300,8
    END

    然后再App类的InitInstance函数中加入你上面的代码后,用Spy++再看看你的窗口的类名改过来了没有?


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2011年3月10日 1:24
    版主
  • 解决了

    首先要把资源文件中的mfc改成false,然后加入对应class name

    然后再进行注册才能够找到

    2011年3月14日 6:31