如何才能知道用户桌面已经启动? - C++ Builder / Windows SDK/API
GetShellWindow()吗? 好像不行?是未公开的api需要动态加载user32吗?
如果能知道explorer已经启动也行,但是不想枚举进程。
尽量是要能快速得知桌面已经启动的。
[解决办法]
这个比较高深,要赶在用户桌面启动之前,做点什么吗?
[解决办法]
你可以监控一个进程是桌面进程“explorer”.
一般不用枚举所有进程。记得有这样的WIN32 API的。
[解决办法]
你的程序直接开机启动
[解决办法]
目前,俺的程序。
就是循环查看“explorer”.
[解决办法]
sf
[解决办法]
用FindWindow函数 查找 Explorer.exe
[解决办法]
先通过FindWindow查找类名为Progman的窗口是否存在,如果存在,再通过GetWindowThreadProcessId得到该窗口所属进程的PID,然后获取进程名,判断是否为Explorer.exe
示例代码如下:
#include <psapi.h>#include <tchar.h>// 注意psapi.lib文件的路径要添加到Project-->Options-->Direcotries-->Library path中// 默认目录为$(BCB)\lib\psdk#pragma link "psapi.lib"void __fastcall TForm1::Button1Click(TObject *Sender){ HWND hWnd = ::FindWindow(TEXT("Progman"), NULL); if (NULL != hWnd) { DWORD dwPID(0); ::GetWindowThreadProcessId(hWnd, &dwPID); if (dwPID) { HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwPID); if (NULL != hProcess) { HMODULE hModule; DWORD dwRet; BOOL b = ::EnumProcessModules(hProcess, &hModule, sizeof(hModule), &dwRet); if (b) { TCHAR sz[MAX_PATH]; ::GetModuleBaseName(hProcess, hModule, sz, MAX_PATH); if (_tcscmp(_tcsupr(sz), TEXT("EXPLORER.EXE")) == 0) ::MessageBox(0, TEXT("貌似资源管理器已启动."), __FUNC__, 0); else ::MessageBox(0, sz, __FUNC__, 0); } else ShowMessage(::SysErrorMessage(::GetLastError())); ::CloseHandle(hProcess); } else ShowMessage(::SysErrorMessage(::GetLastError())); } else ShowMessage(::SysErrorMessage(::GetLastError())); } else ::MessageBox(0, TEXT("未找到Progman窗口!"), __FUNC__, 0);}
[解决办法]