# Native Code > برنامه نویسی در Delphi > توسعه نرم افزارهای تحت شبکه >  نمایش دسکتاپ کلاینت در شبکه محلی

## Mask

با سلام
در حاله نوشتن برنامه ای هستم که برای نمایش دسکتاپ سیستم کلاینت بر روی سرور از کدی که دوستمون به عنوان ویدئو کنفرانس گذاشته بود استفاده کردم اما چون برنامه بزرگیه قاطی پاطی کردم و نشد.
اگه ممکنه دوستان یه سورس کوچولو که فقط بشه دسکتاپ کلاینت رو مونیتور کرد قرار بدند.
ممنون میشم از همه دوستان.

----------


## Mask

آقای خزایی(khazaie01) شما هم قبلا مشکل من رو داشتید در پست زیر
http://barnamenevis.org/forum/showth...=104853&page=2
میشه راهنماییم کنید چی کار کردید.
ممنون.

----------


## khazaie01

سلام دوست عزیز 
روشی که من استفاده کردم همان روشی است که در پروژه ویدئو کنفرانس استفاده شده است.
اما راه درستی برای اینکار نبود ! یک مدت دنبال این موضوع بودم و به نتیجه نرسیدم به همین خاطر تصمیم گرفتم از همان فکر ساده ای (و البته غیر کاربردی) که در ذهن داشتم استفاده کنم، یعنی عکس گرفتن از صفحه نمایش کلاینت و ارسال آن برای سرور (البته در برنامه نویسی بر عکس خواد بود یعنی برنامه سرور بر روی کلاینت نصب خواهد شد ...)
عکسها را فشرده میکردم و میفرستادم ، برای کنترل موس هم مختصاتی که بر روی عکس کلید شده را برای سیستم کلاینت میفرستادم و کلاینت در آن مختصات کلیک می کرد..

----------


## Mask

> سلام دوست عزیز 
> روشی که من استفاده کردم همان روشی است که در پروژه ویدئو کنفرانس استفاده شده است.
> اما راه درستی برای اینکار نبود ! یک مدت دنبال این موضوع بودم و به نتیجه نرسیدم به همین خاطر تصمیم گرفتم از همان فکر ساده ای (و البته غیر کاربردی) که در ذهن داشتم استفاده کنم، یعنی عکس گرفتن از صفحه نمایش کلاینت و ارسال آن برای سرور (البته در برنامه نویسی بر عکس خواد بود یعنی برنامه سرور بر روی کلاینت نصب خواهد شد ...)
> عکسها را فشرده میکردم و میفرستادم ، برای کنترل موس هم مختصاتی که بر روی عکس کلید شده را برای سیستم کلاینت میفرستادم و کلاینت در آن مختصات کلیک می کرد..


 ممنون از جوابتون.
ممکنه یه نمونه برنامه از برنامتون که نوشتین برام بزارین.
ممنون.

----------


## khazaie01

ببخشيد دوست عزيز تا چند روز ديگه براتون آپ مي كنم ( مسافرت هستم )

----------


## khazaie01

خیلی قدیمی هست تست نکردم خودم با دلفی 7 نوشته بودم... این احتمالا قطعه برنامه ای بوده که برای آزمایش نوشتم !
*دانلود 
*

----------


## khazaie01

مقدار تایمر را 1000 قرار بدید تا اتصال قطع نشه ...

----------


## Mask

ممنون آقای خزایی
برنامه خودتون رو که گفته بودید با دلفی 7 نوشتید امتحان کردم.
رو گاهی سیستم  ها مشکل مموری استریم دارییم و برنامه رور میده.
به نظرم به خاطر حجم بالایه عکسهایه ارسالیه.
آیا نمونه دیگه ای دارید که حجم پایینتر باشه و ارور نده ... و روهمه سیستمها جواب بده؟
ممنون.

----------


## khazaie01

نه حجمی نداره آخه ! کلی فشرده شده !! من خودم تستش کردم مشکلی نداره ، فقط مقدار تایمر را فعلا 1000 به بالا انتخاب کنید

----------


## Mask

ممنون. 
منظورم همون برنامست که در پست 6 گزاشتید.
ببینید شما در اون برنامه از صفحه دسکتاپ عکس گرفتید و اون رو compressStream میکنید و سپس در طرف دیگه DecompressStream میکنید.
به نظرتون بهتر نیست یه جایی عکس رو از حالت bitmap  یا bmp تبدیل کنیم به jpg و سپس کمپرس رو انجام بدیم؟

