高手来帮忙,谢谢,任务栏的问题!!!

xkxnq 2012-09-04 03:05:43
那位大牛 帮我改下:
每次切换到登陆界面后,再切回桌面的时候,文件夹只能显示一次,再切 的话,就出错了,怎么改。

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);
}
...全文
122 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qlizhang 2012-09-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

这个指定了哪个 文件夹,我如果多个文件夹呢, 行不通。
[/Quote]
d:\\vc

可以打开多个文件夹
ShellExecute(NULL, NULL, "c:\\",NULL, NULL, SW_SHOWNORMAL);
ShellExecute(NULL, NULL, "d:\\",NULL, NULL, SW_SHOWNORMAL);
ShellExecute(NULL, NULL, "e:\\",NULL, NULL, SW_SHOWNORMAL);
xkxnq 2012-09-05
  • 打赏
  • 举报
回复
用IShellLink如何 打开文件夹,谁知道,
xkxnq 2012-09-05
  • 打赏
  • 举报
回复
不行,用不了,在
while(!folderPath.empty())
{
//WCHAR runame[MAX_PATH]=L"explorer.exe ";
//lstrcat(runame, folderPath.top().c_str());
//wincxx_RunProcessByName(runame);
//folderPath.pop();
}
这里面用IShellLink如何 打开文件夹,谁知道,查了一天的资料,没找到。
xkxnq 2012-09-04
  • 打赏
  • 举报
回复
这个指定了哪个 文件夹,我如果多个文件夹呢, 行不通。
qlizhang 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

把 文件夹 再 打开,但 打开的时候 要再开 explorer.exe,就相当于 开了 2次,不知道怎么改。
while(!folderPat……
[/Quote]
//再打开用ShellExecute试试
ShellExecute(NULL, NULL, "d:\\vc\\",
NULL, NULL, SW_SHOWNORMAL);
xkxnq 2012-09-04
  • 打赏
  • 举报
回复
现在 有文件夹路径 和句柄,用 IShellLink 怎么样打开获取到的 文件夹,不用上面的。大虾们,给个
参考代码,搞了好几天了。
xkxnq 2012-09-04
  • 打赏
  • 举报
回复
这个 我实现了,现在有bug,因为是要切到 登陆界面 ,所以会 关闭 进程 explorer.exe,再回来的时候,打开explorer.exe, 现在的问题 是 任务栏中文件夹 没了,所以我才把 任务栏文件夹的 路径 保存下来,
等 切 回来的时候,把 文件夹 再 打开,但 打开的时候 要再开 explorer.exe,就相当于 开了 2次,不知道怎么改。
while(!folderPath.empty())
{
WCHAR runame[MAX_PATH]=L"explorer.exe ";
lstrcat(runame, folderPath.top().c_str());
wincxx_RunProcessByName(runame);
folderPath.pop();
}
qlizhang 2012-09-04
  • 打赏
  • 举报
回复
参考
http://download.csdn.net/detail/jk863571/2248933
VisualC.编程技巧精选500例]源代码《三》\第14章 系统控制操作\1.系统任务栏设置演示
void CTestDlg::OnBnClickedBtnhidetaskbar()
{
if(::ShowWindow(::FindWindow("Shell_TrayWnd",NULL),SW_HIDE))
MessageBox("隐藏操作系统任务栏操作成功","信息提示",MB_OK);
else
MessageBox("隐藏操作系统任务栏操作失败","信息提示",MB_OK);
}

void CTestDlg::OnBnClickedBtnshowtaskbar()
{
if(!::ShowWindow(::FindWindow("Shell_TrayWnd",NULL),SW_SHOW))
MessageBox("取消隐藏操作系统任务栏操作成功","信息提示",MB_OK);
else
MessageBox("取消隐藏操作系统任务栏操作失败","信息提示",MB_OK);
}

void CTestDlg::OnBnClickedBtncaptiontaskbar()
{
CString StrInfo="已经启动的窗口包括:\n";
CString StrCaption;
CWnd* pWnd=AfxGetMainWnd()->GetWindow(GW_HWNDFIRST);
while (pWnd)
{
if (pWnd ->IsWindowVisible () &&
pWnd ->GetWindowTextLength () &&! pWnd ->GetOwner ())
{
pWnd ->GetWindowText (StrCaption);
StrInfo+=StrCaption+"\n";
}
pWnd=pWnd->GetWindow (GW_HWNDNEXT);
}
MessageBox(StrInfo,"信息提示",MB_OK);
}
xkxnq 2012-09-04
  • 打赏
  • 举报
回复
当有文件夹的 时候 ,任务管理器中显示的 是2个explorer.exe ,所以会这样,但不知道怎么改啊,
while(!folderPath.empty())
{
WCHAR runame[MAX_PATH]=L"explorer.exe ";
lstrcat(runame, folderPath.top().c_str());
wincxx_RunProcessByName(runame);
folderPath.pop();
}
这是 有文件夹的 时候才开的 一个进程,但 不开 又不显示,怎么改。
CrazyAsk 2012-09-04
  • 打赏
  • 举报
回复
写这么多看的头晕
Eleven 2012-09-04
  • 打赏
  • 举报
回复
先Debug调试,打开call stack,找到出错的地方~

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