CreateDesktop() Windows 関数を使用して新しいデスクトップで Firefox を起動しようとしていますが、Flash の保護モードが有効になっていると Flash で問題が発生します。
デフォルトのデスクトップで Firefox を起動すると、Flash は問題なく動作しますが、Flash が起動しないため、新しいデスクトップでは Firefox がハングします。
Flash の保護モードを無効にするとこの問題は解決しますが、Flash の保護モードを無効にせずにこれを実行できるようにしたいと考えています。
この問題に似ている可能性があります: CreateDesktop() with vista and UAC on (C, windows)
デフォルトのデスクトップからセキュリティ情報を読み取って新しいデスクトップに設定しようとすると、「許可が拒否されました」というメッセージが表示されます。ただし、これが正しいアプローチであるかどうかはまだわかりません。
CreateDesktop() Windows関数で作成されたデスクトップでプロセスを開始して、保護モードを有効にしてFlashを実行できるようにする方法を知っている人はいますか?
古いデスクトップから情報を取得せずに、新しいデスクトップのセキュリティ情報を設定する方法はありますか?
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682124%28v=vs.85%29.aspx
これは、新しいデスクトップで Firefox を起動するために使用するコードです。
// createDesktopTESTWin32Project.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "createDesktopTESTWin32Project.h"
#define MAX_LOADSTRING 100
// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
HDESK hDesktopThreadOld;
HDESK hDesktopInputOld;
HDESK hNewDesktop;
void ClearUp()
{
// Make sure to get back to the original desktop
if(hDesktopInputOld != 0)
{
SwitchDesktop(hDesktopInputOld);
hDesktopInputOld = 0;
}
if(hDesktopThreadOld != 0)
{
SetThreadDesktop(hDesktopThreadOld);
hDesktopThreadOld = 0;
}
if(hNewDesktop != 0)
{
CloseDesktop(hNewDesktop);
hNewDesktop = 0;
}
}
void StartProcess()
{
STARTUPINFO si = {0};
PROCESS_INFORMATION pi;
// Set the desktop to run on in the STARTUPINFO structure
si.cb = sizeof(si);
si.lpDesktop = _T("MYNEWDESKTOP");
TCHAR ourPath[MAX_PATH] = _T("C:\\Program Files (x86)\\Mozilla firefox\\firefox.exe http://www.adobe.com/products/flashplayer.html");
//BOOL retVal = CreateProcess(NULL, ourPath, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
BOOL retVal = CreateProcess(NULL, ourPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
if(!retVal)
{
_tprintf(_T("Failed to create new process !!\n\n"));
ClearUp();
} else {
// Wait until the process has finished
//WaitForSingleObject(pi.hProcess, INFINITE);
// Kill after 2 minutes for now as a test since it hangs
WaitForSingleObject(pi.hProcess, 120000);
// Terminate program
TerminateThread(pi.hThread, 0);
TerminateProcess(pi.hProcess, 0);
// Clean
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
}
void CreateNewDesktop()
{
hDesktopThreadOld = GetThreadDesktop(GetCurrentThreadId());
hDesktopInputOld = OpenInputDesktop(0, false, DESKTOP_SWITCHDESKTOP);
hNewDesktop = CreateDesktop(_T("MYNEWDESKTOP"), 0, 0, 0, GENERIC_ALL, NULL);
if(!hNewDesktop)
{
_tprintf(_T("Failed to create new desktop !!\n\n"));
} else {
SetThreadDesktop(hNewDesktop);
SwitchDesktop(hNewDesktop);
}
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
CreateNewDesktop();
StartProcess();
ClearUp();
return 0;
}