----------


## khazaie01

دوست عزیز ، عکس تو همین سورس به JPG تبدیل میشه و بعد تازه همون هم فشرده میشه و بعد دوباره فشرده میشه ...

----------


## khazaie01

j.CompressionQuality:=50;
    j.Compress;
    j.SaveToStream(s);
    s.Position:=0;
    CompressStream(s,s1);
دوست عزیز یه نگاهی به کد بالا بندازید ! هم کیفیت عکس را آوردم پایین ، هم از فشرده سازی Jpeg استفاده کردم و هم در آخر با استفاده از تابع CompressStream فشرده کردمش

----------


## Mask

ممنون از راهنماییتون.
اما چرا پس وقتی از برنامه هایی مثل نت اسکول یا امثالهم استفاده میشه همچین اروری نمیاد.
اما این برنامه ارور، مموری میده.(یعنی حافظه).
ممنونم که وقت میزارید و جواب میدید.

----------


## khazaie01

این ساده ترین روش بود و البته غیر اصولی ترین !
نرم افزارهایی مثل نت اسکول از این رش استفاده نمی کنن...

----------


## khazaie01

این قطعه کد خیلی قدیدمی هست و بخشی از یک برنامه بود که پارسال نوشتم ، اما سورس اصلی را ندارم ، فقط همین بود ! دوستان یه نگاهی به برنامه بندازن ! نمیدونم چرا دیسکانکت می کنه ، جالب اینجاست وقتی نرم افزار سرور پایین انداخته شده قطع نمیشه !! یه نگاهی کنید متوجه میشید...
ممنووووووووون

----------


## iman_Delphi7

> این ساده ترین روش بود و البته غیر اصولی ترین !
> نرم افزارهایی مثل نت اسکول از این رش استفاده نمی کنن...


سلام.
میشه بگین این نرم افزارها از چه روشی استفاده می کنن؟ اگه امکانش هست یه مقدار بیشتر توضیح بدین.
با تشکر.

----------


## khazaie01

زیاد دنبال این موضوع نرفتم و اطلاعات مناسبی در این رابطه ندارم ، نیازم را با همون عکس گرفتن برآورده کردم...
اگر از دوستان کسی اطلاعات در رابطه با نحوه کار این نرم افزار ها داره ، همینجا مطرح کنه ( البته با روش پیاده سازی در دلفی ) ...
ممنوووووووووون

----------


## MohsenB

یه راه هایی به نظر من میاد فکر کنید :


هروقت تصویر تغییر کرد بفرسیم . حالا یا با تغییر وضعیت صفحه کلید یا موس یا مقایسه عکسا .اگر تصویر تغییر نکرد فقط موقعیت موس رو بفرسیم .اگر موس هم تغییر نکرد فقط پیامی مبنی بر تغییر نکردن بفرسیم .اگر تصویر تغییر کرد فقط قسمتای تغییر کرده رو ارسال کنیم .

برا فرستادن عکس اینجوری بفرسیم :
اول مختصاتی که باید چاپ بشه و بعد اون تیکه عکس .
و اگه عکسی هم تغییر نکرد مثلا قرارداد بزاریم اگر بجای عکس فلان عدد رسید هیچ تغییری نداشته باشه .

با این روشا هم میشه یه جوری نوشت که اصلا فقط وقتی ارسال انجام بشه که عکس تغییر کرده باشه . اینجوری خیلی سرعت بالا میره .

برا مقایسه تصویر هم یه راههایی هست که سرعت باز بالاتر بره :
مثلا اول نقاط زیر موس مقایسه بشن ، بعد مختصات کنترل یا پنجره ای که هم اکنون فعال هستش و بعدش یه سری نقاط خاص با یه فاصله خاص از همدیگه .
و یا میشه رویداد Paint ویندوز رو در دست گرفت که هر وقت اون رویداد انجام شد اون قسمت تغییر کرده ارسال بشه .

----------


## khazaie01

ممنووووون دوست عزیز 
اما این شد بهینه کردن روش قبلی ، روشی غیر از عکس گرفتن باید باشه....

----------


## Mask

با سلام
بنده پس از چندی تحقیق یه روش خوب پیدا کردم.
scanline
 و ارسال استرینگ به سرور.
نظرتون چیه.

----------


## khazaie01

