高手来帮忙,谢谢,任务栏的问题!!!
那位大牛 帮我改下:
每次切换到登陆界面后,再切回桌面的时候,文件夹只能显示一次,再切 的话,就出错了,怎么改。
- C/C++ code
stack<HWND> taskhwnd;//存任务栏上的窗口句柄stack<wstring> folderPath;BOOL CALLBACK EnumTaskbarWnds( HWND hwnd, LPARAM lParam ){ WCHAR szClass[256]; if( !GetWindow( hwnd, GW_OWNER ) && IsWindowVisible( hwnd ) )// 滤掉不在任务栏显示的窗口 { GetClassName( hwnd, szClass, sizeof(szClass) ); if( lstrcmpW( szClass, L"Shell_TrayWnd" ) != 0 // 过滤掉任务栏本身 && lstrcmpW( szClass, L"Progman" ) != 0 )// 过滤掉桌面 { if( lstrcmpW(szClass,L"CabinetWClass") == 0)//是否是文件夹 { taskhwnd.push(hwnd); } } } return TRUE;}void CALLBACK loginXPViewCallBack(UINT /*uTimerID*/, UINT /*uMsg*/, DWORD dwUser, DWORD /*dw1*/, DWORD /*dw2*/){ timeKillEvent(g_msstyle_par.tidwork); switch(dwUser) { case 0: { ShowWindow(g_loginxp_par.hMain, SW_HIDE); BlockInput(TRUE); CoInitialize (0); IShellDispatch4 *pdisp = NULL; CoCreateInstance (CLSID_Shell, NULL, CLSCTX_ALL, __uuidof (IShellDispatch4), (void **)&pdisp); pdisp->ToggleDesktop (); // 切换桌面 pdisp->Release (); CoUninitialize (); } break; case 1: { WCHAR windows[MAX_PATH]={0}; WCHAR buf[MAX_PATH]; wstring bufpath; DWORD dwType = 0; DWORD dwSize = sizeof(g_loginxp_par.logonui); SHGetValue(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\", L"UIHost", &dwType, g_loginxp_par.logonui, &dwSize); LPITEMIDLIST lpIdl = NULL; ::SHGetSpecialFolderLocation(NULL, CSIDL_WINDOWS, &lpIdl); ::SHGetPathFromIDListW(lpIdl, windows); ::CoTaskMemFree(static_cast<void*>(lpIdl)); lstrcpy(g_loginxp_par.explorer, windows); PathAppendW(g_loginxp_par.explorer, L"explorer.exe"); if(wstring(g_loginxp_par.logonui)== wstring(L"logonui.exe")) { lstrcpy(g_loginxp_par.logonui, windows); PathAppendW(g_loginxp_par.logonui, L"system32\\logonui.exe"); } EnumWindows(EnumTaskbarWnds,NULL); while(!taskhwnd.empty()) { HWND WorkerAWnd; WorkerAWnd=FindWindowExW(taskhwnd.top(),0,L"WorkerW",NULL); if(!WorkerAWnd) return ; HWND ReBarWindow32Wnd; ReBarWindow32Wnd=FindWindowExW(WorkerAWnd,0,L"ReBarWindow32",NULL); if(!ReBarWindow32Wnd) return ; HWND ComboBoxEx32Wnd; ComboBoxEx32Wnd=FindWindowExW(ReBarWindow32Wnd,0,L"ComboBoxEx32",NULL); if(!ComboBoxEx32Wnd) return ; HWND ComboBoxWnd; ComboBoxWnd=FindWindowExW(ComboBoxEx32Wnd,0,L"ComboBox",NULL); if(!ComboBoxWnd) return ; HWND EditWnd; EditWnd=FindWindowExW(ComboBoxWnd,0,L"Edit",NULL); if(!EditWnd) return ; SendMessageW(EditWnd,WM_GETTEXT,sizeof(buf)/sizeof(WCHAR),(LPARAM)(void *)buf); bufpath = buf; folderPath.push(bufpath); taskhwnd.pop(); } wincxx_TerminateProcessByName(L"explorer.exe"); } break; case 2: { wincxx_RunProcessByName(g_loginxp_par.logonui); } break; case 3: case 4: break; case 5: { HWND hLogon = FindWindowW(L"NativeHWNDHost", NULL); hLogon = FindWindowExW(hLogon, NULL, L"DirectUIHWND", NULL); HDC hdcLogon= GetDC(hLogon); int iBmpWidth = GetDeviceCaps( hdcLogon, HORZRES ); int iBmpHeight = GetDeviceCaps( hdcLogon, VERTRES ); int iDstBmpWidth, iDstBmpHeight; iDstBmpWidth= _width; iDstBmpHeight= _height; iDstBmpWidth = iBmpWidth; iDstBmpHeight = iBmpHeight; HDC hdcCompatible = CreateCompatibleDC( hdcLogon ); HBITMAP hbmpTmp = ::CreateCompatibleBitmap32B(hdcCompatible, iBmpWidth, iBmpHeight); if ( !SelectObject( hdcCompatible, hbmpTmp )) { } ::BitBlt(hdcCompatible, 0, 0, iBmpWidth, iBmpHeight,hdcLogon, 0, 0, SRCCOPY | CAPTUREBLT); Bitmap bmp(hbmpTmp, NULL); Bitmap bmp_file(iDstBmpWidth, iDstBmpHeight, PixelFormat32bppARGB); Graphics gp(&bmp_file); gp.SetTextRenderingHint(TextRenderingHintAntiAlias);//消除锯齿 gp.SetInterpolationMode(InterpolationModeHighQualityBicubic);//使用高质量的插补算法 gp.DrawImage(&bmp, Rect(0, 0, iDstBmpWidth, iDstBmpHeight), 0,0,iBmpWidth, iBmpHeight, UnitPixel); CLSID clsid; GetEncoderClsid(L"image/jpeg", &clsid); bmp_file.Save(g_loginxp_par.wstrSaveFname.c_str(), &clsid); } break; case 6: case 7: break; case 8: { wincxx_TerminateProcessByName(g_loginxp_par.logonui); } break; case 9: { wincxx_RunProcessByName(g_loginxp_par.explorer); if(::IsIconic(g_loginxp_par.hMain)){ ShowWindowAsync(g_loginxp_par.hMain, SW_RESTORE); } ShowWindowAsync(g_loginxp_par.hMain, SW_SHOW); while(!folderPath.empty()) { WCHAR runame[MAX_PATH]=L"explorer.exe "; lstrcat(runame, folderPath.top().c_str()); wincxx_RunProcessByName(runame); folderPath.pop(); } ::SetWindowPos(g_loginxp_par.hMain, 0,0,0,0,0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW); BlockInput(FALSE); } break; default: { SetEvent(g_loginxp_par.hEvent); } return ; } g_loginxp_par.tidwork= timeSetEvent(500,0,&loginXPViewCallBack,(DWORD_PTR)dwUser+1,TIME_ONESHOT);}
[解决办法]
写这么多看的头晕