首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在默认桌面和Winlogon桌面之间切换进程?

如何在默认桌面和Winlogon桌面之间切换进程?
EN

Stack Overflow用户
提问于 2013-04-15 08:22:52
回答 2查看 10.2K关注 0票数 10

我正在编写一个远程桌面应用程序,如TeamViewer in C++ on Windows 7 (x64)和Windows 8 (x64)。

1.是什么让我卡住了

我使用SendInput()实现了鼠标输入和键盘输入。当进程在winsta0\desktop下运行时,我发现winsta0\desktop()运行得很好。但是,在用户锁定计算机或启动屏幕保护程序后,它没有工作。

如果我在winsta0\winlogon下运行进程,SendInput()winsta0\default下就不能工作。

2.我尝试过的

我尝试使用SetThreadDesktop()将进程从winsta0\desktop切换到winsta0\winlogon,但是我得到了错误170:“请求的资源正在使用”,于是我塞了进去。

3.我想知道的

我注意到TeamViewer有一个名为TeamViewer_Desktop.exe的进程,它可以在Winlogon、缺省和屏幕保护程序下控制鼠标和键盘。它是怎么做到的?

你能提供代码来帮助我理解如何解决我的问题吗?

我想知道**如何使我的应用程序在默认桌面和Winlogon桌面之间切换。因此,我可以在安全的桌面上控制鼠标和键盘,而无需创建在winlogon.exe下运行的另一个进程。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-15 09:19:52

你做了正确的事情:SetThreadDesktop是正确的。错误告诉您,您在当前桌面上打开了一些资源,例如窗口,这会阻止您切换。如果你试图产生一个最小的测试用例(就像你在这里问问题时所做的那样!)你会发现的。

在找到阻止您切换桌面的块之前,请删除部分程序。有些Windows是讨厌的,阻止您切换桌面,因此需要在一个专用线程中调用。

票数 8
EN

Stack Overflow用户

发布于 2013-04-17 01:35:31

正如@NicholasWilson所说,SetThreadDesktop()是在默认桌面和winlogon桌面之间切换进程的正确方法。

错误170“请求的资源正在使用”发生,是因为我在调用MessageBox()之前调用了SetThreadDesktop()。同时,调用CreateWindow()也可能导致错误。

我认为在SetThreadDesktop()调用之前调用的任何与GUI创建相关的函数都会导致错误。因此,如果要成功调用SetThreadDesktop(),则必须确保在调用SetThreadDesktop()之前不要调用任何GUI创建函数。

这里的代码是如何将进程切换到指定的桌面。

用途:SetWinSta0Desktop(TEXT("winlogon"))SetWinSta0Desktop(TEXT("default"))

SetWinSta0Desktop()函数:

代码语言:javascript
复制
BOOL SetWinSta0Desktop(TCHAR *szDesktopName)
{
    BOOL bSuccess = FALSE;

    HWINSTA hWinSta0 = OpenWindowStation(TEXT("WinSta0"), FALSE, MAXIMUM_ALLOWED);
    if (NULL == hWinSta0) { ShowLastErrorMessage(GetLastError(), TEXT("OpenWindowStation")); }

    bSuccess = SetProcessWindowStation(hWinSta0);
    if (!bSuccess) { ShowLastErrorMessage(GetLastError(), TEXT("SetProcessWindowStation")); }

    HDESK hDesk = OpenDesktop(szDesktopName, 0, FALSE, MAXIMUM_ALLOWED);
    if (NULL == hDesk) { ShowLastErrorMessage(GetLastError(), TEXT("OpenDesktop")); }

    bSuccess = SetThreadDesktop(hDesk);
    if (!bSuccess) { ShowLastErrorMessage(GetLastError(), TEXT("SetThreadDesktop")); }

    if (hDesk != NULL) { CloseDesktop(hDesk); }
    if (hWinSta0 != NULL) { CloseWindowStation(hWinSta0); }

    return bSuccess;
}

ShowLastErrorMessage()函数:

代码语言:javascript
复制
void ShowLastErrorMessage(DWORD errCode, LPTSTR errTitle)
{
    LPTSTR errorText = NULL;

    FormatMessage(
       FORMAT_MESSAGE_FROM_SYSTEM |
       FORMAT_MESSAGE_ALLOCATE_BUFFER |
       FORMAT_MESSAGE_IGNORE_INSERTS,  
       NULL,
       errCode,
       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
       (LPTSTR)&errorText,
       0,
       NULL);

    if ( NULL != errorText )
    {
        WCHAR msg[512] = {0};
        wsprintf(msg, TEXT("%s:\nError Code: %u\n%s\n"), errTitle, errCode, errorText);

        LocalFree(errorText);
        errorText = NULL;

        OutputDebugString(msg);
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16010659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档