سلام دوست عزیز
من اطلاعات چندانی درباره Scan Line ندارم اما تاجایی که می دونم  Scan Line یک ردیف از پیکسل ها را اسکن کرده و بعد می توان در آرایه ای ذخیره کرد و این عمل برای افزایش سرعت پردازش ( پردازش بر روی تصویر ) انجام می شود ...

مشکل برنامه اینجاست که حجم عکس ارسالی با این که فشرده می شود باز هم زیاد است و ترافیک بالایی در شبکه ایجاد می کند...

----------


## alinikaein

سلام به دوستان گرامي؛

فكر مي‌كنم چيزي كه شما مي‌خواهيد اين باشه:
شما بايد خروجي مانيتور را پيدا كنيد و خروجي مانيتور (نه تصوير، بلكه سيگنال) را انتقال بديد.
من چند سال پيش دنبال اين قضيه گشتم، ولي چيزي پيدا نكردم، اون موقع انگليسي هم خيلي بلد نبودم.
ولي الآن شما مي‌تونيد جستجو كنيد و ببينيد سيگنال مانيتور را مي‌شه انتقال داد يا خير.

البته شايد هم اشتباه بگم، به عبارتي خروجي كارت گرافيكي مد نظر هست. اين كه بخوايد بيايد از صفحه عكس بگيريد، مطمئناً كاري هست كه هم IO و هم پردازش زيادي را ايجاد مي‌كنه. ولي استفاده‌ي مستقيم از خروجي كارت گرافيكي، فكر مي‌كنم بهينه‌تر باشه.


يا علي... موفق باشيد...

----------


## MohsenB

> ممنووووون دوست عزیز 
> اما این شد بهینه کردن روش قبلی ، روشی غیر از عکس گرفتن باید باشه....





> با سلام
> بنده پس از چندی تحقیق یه روش خوب پیدا کردم.
> scanline
>  و ارسال استرینگ به سرور.
> نظرتون چیه.


ببینید ما چی داریم :

یه صفحه مانیتور کلاینت ، یه سیستم مرکزی و یه خط ارتباطی بین اونا .

خوب اگه قراره یه تصویر از سیستم کلاینت روی سیستم مرکزی نشون داده بشه ارسال اون تصویر چطوری میتونه باشه .

خوب تصاویرو چطوری ذخیره میسه کرد؟ بوسیله فرمتای مختلف موجود .
خوب پس به نظر من چیزی غیر از تصویر نباید انتقال داده بشه .

استفاده از تصویر با فرمت JPG حجم فایل رو خیلی کم میکنه . اگر کسی فرمت بهتری سراغ داره بگه .

استفاده از ScanLine به نظر من گزینه مناسبی نیست چون اولا از توابع API خیلی بهتر و سریعتر میشه استفاده کرد و دوما" هم مشکل ما اصلا انتقال سریعتر هستش نه عکس گرفتن سریعتر .

به نظر من بدست گرفتن رویداد Paint ( رویدادی که ویندوز وقتی آن را فراخوانی میکند که یک قسمت ، تاکید میکنم : یک قسمت از صفحه نمایش را بازسازی می کند ) و ارسال آن تکه از تغییرات با فرمت JPG راه حل بسیار خوبی باشد .

برای مثال تصور کنید کاربر موس خود را حرکت میدهد ( در این هنگام هیچ تصویری رد و بدل نمی شود و فقط مختصات موس ارسال شده و روی سیستم مرکزی ،روی آخرین تصویر ارسالی کشیده و نمایش داده می شود ) و روی دکمه Start می برد ، در این موقع رویداد Paint ویندوز فراخوانی میشود و "فقط خود دکمه استارت" را بازسازی میکند ( در این موقع برنامه مختصات و اندازه محل بازسازی شده را گرفته و یک عکس کوچک از آن محل می گیرد و به همراه مختصات به سیستم مرکزی منتقل میکند ) .

به مثال بالا توجه کنید : اگر قرار بود کل صفحه ارسال شود و رزولوشن صفحه را هم مثلا 800x600 در نظر بگیریم این کار 200 برار وقتی است که دکمه استارت را مثلا در اندازه 80x30 فرض کنیم .

تازه این را هم در نظر بگیرید که در بیشتر مواقع فقط موس است که حرکت می کند و سرعت ارسال یک مختصات ساده خیلی زیاد و در مثال بالا حدود 240000 برابر است .

----------


## khazaie01

ممنوووون دوست عزیز 

