首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

怎么才能知道用户桌面已经启动

2012-02-05 
如何才能知道用户桌面已经启动? - C++ Builder / Windows SDK/APIGetShellWindow()吗? 好像不行?是未公开

如何才能知道用户桌面已经启动? - C++ Builder / Windows SDK/API
GetShellWindow()吗? 好像不行?是未公开的api需要动态加载user32吗?
如果能知道explorer已经启动也行,但是不想枚举进程。
尽量是要能快速得知桌面已经启动的。

[解决办法]
这个比较高深,要赶在用户桌面启动之前,做点什么吗?
[解决办法]
你可以监控一个进程是桌面进程“explorer”.

一般不用枚举所有进程。记得有这样的WIN32 API的。
[解决办法]
你的程序直接开机启动
[解决办法]
目前,俺的程序。
就是循环查看“explorer”.
[解决办法]
sf
[解决办法]
用FindWindow函数 查找 Explorer.exe
[解决办法]
先通过FindWindow查找类名为Progman的窗口是否存在,如果存在,再通过GetWindowThreadProcessId得到该窗口所属进程的PID,然后获取进程名,判断是否为Explorer.exe

示例代码如下:

C/C++ code
#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);}
[解决办法]
探讨
先通过FindWindow查找类名为Progman的窗口是否存在,如果存在,再通过GetWindowThreadProcessId得到该窗口所属进程的PID,然后获取进程名,判断是否为Explorer.exe

示例代码如下:
C/C++ code#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);
}


[解决办法]
探讨
问题啊:我是让winlogon执行(会话id不为0的winlogon)
FindWindowEx(GetDesktopWindow(),NULL,"Progman",NULL))
FindWindow("Progman",NULL))
从头到尾都返回NULL啊.
但是用另外的exe正常情况下是可以的啊,有explorer则返回>0,没有则=0
winlogon的执行用户始终是system
普通exe的执行用户是对应的user

热点排行