15,979
社区成员
发帖
与我相关
我的任务
分享
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);
}