مثالی که در این تاپیک است یک مثال خیلی ساده از عکس گرفتن از صفحه نمایش و ارسال آن است ، گفته های شما کاملا درست و بی شک با بهینه کردن روش ارسال عکس ( نکاتی که گفتید و برخی نکات دیگر ) ، بار ترافیک شبکه به صورت چشمگیر کم خواهد شد ، اما چون همیشه به دنبال یک روش مخصوص برای این کار بودم ، هیچ وقت به فکر بهینه کردن این روش نبودم . باید پیاده سازی کرد و نتیجه کار را دید ...

اما باز هم فکر می کنم روش دیگری برای این کار باید باشد ! ( شاید هم برنامه هایی نظیر TeamViewer عکس میگیرن و ارسال می کنن ! )

باز هم ممنووووووون دوست عزیز

----------


## firststep

فكر نمي كنم انتقال سيگنال كاري منسب اشد ولي يك ايده هست<<<<چون بازه تغيرات بالاست و بعد هم اگه بخايم تبديلش كنيم به ديجاتال باز همون داستان مگر...>>>>

درباره ارور رم فكر ميكنم اگه بازه عكس گرفتن تا ارسال كامل عكس رو توي يك Thread انجام بديم و بعد اون رو ببندين باز Thread جديدي باز كنيد و ...

اما در موردپردازش تصوير و بعد انتقال اين شايد خوب و يا بهترين باشه ولي خيلي دردسر داره
واي اگه طرف بخواهد نگاه فيلم يا يك فلش يا يك عكس متحرك كنه......اا بهتر از همه هست فكر كنم

----------


## firststep

ريموت دسك تاپ چه شكلي كار ميكنه؟ مقاله اي چيزي كسي نداره

----------


## mossaferin

سلام
نظر من اینه که تعویض روش چیز زیادی رو عوض نمیکنه ، چون در نهایت ما باید اطلاعات تصویری رو از صفحه دسکتاپ مد نظر ارسال کنیم ، حالا این تصویر یه سری مشخصه داره مثل ابعاد ، عمق رنگ و فرمت یا فشرده سازی ، که این اطلاعات رو چه ما از صفحه مانیتور برداریم یا از خروجی کارت گرافیک یا ... هرجای دیگه ، در نهایت یه سری داده هست که بایستی به اطلاعات تصویری تبدیل بشه ، حالا هرچی فشرده سازی بالاتر ، عمق رنگ پایین تر و ابعاد تصویر کوچکتر باشه ، حجم اطلاعات ارسالی کمتر و در نتیجه ترافیک شبکه کمتر خواهد بود .( مثل فرق MPEG1,2,4 )  

روشهایی مثل scanline  میتونه سرعت تصویر برداری رو از صفحه نمایش بالا ببره ولی توی حجم ارسالی دخالتی نداره

بهینه کردن این نرم افزار شامل دو قسمته :
1- بهینه کردن سرعت تصویر بردای ( همون مطالبی که دوستان گفتند ، تغییرات ، محدود شدن ابعاد ، مختصات پوینتر ، scanline و ....) 
2- بهینه کردن حجم انتقال داده ( فشرده سازی ، کم کردن عمق رنگ ، محدود کردن ابعاد و ...)

که ترکیبی از هر دو مورد فوق میتونه کارایی و سرعت رو بسیار بالا ببره 



این هم یکم توضیح راجع به remote desktop 
http://www.codeproject.com/KB/IP/RDVL.aspx

موفق باشید

----------


## Mask

ممنون از دوستان.
یه نظری دیگه دارم اونم اینه که اگه به وسیله scanline بیاییم و مقدار یک سطر پیکسل عکس رو بدست بیاریم و بفرستیم رویه سرور و به همین ترتیب خط دوم و سوم و.. و بعد از ارسال کامل مقادیر scanline ،برنامه سرور بیاد و مقادیر رو جمع کنه و عکس رو باز سازی کنه.
یعنی برای ارسال هر فرم عکس مادیگه با یه فایل عکس طرف نیستیم و فقط با اعداد طرفیم.یا همون اینتیجرها.
این اینتیجرها در کمترین زمان و با سرعت فوقالعاده به سرور میرسه.و اونجا عکس باز سازی میشه.
نظرتون راجع به این چیه؟

----------


## khazaie01

جناب آقای mossaferin ممنووووووون ، لطف کردید ...
آقای Delphi-7 حرف شما درست اما با این روش حجم نهایی همین اعداد بیشتر از حجم عکس خواهد شد ...

----------

