Like this :) BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { char* h = new char[255]; GetWindowText(hwnd,h,255); CString text(h); long wl = GetWindowLong(hwnd,GWL_STYLE); CArray* lb = (CArray*)lParam; if (text.GetLength()>0 && IsWindowVisible(hwnd) && text != "Program Manager" && text != "Window Popper") lb->Add(text); return TRUE; } In my code, lParam is a CArray ( nowadays I would use a vector ), and I check the title of the window to see if it's one I want to ignore and if it's visible ( not doing the visibility check gives you a gazillion hidden windows ) and then pass the title into my list. Then I do this in my main code: CArray list; EnumWindows(EnumWindowsProc, (long)&list); and I can do this: CWnd *pOtherWnd = CWnd::FindWindow(NULL, name); if I find the Window I want ( for example, I might search for the first four letters of the title to be Word, but the next three not to be Pad ), then I get the CWnd by calling FindWindow. If I know for sure something is running and it's full title, then I can just go to this step. Christian I've learned that you cannot make someone love you. All you can do is stalk them and hope they panic and give in. The early bird may get the worm, but it's the second mouse that gets the cheese.