View Full Version : نمایش دسکتاپ کلاینت در شبکه محلی
Mask
یک شنبه 01 فروردین 1389, 17:53 عصر
با سلام
در حاله نوشتن برنامه ای هستم که برای نمایش دسکتاپ سیستم کلاینت بر روی سرور از کدی که دوستمون به عنوان ویدئو کنفرانس گذاشته بود استفاده کردم اما چون برنامه بزرگیه قاطی پاطی کردم و نشد.
اگه ممکنه دوستان یه سورس کوچولو که فقط بشه دسکتاپ کلاینت رو مونیتور کرد قرار بدند.
ممنون میشم از همه دوستان.
Mask
یک شنبه 01 فروردین 1389, 18:12 عصر
آقای خزایی(khazaie01) شما هم قبلا مشکل من رو داشتید در پست زیر
http://barnamenevis.biz/forum/showthread.php?t=104853&page=2
میشه راهنماییم کنید چی کار کردید.
ممنون.
khazaie01
چهارشنبه 04 فروردین 1389, 17:02 عصر
سلام دوست عزیز
روشی که من استفاده کردم همان روشی است که در پروژه ویدئو کنفرانس استفاده شده است.
اما راه درستی برای اینکار نبود ! یک مدت دنبال این موضوع بودم و به نتیجه نرسیدم به همین خاطر تصمیم گرفتم از همان فکر ساده ای (و البته غیر کاربردی) که در ذهن داشتم استفاده کنم، یعنی عکس گرفتن از صفحه نمایش کلاینت و ارسال آن برای سرور (البته در برنامه نویسی بر عکس خواد بود یعنی برنامه سرور بر روی کلاینت نصب خواهد شد ...)
عکسها را فشرده میکردم و میفرستادم ، برای کنترل موس هم مختصاتی که بر روی عکس کلید شده را برای سیستم کلاینت میفرستادم و کلاینت در آن مختصات کلیک می کرد..
Mask
پنج شنبه 05 فروردین 1389, 14:34 عصر
سلام دوست عزیز
روشی که من استفاده کردم همان روشی است که در پروژه ویدئو کنفرانس استفاده شده است.
اما راه درستی برای اینکار نبود ! یک مدت دنبال این موضوع بودم و به نتیجه نرسیدم به همین خاطر تصمیم گرفتم از همان فکر ساده ای (و البته غیر کاربردی) که در ذهن داشتم استفاده کنم، یعنی عکس گرفتن از صفحه نمایش کلاینت و ارسال آن برای سرور (البته در برنامه نویسی بر عکس خواد بود یعنی برنامه سرور بر روی کلاینت نصب خواهد شد ...)
عکسها را فشرده میکردم و میفرستادم ، برای کنترل موس هم مختصاتی که بر روی عکس کلید شده را برای سیستم کلاینت میفرستادم و کلاینت در آن مختصات کلیک می کرد..
ممنون از جوابتون.
ممکنه یه نمونه برنامه از برنامتون که نوشتین برام بزارین.
ممنون.
khazaie01
شنبه 07 فروردین 1389, 19:54 عصر
ببخشيد دوست عزيز تا چند روز ديگه براتون آپ مي كنم ( مسافرت هستم )
khazaie01
چهارشنبه 11 فروردین 1389, 09:44 صبح
خیلی قدیمی هست تست نکردم خودم با دلفی 7 نوشته بودم... این احتمالا قطعه برنامه ای بوده که برای آزمایش نوشتم !
دانلود
(http://k01.ir/Downloads/Remote%20Desktop.zip)
khazaie01
شنبه 08 خرداد 1389, 08:36 صبح
مقدار تایمر را 1000 قرار بدید تا اتصال قطع نشه ...
Mask
پنج شنبه 13 خرداد 1389, 17:40 عصر
ممنون آقای خزایی
برنامه خودتون رو که گفته بودید با دلفی 7 نوشتید امتحان کردم.
رو گاهی سیستم ها مشکل مموری استریم دارییم و برنامه رور میده.
به نظرم به خاطر حجم بالایه عکسهایه ارسالیه.
آیا نمونه دیگه ای دارید که حجم پایینتر باشه و ارور نده ... و روهمه سیستمها جواب بده؟
ممنون.
khazaie01
پنج شنبه 13 خرداد 1389, 17:45 عصر
نه حجمی نداره آخه ! کلی فشرده شده !! من خودم تستش کردم مشکلی نداره ، فقط مقدار تایمر را فعلا 1000 به بالا انتخاب کنید
Mask
پنج شنبه 13 خرداد 1389, 18:05 عصر
ممنون.
منظورم همون برنامست که در پست 6 گزاشتید.
ببینید شما در اون برنامه از صفحه دسکتاپ عکس گرفتید و اون رو compressStream میکنید و سپس در طرف دیگه DecompressStream میکنید.
به نظرتون بهتر نیست یه جایی عکس رو از حالت bitmap یا bmp تبدیل کنیم به jpg و سپس کمپرس رو انجام بدیم؟
khazaie01
پنج شنبه 13 خرداد 1389, 18:18 عصر
دوست عزیز ، عکس تو همین سورس به JPG تبدیل میشه و بعد تازه همون هم فشرده میشه و بعد دوباره فشرده میشه ...
khazaie01
پنج شنبه 13 خرداد 1389, 18:26 عصر
j.CompressionQuality:=50;
j.Compress;
j.SaveToStream(s);
s.Position:=0;
CompressStream(s,s1);
دوست عزیز یه نگاهی به کد بالا بندازید ! هم کیفیت عکس را آوردم پایین ، هم از فشرده سازی Jpeg استفاده کردم و هم در آخر با استفاده از تابع CompressStream فشرده کردمش
Mask
پنج شنبه 13 خرداد 1389, 18:36 عصر
ممنون از راهنماییتون.
اما چرا پس وقتی از برنامه هایی مثل نت اسکول یا امثالهم استفاده میشه همچین اروری نمیاد.
اما این برنامه ارور، مموری میده.(یعنی حافظه).
ممنونم که وقت میزارید و جواب میدید.
khazaie01
پنج شنبه 13 خرداد 1389, 21:47 عصر
این ساده ترین روش بود و البته غیر اصولی ترین !
نرم افزارهایی مثل نت اسکول از این رش استفاده نمی کنن...
khazaie01
شنبه 22 خرداد 1389, 15:48 عصر
این قطعه کد خیلی قدیدمی هست و بخشی از یک برنامه بود که پارسال نوشتم ، اما سورس اصلی را ندارم ، فقط همین بود ! دوستان یه نگاهی به برنامه بندازن ! نمیدونم چرا دیسکانکت می کنه ، جالب اینجاست وقتی نرم افزار سرور پایین انداخته شده قطع نمیشه !! یه نگاهی کنید متوجه میشید...
ممنووووووووون
iman_Delphi7
پنج شنبه 03 تیر 1389, 08:44 صبح
این ساده ترین روش بود و البته غیر اصولی ترین !
نرم افزارهایی مثل نت اسکول از این رش استفاده نمی کنن...
سلام.
میشه بگین این نرم افزارها از چه روشی استفاده می کنن؟ اگه امکانش هست یه مقدار بیشتر توضیح بدین.
با تشکر.
khazaie01
پنج شنبه 03 تیر 1389, 11:39 صبح
زیاد دنبال این موضوع نرفتم و اطلاعات مناسبی در این رابطه ندارم ، نیازم را با همون عکس گرفتن برآورده کردم...
اگر از دوستان کسی اطلاعات در رابطه با نحوه کار این نرم افزار ها داره ، همینجا مطرح کنه ( البته با روش پیاده سازی در دلفی ) ...
ممنوووووووووون
MohsenB
پنج شنبه 22 مهر 1389, 11:56 صبح
یه راه هایی به نظر من میاد فکر کنید :
هروقت تصویر تغییر کرد بفرسیم . حالا یا با تغییر وضعیت صفحه کلید یا موس یا مقایسه عکسا .
اگر تصویر تغییر نکرد فقط موقعیت موس رو بفرسیم .
اگر موس هم تغییر نکرد فقط پیامی مبنی بر تغییر نکردن بفرسیم .
اگر تصویر تغییر کرد فقط قسمتای تغییر کرده رو ارسال کنیم .
برا فرستادن عکس اینجوری بفرسیم :
اول مختصاتی که باید چاپ بشه و بعد اون تیکه عکس .
و اگه عکسی هم تغییر نکرد مثلا قرارداد بزاریم اگر بجای عکس فلان عدد رسید هیچ تغییری نداشته باشه .
با این روشا هم میشه یه جوری نوشت که اصلا فقط وقتی ارسال انجام بشه که عکس تغییر کرده باشه . اینجوری خیلی سرعت بالا میره .
برا مقایسه تصویر هم یه راههایی هست که سرعت باز بالاتر بره :
مثلا اول نقاط زیر موس مقایسه بشن ، بعد مختصات کنترل یا پنجره ای که هم اکنون فعال هستش و بعدش یه سری نقاط خاص با یه فاصله خاص از همدیگه .
و یا میشه رویداد Paint ویندوز رو در دست گرفت که هر وقت اون رویداد انجام شد اون قسمت تغییر کرده ارسال بشه .
khazaie01
پنج شنبه 22 مهر 1389, 12:02 عصر
ممنووووون دوست عزیز
اما این شد بهینه کردن روش قبلی ، روشی غیر از عکس گرفتن باید باشه....
Mask
پنج شنبه 22 مهر 1389, 14:35 عصر
با سلام
بنده پس از چندی تحقیق یه روش خوب پیدا کردم.
scanline
و ارسال استرینگ به سرور.
نظرتون چیه.
khazaie01
پنج شنبه 22 مهر 1389, 17:40 عصر
سلام دوست عزیز
من اطلاعات چندانی درباره Scan Line ندارم اما تاجایی که می دونم Scan Line یک ردیف از پیکسل ها را اسکن کرده و بعد می توان در آرایه ای ذخیره کرد و این عمل برای افزایش سرعت پردازش ( پردازش بر روی تصویر ) انجام می شود ...
مشکل برنامه اینجاست که حجم عکس ارسالی با این که فشرده می شود باز هم زیاد است و ترافیک بالایی در شبکه ایجاد می کند...
alinikaein
پنج شنبه 22 مهر 1389, 19:09 عصر
سلام به دوستان گرامي؛
فكر ميكنم چيزي كه شما ميخواهيد اين باشه:
شما بايد خروجي مانيتور را پيدا كنيد و خروجي مانيتور (نه تصوير، بلكه سيگنال) را انتقال بديد.
من چند سال پيش دنبال اين قضيه گشتم، ولي چيزي پيدا نكردم، اون موقع انگليسي هم خيلي بلد نبودم.
ولي الآن شما ميتونيد جستجو كنيد و ببينيد سيگنال مانيتور را ميشه انتقال داد يا خير.
البته شايد هم اشتباه بگم، به عبارتي خروجي كارت گرافيكي مد نظر هست. اين كه بخوايد بيايد از صفحه عكس بگيريد، مطمئناً كاري هست كه هم IO و هم پردازش زيادي را ايجاد ميكنه. ولي استفادهي مستقيم از خروجي كارت گرافيكي، فكر ميكنم بهينهتر باشه.
يا علي... موفق باشيد...
MohsenB
جمعه 23 مهر 1389, 01:49 صبح
ممنووووون دوست عزیز
اما این شد بهینه کردن روش قبلی ، روشی غیر از عکس گرفتن باید باشه....
با سلام
بنده پس از چندی تحقیق یه روش خوب پیدا کردم.
scanline
و ارسال استرینگ به سرور.
نظرتون چیه.
ببینید ما چی داریم :
یه صفحه مانیتور کلاینت ، یه سیستم مرکزی و یه خط ارتباطی بین اونا .
خوب اگه قراره یه تصویر از سیستم کلاینت روی سیستم مرکزی نشون داده بشه ارسال اون تصویر چطوری میتونه باشه .
خوب تصاویرو چطوری ذخیره میسه کرد؟ بوسیله فرمتای مختلف موجود .
خوب پس به نظر من چیزی غیر از تصویر نباید انتقال داده بشه .
استفاده از تصویر با فرمت JPG حجم فایل رو خیلی کم میکنه . اگر کسی فرمت بهتری سراغ داره بگه .
استفاده از ScanLine به نظر من گزینه مناسبی نیست چون اولا از توابع API خیلی بهتر و سریعتر میشه استفاده کرد و دوما" هم مشکل ما اصلا انتقال سریعتر هستش نه عکس گرفتن سریعتر .
به نظر من بدست گرفتن رویداد Paint ( رویدادی که ویندوز وقتی آن را فراخوانی میکند که یک قسمت ، تاکید میکنم : یک قسمت از صفحه نمایش را بازسازی می کند ) و ارسال آن تکه از تغییرات با فرمت JPG راه حل بسیار خوبی باشد .
برای مثال تصور کنید کاربر موس خود را حرکت میدهد ( در این هنگام هیچ تصویری رد و بدل نمی شود و فقط مختصات موس ارسال شده و روی سیستم مرکزی ،روی آخرین تصویر ارسالی کشیده و نمایش داده می شود ) و روی دکمه Start می برد ، در این موقع رویداد Paint ویندوز فراخوانی میشود و "فقط خود دکمه استارت" را بازسازی میکند ( در این موقع برنامه مختصات و اندازه محل بازسازی شده را گرفته و یک عکس کوچک از آن محل می گیرد و به همراه مختصات به سیستم مرکزی منتقل میکند ) .
به مثال بالا توجه کنید : اگر قرار بود کل صفحه ارسال شود و رزولوشن صفحه را هم مثلا 800x600 در نظر بگیریم این کار 200 برار وقتی است که دکمه استارت را مثلا در اندازه 80x30 فرض کنیم .
تازه این را هم در نظر بگیرید که در بیشتر مواقع فقط موس است که حرکت می کند و سرعت ارسال یک مختصات ساده خیلی زیاد و در مثال بالا حدود 240000 برابر است .
khazaie01
جمعه 23 مهر 1389, 11:46 صبح
ممنوووون دوست عزیز
مثالی که در این تاپیک است یک مثال خیلی ساده از عکس گرفتن از صفحه نمایش و ارسال آن است ، گفته های شما کاملا درست و بی شک با بهینه کردن روش ارسال عکس ( نکاتی که گفتید و برخی نکات دیگر ) ، بار ترافیک شبکه به صورت چشمگیر کم خواهد شد ، اما چون همیشه به دنبال یک روش مخصوص برای این کار بودم ، هیچ وقت به فکر بهینه کردن این روش نبودم . باید پیاده سازی کرد و نتیجه کار را دید ...
اما باز هم فکر می کنم روش دیگری برای این کار باید باشد ! ( شاید هم برنامه هایی نظیر TeamViewer عکس میگیرن و ارسال می کنن ! )
باز هم ممنووووووون دوست عزیز
firststep
شنبه 24 مهر 1389, 13:52 عصر
فكر نمي كنم انتقال سيگنال كاري منسب اشد ولي يك ايده هست<<<<چون بازه تغيرات بالاست و بعد هم اگه بخايم تبديلش كنيم به ديجاتال باز همون داستان مگر...>>>>
درباره ارور رم فكر ميكنم اگه بازه عكس گرفتن تا ارسال كامل عكس رو توي يك Thread انجام بديم و بعد اون رو ببندين باز Thread جديدي باز كنيد و ...
اما در موردپردازش تصوير و بعد انتقال اين شايد خوب و يا بهترين باشه ولي خيلي دردسر داره
واي اگه طرف بخواهد نگاه فيلم يا يك فلش يا يك عكس متحرك كنه......اا بهتر از همه هست فكر كنم
firststep
شنبه 24 مهر 1389, 13:53 عصر
ريموت دسك تاپ چه شكلي كار ميكنه؟ مقاله اي چيزي كسي نداره
mossaferin
شنبه 24 مهر 1389, 16:17 عصر
سلام
نظر من اینه که تعویض روش چیز زیادی رو عوض نمیکنه ، چون در نهایت ما باید اطلاعات تصویری رو از صفحه دسکتاپ مد نظر ارسال کنیم ، حالا این تصویر یه سری مشخصه داره مثل ابعاد ، عمق رنگ و فرمت یا فشرده سازی ، که این اطلاعات رو چه ما از صفحه مانیتور برداریم یا از خروجی کارت گرافیک یا ... هرجای دیگه ، در نهایت یه سری داده هست که بایستی به اطلاعات تصویری تبدیل بشه ، حالا هرچی فشرده سازی بالاتر ، عمق رنگ پایین تر و ابعاد تصویر کوچکتر باشه ، حجم اطلاعات ارسالی کمتر و در نتیجه ترافیک شبکه کمتر خواهد بود .( مثل فرق MPEG1,2,4 )
روشهایی مثل scanline میتونه سرعت تصویر برداری رو از صفحه نمایش بالا ببره ولی توی حجم ارسالی دخالتی نداره
بهینه کردن این نرم افزار شامل دو قسمته :
1- بهینه کردن سرعت تصویر بردای ( همون مطالبی که دوستان گفتند ، تغییرات ، محدود شدن ابعاد ، مختصات پوینتر ، scanline و ....)
2- بهینه کردن حجم انتقال داده ( فشرده سازی ، کم کردن عمق رنگ ، محدود کردن ابعاد و ...)
که ترکیبی از هر دو مورد فوق میتونه کارایی و سرعت رو بسیار بالا ببره
این هم یکم توضیح راجع به remote desktop
http://www.codeproject.com/KB/IP/RDVL.aspx
موفق باشید
Mask
شنبه 24 مهر 1389, 17:51 عصر
ممنون از دوستان.
یه نظری دیگه دارم اونم اینه که اگه به وسیله scanline بیاییم و مقدار یک سطر پیکسل عکس رو بدست بیاریم و بفرستیم رویه سرور و به همین ترتیب خط دوم و سوم و.. و بعد از ارسال کامل مقادیر scanline ،برنامه سرور بیاد و مقادیر رو جمع کنه و عکس رو باز سازی کنه.
یعنی برای ارسال هر فرم عکس مادیگه با یه فایل عکس طرف نیستیم و فقط با اعداد طرفیم.یا همون اینتیجرها.
این اینتیجرها در کمترین زمان و با سرعت فوقالعاده به سرور میرسه.و اونجا عکس باز سازی میشه.
نظرتون راجع به این چیه؟
khazaie01
شنبه 24 مهر 1389, 18:57 عصر
جناب آقای mossaferin (http://barnamenevis.org/forum/member.php?u=35201) ممنووووووون ، لطف کردید ...
آقای Delphi-7 (http://barnamenevis.org/forum/member.php?u=74166) حرف شما درست اما با این روش حجم نهایی همین اعداد بیشتر از حجم عکس خواهد شد ...
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.