切换桌面时访问冲突

access violation when switching desktops

本文关键字:访问冲突 桌面      更新时间:2023-10-16

我是一个c++新手,正在尝试创建一个可以切换桌面的应用程序。到目前为止,我已经能够成功地切换桌面,并尝试在该桌面上启动应用程序。不幸的是,当应用程序在我新创建的桌面上启动时,我一直遇到访问冲突。我的问题是:是什么导致了访问违规?从我所读到的,这是一个问题,其中程序试图访问内存,它不应该。错误是:

"应用程序无法正确启动(0xC0000005)。点击OK关闭应用程序

还有,谁能给我一个建议,我怎么可能改进这个代码?这将帮助我从有经验的程序员那里学到一些东西。提前感谢!

编辑:我正在运行Windows 7 x64使用Visual Studio Express 2010

代码如下:

#include <Windows.h>
//Globals
HDESK hLastDesktop;
struct tDesktop {
    HDESK Desktop1;
    HDESK Desktop2;
    HDESK Desktop3;
    HDESK Desktop4;
};
HDESK FindCurrentDesktop()
{
    return GetThreadDesktop(GetCurrentThreadId());
}
int ChangeDesktop(HDESK hDesktopName)
{
    //Save the handle to this desktop
    hLastDesktop = FindCurrentDesktop();
    //Set the main thread to this desktop
    SetThreadDesktop(hDesktopName);
    //Switch
    SwitchDesktop(hDesktopName);
    return 0;
}
PROCESS_INFORMATION CreateProcessDesktop(LPWSTR lpProcessPath, LPWSTR lpDesktop)
{
    PROCESS_INFORMATION processInfo;
    STARTUPINFO startupInfo;
    startupInfo.cb = sizeof(startupInfo);
    startupInfo.lpDesktop = lpDesktop;
    CreateProcess(lpProcessPath,
                0, 
                0, 
                0,
                FALSE,
                0, 
                0,
                0,
                &startupInfo,
                &processInfo
            );
    return processInfo;
}
int _tmain(int argc, _TCHAR* argv[])
{
    //Create an instance to use the struct
    tDesktop myDesktop;
    //Assign data for home desktop
    myDesktop.Desktop1 = FindCurrentDesktop();
    printf("Home desktop: %dn", myDesktop.Desktop1);
    myDesktop.Desktop2 = CreateDesktop(L"Desktop2", NULL, NULL, 0, GENERIC_ALL, NULL);
    printf("Desktop 2 opened: %dn", myDesktop.Desktop2);
    printf("Changing to desktop 2: %dn", myDesktop.Desktop2);
    ChangeDesktop(myDesktop.Desktop2);
    //Set up process to start in Desktop2 (for PID, etc later)
    PROCESS_INFORMATION pi;
    pi = CreateProcessDesktop(L"C:\Windows\explorer.exe", L"Desktop2");
    Sleep(5000);
    TerminateProcess(pi.hProcess, 0);
    ChangeDesktop(hLastDesktop);
    return 0;
}

答案是:

我在评论中提到,我调用CreateProcess与bInheritHandles为FALSE,这是问题,这是不正确的。它与SetThreadDesktop有关。CreateProcess是成功的,它只是没有在正确的桌面上填充。

我不得不看一下SetThreadDesktop函数好一点。不是失败,而是我称呼它的方式不对。您应该始终在切换桌面后调用它,然后获取当前桌面句柄作为参数传递。下面是修改后的代码:

int ChangeDesktop(HDESK hDesktopName)
{
    hLastDesktop = FindCurrentDesktop();  
    SwitchDesktop(hDesktopName);
    SetThreadDesktop(FindCurrentDesktop());
    return 0;
}