@NicholasWilson氏によると、SetThreadDesktop()
は、デフォルトのデスクトップとwinlogonデスクトップの間でプロセスを切り替える正しい方法です。
SetThreadDesktop()
の前にMessageBox()
を呼び出したため、エラー170、「要求されたリソースが使用中です」が発生しました。またCreateWindow()
を呼び出すと、エラーが発生する可能性があります。
SetThreadDesktop()
より前に呼び出されたGUI作成に関連する関数が呼び出された場合、エラーが発生する可能性があると思います。したがって、SetThreadDesktop()
を正常に呼び出す場合は、SetThreadDesktop()
を呼び出す前にGUI作成関数を呼び出さないようにする必要があります。ここ
コード
コードは、指定されたデスクトップにプロセスを切り替える方法です。
用途:SetWinSta0Desktop(TEXT("winlogon"))
、SetWinSta0Desktop(TEXT("default"))
SetWinSta0Desktop()
は機能:
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()
機能:
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);
}
}
あなたは、サンプルコードをしたい場合は、オープンソースのVNCプロジェクトのいずれかを使用します。ここでデモコードを要求することはあまりにも多くのことを求めています。この質問はあまりにも幅広いです。 –
@DavidHeffernanありがとうございました。オープンソースのVNCプロジェクトから私の質問のためのコードを読んで見つけようとします。そして私は自分の質問を編集し、それをはっきりと作った。 – Leon