Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #60 : 07-03-2011 04:59 » |
|
zubr, да, есть ещё простор для оптимимзации )) Дело в том, что я не проверял на верхний левый и нижний правый углы - вся маска изменившихся битов шлётся. Но уже понятно, куда идти
Ром, делаю простенький аналог для удалённого администрирования - управление мышью, клавой и передача изображения Шлётся разница, ага. Вернее - маска размером с экран, где изменённые биты установлены, сжимается хорошо
Добавлено через 4 часа, 23 минуты и 42 секунды: вот ещё вопросы: 1) (необязательный) как в радмине реализуется опция "не показывать обои рабстола" - как он распознаёт, что это им енно пикселы обоев видны? 2) как шифровать трафик - направьте в нужную сторону 3) как решить, что кнопконажатия клавы должны быть направлены к слейву, а не были нажаты для интерфейса программы на мастере ? Я пока сделал галочку, если её поставить - все кнопки летят к слейву, если снять - не летят
|
|
« Последнее редактирование: 07-03-2011 09:23 от Алексей1153 »
|
Записан
|
|
|
|
Dale
|
|
« Ответ #61 : 07-03-2011 09:32 » |
|
1) (необязательный) как в радмине реализуется опция "не показывать обои рабстола" - как он распознаёт, что это им енно пикселы обоев видны? Для этого рендеринг делается не на уровне битовой карты дисплея, а на более высоком. Правда, при этом теряется тема экранного оформления. Впрочем, вряд ли она кому-то интересна.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
RXL
|
|
« Ответ #62 : 07-03-2011 10:18 » |
|
Потому, что RDP-сервер встроен в винду и, по сути, является новым десктопом - DC, и имеет доступ ко всем оконным данным, может игнорировать стили, обои и многое другое.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Dale
|
|
« Ответ #63 : 07-03-2011 10:51 » |
|
На самом деле для этого не обязательно влезать в систему очень глубоко. Много лет назад я участвовал в одном проекте, который жив до сих пор: http://rinel.ru/ . Тогда только что вышла Windows 95, и первая версия класа вышла на ее основе. Учитель мог подключиться к любому ученическому компьютеру, проконтролировать действия ученика и оказать ему помощь, то есть те самые действия, которые умеют делать современные удаленные консоли. В то время в ходу были 10-мегабитные сети на коаксиальном кабеле, а сетевые карты NE2000 пропускали до 300Кбайт/с, что при наличии 16 рабочих мест в сегменте весьма немного с учетом мультимедийного трафика реального времени. Поэтому сжимали данные, как только могли. Я занимался аппаратной частью и общей архитектурой комплекса, поэтому не в курсе деталей софта. Но точно помню, что все было написано на Delphi. Никаких специальных драйверов и прочих штучек режима ядра заведомо не было, все делалось на пользовательском уровне. Передавалась не битовая карта, а информация об иконках, окошках, меню и т.д. Трафик получался минимальный даже с учетом убогих характеристик сети.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #64 : 07-03-2011 11:29 » |
|
у меня всё сделано предельно просто, без драйверов и встраиваний - одно приложение без дополнительных модулей. Использую только функции WinAPI. Рендеринг не делаю - я просто забираю битмап с контекста устройства десктопа (HDC==0) в принципе, при разностной передаче на обои плевать - только первый кадр будет большой >>Передавалась не битовая карта, а информация об иконках, окошках, меню и т.д. сейчас объектов и их внешнего вида развелось столько, что дешевле битмап передать ИМХО ) Добавлено через 8 минут и 35 секунд:кстати, если переключалка языков с панели задач отправлена в свободное плавание, то она тоже почему-то не берётся с контекста Добавлено через 59 секунд:Потому, что RDP-сервер встроен в винду и, по сути, является новым десктопом - DC, и имеет доступ ко всем оконным данным, может игнорировать стили, обои и многое другое.
нет, это в Радмине такая опция. Я не про встроенный в винду говорю
|
|
« Последнее редактирование: 07-03-2011 11:38 от Алексей1153 »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #65 : 07-03-2011 12:36 » |
|
В виндовом RDP тоже можно отключать излишества:
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
zubr
Гость
|
|
« Ответ #66 : 07-03-2011 12:58 » |
|
RDP конечно хорошо, но если этот сервис не включен в системе и система не под админом, а ко всему юзер не должен знать, что его мониторят? 1. Как вариант, можно использовать EnumWindows 2. Криптоапи: CryptCreateHash, CryptHashData, CryptDeriveKey, CryptEncrypt, CryptDecrypt
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #67 : 07-03-2011 14:01 » |
|
2. Криптоапи: CryptCreateHash, CryptHashData, CryptDeriveKey, CryptEncrypt, CryptDecrypt
хорошо, посмотрю
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #68 : 09-03-2011 10:19 » |
|
а где в радмине такая опция?
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #69 : 09-03-2011 11:48 » |
|
PooH, да, точно, не в радмине, а в TeamViewer Добавлено через 2 минуты и 35 секунд:кстати, уже работает передача сообщений мыши и клавы, а также разностная передача изображения ) . Довёл до 1кБ/с сти статическом экране, пока оставил дальнейшую оптимизацию, надо над другими частями программы поработать пока Добавлено через 5 часов, 58 минут и 3 секунды:есть смельчаки, что бы сейчас вышел в чат и потестировал мою программку ? ) Добавлено через 2 часа, 7 минут и 23 секунды:тестировали с Димкой. Всплыли определённые проблемы 1) тормоза при сдирании кадра с контекста (это фигня, оптимизация) 2) от хрюнделя к семёрке не передаются клавонажатия (тут мысли есть, проверю) 3) когда на семёрке Аэро, то с контекста сдирается лишь чёрный экран. С обычной темой - нормально изображение берётся. Это как победить ?
|
tv3.PNG (6.35 Кб - загружено 1731 раз.)
|
« Последнее редактирование: 09-03-2011 19:56 от Алексей1153 »
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #70 : 10-03-2011 06:29 » |
|
Я бы наоборот сказал: с обычной темой картинки нет, картинка передаётся только для старых упрощённых тем
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #71 : 10-03-2011 06:42 » |
|
Dimka, кстати, а локально то не пробовал два клиента через сервер соединить ? )
А насчёт DirectX - я нашёл кое-что уже, вечером буду ковыряться
|
|
« Последнее редактирование: 10-03-2011 09:51 от Алексей1153++ »
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #72 : 10-03-2011 09:49 » |
|
Алексей1153++, нет, локально не пробовал. И вообще тебе стоит поработать над usability
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #73 : 10-03-2011 09:50 » |
|
а интерфейса ещё нет, пока только функциональность делается
|
|
|
Записан
|
|
|
|
v2
Помогающий
Offline
|
|
« Ответ #74 : 10-03-2011 11:23 » |
|
3) когда на семёрке Аэро, то с контекста сдирается лишь чёрный экран. С обычной темой - нормально изображение берётся. Это как победить ?
А если "Print Screen" а потом изображение с буфера, или накладно будет.?
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #75 : 10-03-2011 12:15 » |
|
v2, а буфер-то как портить будет...
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
zubr
Гость
|
|
« Ответ #76 : 10-03-2011 12:30 » |
|
v2, если там DirectX, то PrintScreen не поможет. Попробуй открыть видеоплеер и сделать с него PrintScreen.
|
|
|
Записан
|
|
|
|
v2
Помогающий
Offline
|
|
« Ответ #77 : 10-03-2011 13:53 » |
|
2) само задание "сделать <...> наподобие TeamView, только упрощённо"
Zubr, вот и будет упрощенно Dimka, да буферу не повезло, но это для того, чтобы пока сделать хоть так и решать другие вопросы, а потом ... Кроме того, в похожем коде (поиск по картинке места на экране, куда нужно кликнуть) , который я когда-то писал, проблем с Аэро нет, хотя ничего хитрого не использовал. ToDc:=Im.Canvas.Handle; //Im:TImage (стандартный Borland'овский :) ) Dc:=GetWindowDC(GetDesktopWindow); BitBlt(ToDc,0,0,c,d,Dc,a,b,SRCCOPY);
Возможно проблемы с 32bit - 24bit - 16bit Протестировал - всплывающие окна тоже захватывает. Добавлено через 17 минут и 51 секунду:Ух! и видео тож
|
|
« Последнее редактирование: 10-03-2011 15:31 от v2 »
|
Записан
|
|
|
|
Санычъ
|
|
« Ответ #78 : 11-03-2011 09:25 » |
|
Господа магистры, Саныч вроде нашел решение проблемы просмотра (хотя бы) рабочего стола на удаленном пк. В скайпе есть функция в видеозвонке "Демонстрация экрана", которую "должен" включать визави. ... Правда, еще не опробовал, но , думаю, качество д.б. лучше, чем в TV. ... Спасибо. Буду навещать )))
|
|
|
Записан
|
Благодарю за внимание...
|
|
|
zubr
Гость
|
|
« Ответ #79 : 11-03-2011 10:01 » |
|
v2, этот код с DirectX не прокатит, будет черный экран на месте окна видеоплеера. Санычъ, качество в скайпе не лучше чем чем в TV и как мне показалось тормознутее.
|
|
|
Записан
|
|
|
|
v2
Помогающий
Offline
|
|
« Ответ #80 : 11-03-2011 10:29 » |
|
zubr, не знаю, но 3D шахматы в W7 и "гаджеты" и видеоплееры с видео - все съедает и не давится. Если интересно, сделаю тестовое приложение или проект - посмотришь.
|
|
|
Записан
|
|
|
|
Санычъ
|
|
« Ответ #81 : 11-03-2011 14:51 » |
|
Санычъ, качество в скайпе не лучше чем чем в TV и как мне показалось тормознутее.
zubr, качество видео в скайпе значительно лучше, чем в TV. Но тормоз жуткий. С чем это может быть связано? Плачу за 5мбит...
|
|
|
Записан
|
Благодарю за внимание...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #82 : 11-03-2011 16:33 » |
|
Ещё с директом не разбирался (вчера валялся с температуркой чойта), а сейчас провёл пару экспериментов. 1) винамповское окно с видео ожидаемо чёрное. Однако окно со "светомузыкой" передаётся 2) запустил контру в полноэкранном режиме - прекрасно передаётся. Как так 3) клавиши не передавались - разобрался вроде, теперь передаются. Кстати, корректно ли я это делаю: LRESULT CALLBACK HOOKfunc(int code, WPARAM wParam, LPARAM lParam) { if(code>=0) {
::CallNextHookEx(m_keyHOOK,0,0,0);
//передаю по сети //...
return 1; }
return ::CallNextHookEx(m_keyHOOK,code,wParam,lParam); }
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #83 : 11-03-2011 17:14 » |
|
LRESULT CALLBACK HOOKfunc(int code, WPARAM wParam, LPARAM lParam) { if(code < 0) return ::CallNextHookEx(NULL,code,wParam,lParam);
//передаю по сети //...
return ::CallNextHookEx(NULL,code,wParam,lParam); }
Так корректнее будет. m_keyHOOK нет смысла передавать, в NT системах он игнорируется.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #84 : 11-03-2011 17:33 » |
|
игнорируется - это пусть, но мне не нужно, чтобы отправленные нажатия исполнялись на мастере. Поэтому я делаю ::CallNextHookEx(m_keyHOOK,0,0,0); на первый взгляд всё работает Добавлено через 13 дней, 2 часа, 23 минуты и 6 секунд:возникла ещё одна проблема с клавой: поставил с великим скрипом и с использованием виртуалки эксперимент с семёркой: в итоге выяснилось, что клава успешно передаётся в направлениях: XP -> XP XP -> 7 но не передаётся в направлении 7 -> XP (попробовал с виртуалки управлять хостом-хрюшкой) и 7 -> 7 (это попробовать не имею возможности, но по рассказам Зака это так) Общий вывод – с семёрки никуда не передаётся, а с хрюшки – передаётся хоть куда. Передачу делаю так: полученные в хуке параметры code, wParam, lParam передаю по сети, а на том конце собираю структуру INPUT (в коде - структура struct myKeysINPUT:public INPUT , метод Set() ) struct myKeysINPUT:public INPUT { union s_pars { LPARAM lParam; struct { LPARAM repeat_counter:16; LPARAM scan_code:8; LPARAM extended:1; LPARAM :4;//reserv LPARAM alt_down:1; LPARAM prev_was_down:1; LPARAM was_raised:1;//transition: 0(u->d),1(d->u), }; };
myKeysINPUT() { ::memset(this,0,sizeof(*this)); }
myKeysINPUT(const Common::s_e_K2K_MASTERkeyActions::s_OneKeyMove& s) { Set(s); }
void Set(const Common::s_e_K2K_MASTERkeyActions::s_OneKeyMove& s) { ::memset(this,0,sizeof(*this)); type=INPUT_KEYBOARD;
s_pars Pparse; Pparse.lParam=s.m_lParam_;
ki.wVk=s.m_wParam_;//virtual code ki.dwFlags=0; if(Pparse.extended)ki.dwFlags|=KEYEVENTF_EXTENDEDKEY; if(Pparse.was_raised)ki.dwFlags|=KEYEVENTF_KEYUP;
// templ.mi.time=0; // templ.mi.dwExtraInfo=0; } };
далее массив полученных структур исполняю в SendInput Что я забыл сделать (чтобы передача с семёрки тоже стала выполняться)?
|
|
« Последнее редактирование: 24-03-2011 19:56 от Алексей1153 »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #85 : 24-03-2011 20:05 » |
|
Алексей1153++, так тебе ведь не надо ничего имитировать.
Ты ведь можешь поставить клиентскую часть с хуком на клаву, а клиентской частью отдавать на серверный вариант только события клавы. Т.е написать кейлогер.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
zubr
Гость
|
|
« Ответ #86 : 24-03-2011 20:41 » |
|
1. Хук в 7-ке не перехватывает клавиатуру или данные теряются при передаче? 2. Хук работает только с GUI-процессами. 3. Хуку доступны только процессы текущего пользователя, если пользователь не админ. 4. Возможно стоит попробовать воспользоваться LowLevelKeyboardProc
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #87 : 24-03-2011 20:52 » |
|
Ты ведь можешь поставить клиентскую часть с хуком на клаву, а клиентской частью отдавать на серверный вариант только события клавы. Т.е написать кейлогер.
имитировать нужно, как же иначе то ? zubr, 1) надо сделать тест 2) ну он и так GUI ) 3) хук поставлен внутри приложения, которое сам пользователь и запустил. Тут, кстати, хук по сути и не нужен - можно просто все сообщения клавы ловить в оконной процедуре, но там очень геморно потом преобразовывать. Поэтому оставил хук - из него легко собирается INPUT 4) ок, попробую Добавлено через 22 часа и 42 секунды:разобрался, кстати. Всего то лишь надо было ещё ID потока указать - последний параметр функции SetWindowsHookEx() , значение ::GetCurrentThreadId() Сначала я туда просто 0 передавал. Хрюше было достаточно, а под семёркой хук не ставился
|
|
« Последнее редактирование: 25-03-2011 18:53 от Алексей1153 »
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #88 : 26-03-2011 04:51 » |
|
Хмм... А тебе мониторить надо только одно приложение, которое сам же пользователь и запустил?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #89 : 26-03-2011 08:08 » |
|
zubr, конечно. Более того - всего одно диалоговое окно. В общем-то, было бы достаточно оконную процедуру переопределить и там ловить клаву, но сборка структур INPUT сильно сложная. С хуковыми данными просто получается. Только смотреть, что в фокусе сейчас нужный диалог
|
|
|
Записан
|
|
|
|
|