Проблема с рабочими столами в Windows

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by GrenkovV, 2 Jan 2011.

  1. GrenkovV

    GrenkovV New Member

    Joined:
    10 Aug 2010
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    У меня возникла такая проблема - необходимо получить скрин с окна приложения запущенного на другом рабочем столе в винде либо переместить его на основной рабочий стол. В нэте искал, но те примеры, которые были не сработали, в основном они касаются SetProcessWindowStation. Если кто-то знает хороший ресурс, где объясняется что к чему, то скиньте пожалуйста ссылку.

    Код создания рабочего стола и процесса в нём:
    Code:
    PROCESS_INFORMATION pi;
    bool RunProc()
    {
    	bool bResult = false;
    
    	int x = GetSystemMetrics( SM_CXSCREEN );
    	int y = GetSystemMetrics( SM_CYSCREEN );
    
    	STARTUPINFO si;
    	ZeroMemory( &si, sizeof(si) );
    	si.cb = sizeof(si);
    	si.dwFlags = STARTF_USESHOWWINDOW;
    	si.wShowWindow = SW_SHOW;
    	si.lpDesktop = "MYDesktop";
    
    	ZeroMemory( &pi, sizeof(pi) );
    
    	if( CreateProcessA(0, , 0, 0, 0, 0, 0, 0, &si, &pi ) )
    	{
    		bResult = true;
    	}
    
    	return bResult;
    }
    
    void Thread_desktop()
    {
    	hDesktop = CreateDesktop("MyDesktop", NULL, NULL, 0, GENERIC_ALL, NULL);
    	hDesktop_old = GetThreadDesktop(GetCurrentThreadId());
    	SetThreadDesktop(hDesktop);
    	RunProc();
    }
    
    void CControlsDlg::OnBnClickedOk()
    {
    	HANDLE thr = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)Thread_desktop,NULL,0,NULL);
    }
    
    Новый рабочий стол и процесс в нём создаются без проблем. Они возникают при попытке снять скринов с окон на другом рабочем столе и переносе их на текущий.
    BitBlt копирует видимую область которая соответствует расположению нужного окна, но с текущего рабочего стола, а PrintWindow заполняет только хэдер окна, вся клиентская область получается чёрная.

    Подскажите пожалуйста, как взять скрин с такого окна или, как его перенести на текущий рабочий стол.

    PS: Поздравляю всех с наступившим Новым Годом!))) Желаю великих свершений и достижения новых творческих высот!))
     
    #1 GrenkovV, 2 Jan 2011
    Last edited: 2 Jan 2011
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Как вариант выбрать нужный десктоп для нужного потока, затем через GetDesktopWindow получить хендл десктопа, для него получить HDC, с которого потом и скопировать всё
     
  3. GrenkovV

    GrenkovV New Member

    Joined:
    10 Aug 2010
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Спасибо за ответ.
    Так сработало с блокнотом. IE например приходится вытягивать поэлементно. Т.к. если просто найти окно с классом IEFrame и получить с него скрин, то получается хедер окна с рамкой и чёрной клиенткой областью. А вот рекурсивный обход всех видимых контролов дал результат.
    Но это обычное виндовое окно, с ним удалось справится. А вот с java не получается. Само окно нахожу по классу SunAwtFrame, а стандартных дочерних элементов в нём нет и HWND res_hwnd = GetWindow(hwnd, GW_CHILD | GW_HWNDFIRST); возвращает NULL.

    Желательно перенести окно. Это 100% возможно. Есть программа Dexpot, которая спокойно переносит окна с одного десктопа на другой, но как она это делает непонятно... Пробовал SetParent() - окно якобы переносится и числится за текущим десктопом, но не перерисовывается и при попытке перемещения курсором вылетает...

    Может у кого, какие-то идеи будут...
     
    #3 GrenkovV, 2 Jan 2011
    Last edited: 5 Jan 2011