View Full Version : سوال: چکارکنم که به ترتیب اجرا شوند
ftn1361
سه شنبه 13 مهر 1389, 10:47 صبح
برنامه ای نوشتم که وقتی روی یک دکمه آن کلیک می کنیم چند عمل با صفحه کلید و ماوس در برنامه IE و همان برنامه خودم انجام می شود ولی این اعمال به همان ترتیب که نوشتم اجرا نمی شوند و مثلا Paste کردن زودتر از کپی کردن اجرا می شود حتی در یک حلقه هم قرار دادم که یک case در آن حلقه هست و پس از هر عمل یک رقم اضافه می شود و کار بعدی بر اساس همان رقم انجام می شود اما باز هم به ترتیب اجرا نمی شود لطفا راهنمایی کنید
ftn1361
سه شنبه 13 مهر 1389, 17:33 عصر
ضمنا از Sleep هم استفاده کرده ام اما خطهای بعد از Sleep زودتر از به خواب رفتن برنامه اجرا می شوند
Felony
سه شنبه 13 مهر 1389, 17:39 عصر
به وسیله تابع Sleep میتونید بین دستوراتتون وقفه بندازید .
ftn1361
سه شنبه 13 مهر 1389, 17:55 عصر
به وسیله تابع Sleep میتونید بین دستوراتتون وقفه بندازید .
با تشکر از پاسخگویی سریعتان اما گفتم از Sleep هم استفاده کردم اما دستورات بعد از Sleep زودتر از دستورات قبل از Sleep اجرا می شوند
tdkhakpur
سه شنبه 13 مهر 1389, 18:06 عصر
اما دستورات بعد از Sleep زودتر از دستورات قبل از Sleep اجرا می شوند
برای هر تابعی که استفاده میشه بعضا حالت wait وجود داره که باید true بشه ولی در مواردی مانند اعمال بالا که این پارامتر وجود نداره باید event تعریف کنید تا به انتها رسیدن عملیات را برای شما ارسال کنه.
حالا روال کارتان چی هست تا به ترتیب اجرا بشه؟
Felony
سه شنبه 13 مهر 1389, 18:24 عصر
ضمنا از Sleep هم استفاده کرده ام اما خطهای بعد از Sleep زودتر از به خواب رفتن برنامه اجرا می شوند
یعنی چی قبل از به خواب رفتن برنامه ؟
چه کدی نوشتید ؟ چه کاری قراره انجام بشه ؟
اگر میتونید برنامتون رو ضمیمه کنید .
ftn1361
سه شنبه 13 مهر 1389, 19:08 عصر
برای هر تابعی که استفاده میشه بعضا حالت wait وجود داره که باید true بشه ولی در مواردی مانند اعمال بالا که این پارامتر وجود نداره باید event تعریف کنید تا به انتها رسیدن عملیات را برای شما ارسال کنه.
حالا روال کارتان چی هست تا به ترتیب اجرا بشه؟
ضمن تشکر، روال کار به این صورت هست که یک پورتال در IE باز شده است که میخواهم اطلاعات موجود در آن را وارد برنامه کنم بعد از کلیک روی دکمه موجود در برنامه:
1- ماوس با برنامه نویسی به Edit موجود در IE منتقل شده روی آن کلیک می کند و مقدار یک Edit که در برنامه است را در Edit موجود در IE به وسیله رویدادهای صفحه کلید Paste می کنیم
2- ماوس روی یک دکمه در IE رفته و روی آن کلیک میکند که اطلاعات پورتال در IE ظاهر میشود تا اینجا مشکلی وجود ندارد
3- ماوس روی یک نوشته در IE رفته دوبار کلیک میکند تا نوشته انتخاب شود و با رویدادهای صفحه کلید آنرا در کلیپ بورد کپی می کنیم
4- مقدار کپی شده در کلیپبورد در یک Edit داخل برنامه Paste میشود که در اینجا عمل Paste سریعتر از عمل کپی انجام میشود یعنی متنی که قبلا کپی کرده بودیم Paste میشود و اشکال من در اینجاست البته از کپی شدن متن آخر مطمئنم چون پس از Paste کردن دستی ، همان متن Paste میشود
tdkhakpur
سه شنبه 13 مهر 1389, 20:07 عصر
4- مقدار کپی شده در کلیپبورد در یک Edit داخل برنامه Paste میشود که در اینجا عمل Paste سریعتر از عمل کپی انجام میشود یعنی متنی که قبلا کپی کرده بودیم Paste میشود و اشکال من در اینجاست البته از کپی شدن متن آخر مطمئنم چون پس از Paste کردن دستی ، همان متن Paste میشود
از api استفاده میکنید؟ کلیبپورد باید بعد از اتمام کار پاک بشه EmptyClipboard
ftn1361
یک شنبه 18 مهر 1389, 17:32 عصر
از api استفاده میکنید؟ کلیبپورد باید بعد از اتمام کار پاک بشه EmptyClipboard
ببخشید که کمی تاخیرایجادشدچون چندروزبرایم مشغله پیش آمد
آری از این تابع هم استفاده کرده ام اماباز هم خط مربوط به Paste کردن سریعتر از خطوط قبلی اجرا می شوداصلا بهتر است که سورس برنامه را بنویسم شایدبه پاسخی که می خواهم برسم
در این برنامه خط آخر حتی قبل از EmptyClipBoard اجرا می شود
http://www.barnamenevis.org/forum/d:\alaki\question.jpg
tdkhakpur
یک شنبه 18 مهر 1389, 18:15 عصر
اگر برنامه شما به درستی همه داده های موجوذ را select کرده باشد کد زیر را جایگزین کد قبلی خودتان قرار بدید.
procedure CopyPaste(copy_paste:char);
begin
if copy_paste='c' then
begin
EmptyClipboard;
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event(VK_INSERT, 0, 0, 0);
keybd_event(VK_INSERT, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
end
else
if copy_paste='v' then
begin
keybd_event(VK_SHIFT, 0, 0, 0);
keybd_event(VK_INSERT, 0, 0, 0);
keybd_event(VK_INSERT, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
EmptyClipboard;
end;
end;
ftn1361
یک شنبه 18 مهر 1389, 19:56 عصر
اگر برنامه شما به درستی همه داده های موجوذ را select کرده باشد کد زیر را جایگزین کد قبلی خودتان قرار بدید.
procedure CopyPaste(copy_paste:char);
با تشکر اما نمیدانم چرا دکمه های کنترل و اینسرت برای کپی کردن متن هایلایت شده (که قبلا با کلیک ماوس انتخاب شده) و برای Paste کردن دکمه های شیفت و اینسرت را فشار داده اید؟ ضمنا این پروسیجر را هم نوشتم اما اصلا کپی و Paste انجام نمی شد. پس از اجرای برنامه ابتدا bitbtn1 زده می شود که متنی در کلیپبورد کپی میشود و به برنامه دیگر (IE) وارد شده و دکمه اینتر در آن برنامه زده می شود تا اطلاعاتی نمایش داده شودسپس bitbtn2 فشار داده می شود که در تاریخ ظاهر شده در IE روز را کپی میکند و در Edit داخل برنامه خودم Paste میکند مشکل من اینجاست که Paste زودتر از کپی انجام می شود
tdkhakpur
یک شنبه 18 مهر 1389, 21:17 عصر
اما نمیدانم چرا دکمه های کنترل و اینسرت برای کپی کردن متن هایلایت شده (که قبلا با کلیک ماوس انتخاب شده) و برای Paste کردن دکمه های شیفت و اینسرت را فشار داده اید؟
فرقی نداره سیستم عامل از هر دو پشتیبانی میکنه.
ببینید مشکل اصلی شما هایلات شدن داده هاست والا برنامه هیچ مشکلی نداره.
ftn1361
یک شنبه 18 مهر 1389, 22:09 عصر
فرقی نداره سیستم عامل از هر دو پشتیبانی میکنه.
ببینید مشکل اصلی شما هایلات شدن داده هاست والا برنامه هیچ مشکلی نداره.
ببخشید اما اگر این برنامه های ضمیمه شده را ببینید دقیقا متوجه می شوید که مشکل من چیست؟ فرض کنید که برنامه IEProject همان پورتالی است که من می خواهم ازآن اطلاعات دریافت کنم و برنامه Project1 همان برنامه نوشته شده برای دریافت اطلاعات است ضمنا Resolution باید روی 1024 * 1280 باشد تا برنامه صحیح عمل کند شما به ترتیب زیر عمل کنید
1-هردوبرنامه را اجرا کنید
2-در برنامه Project1 دکمه ریختن شماره را کلیک کنید
3-در برنامه Project1 دکمه مشخصات را کلیک کنید
مشاهده میکنید که در کادر جلوی روز شماره ای که قبلا در کلیپبورد کپی شده بود Paste میشود اما وقتی خودتان در کادر دیگری عمل Paste را انجام میدهید رقم 18 paste میشود درحالیکه اگر متن برنامه را بخوانید عمل کپی قبل از paste بوده است
ftn1361
یک شنبه 18 مهر 1389, 23:06 عصر
فرقی نداره سیستم عامل از هر دو پشتیبانی میکنه.
ببینید مشکل اصلی شما هایلات شدن داده هاست والا برنامه هیچ مشکلی نداره.
برنامه شما را هم نگاه کردم اگر نوشته های من را به دقت از ابتدا خوانده باشید متوجه میشوید که هایلایت کردن را در برنامه دیگر با موفقیت انجام داده ام و حتی یکبار هم یک نوشته را در برنامه دیگر paste کرده ام و در انتها متن مورد نظر را در برنامه دیگر انتخاب و کپی کرده ام از برنامه ای که فرستاده بودید مشخص است که از ابتدا حرف مرا متوجه نشده اید:گریه:
tdkhakpur
یک شنبه 18 مهر 1389, 23:14 عصر
از برنامه ای که فرستاده بودید مشخص است که از ابتدا حرف مرا متوجه نشده اید
اون نمونه هست نه کاری که شما میخوایید انجام بدید.
در اصل این کار شما به به نوعی میتواند کرکر باشه تا داده های متوالی را برای گشودن رمزهای پرتال مورد استفاده قرار بگیرد.
برنامه ارسالی شما را تست کردم ایرادی نداره همه چی درسته.
ftn1361
یک شنبه 18 مهر 1389, 23:33 عصر
اون نمونه هست نه کاری که شما میخوایید انجام بدید.
در اصل این کار شما به به نوعی میتواند کرکر باشه تا داده های متوالی را برای گشودن رمزهای پرتال مورد استفاده قرار بگیرد.
برنامه ارسالی شما را تست کردم ایرادی نداره همه چی درسته.
ایراد من این است که روز مورد نظر که همان 18 است در برنامه project1 در کادر مقابل روز paste نمیشود و عدد 5678/1234 paste میشود در همینجا پروژه من متوقف شده است چون کارهای دیگری میخواهم روی روز نمایش داده شده در کادر مقابل روز انجام دهم راستی الان که سورس برنامه ای که فرستاده بودم را چک کردم متوجه شدم که در کلیک روی BitBTN2 دوخط آخر را میخواستم در ابتدای کلیک روی BITBTN1 بنویسم چون عجله ای یک نمونه برنامه نوشتم اشتباه کردم خودتان این کار را بکنید
tdkhakpur
دوشنبه 19 مهر 1389, 01:49 صبح
ایراد من این است که روز مورد نظر که همان 18 است در برنامه project1 در کادر مقابل روز paste نمیشود و عدد 5678/1234 paste میشود در همینجا پروژه من متوقف شده است چون کارهای دیگری میخواهم روی روز نمایش داده شده در کادر مقابل روز انجام دهم
ببینید اگر مشکتان را واضحتر ارسال میکرید شاید به جای ارسال این مطلب جواب گرفته بودید.
شما 18 را میخواهید از کجا گیر بیارید اگر منظورتان کادری هست که بعد از کلیک روی btn1 در کادر پرتال ظاهر میشود مشکلتان فقط انتقال صیحیح کرسر رو محل قرار گیری دیتا هست.
ولی اگر منظورتان چیز دیگری هست برنامه دقیقا همان چیزی را به کلیپبرد میبرد که شما بهش کد میدید.
ftn1361
دوشنبه 19 مهر 1389, 08:24 صبح
ببینید اگر مشکتان را واضحتر ارسال میکرید شاید به جای ارسال این مطلب جواب گرفته بودید.
شما 18 را میخواهید از کجا گیر بیارید اگر منظورتان کادری هست که بعد از کلیک روی btn1 در کادر پرتال ظاهر میشود مشکلتان فقط انتقال صیحیح کرسر رو محل قرار گیری دیتا هست.
ولی اگر منظورتان چیز دیگری هست برنامه دقیقا همان چیزی را به کلیپبرد میبرد که شما بهش کد میدید.
واقعا از پیگیریهای شما متشکرم اما من در صفحه اول هم روال کار و هم مشکل اصلی را گفته ام یکبار دیگر هم تکرار می کنم (18 هم منظور تاریخ روز است که از 18/7/89 باید رقم 18 کپی شود اما در نمونه برنامه ای که نوشته ام همان 5678/1234 در DDEdit ، ازکلیپبورد Paste میشود درحالیکه قبل از آن هم کلیپبورد را خالی کرده ام هم تاریخ روز را در حافظه کپی کرده ام) روال کار هم به این صورت است که میخواهم در برنامه ای که نوشته ام از پورتال داخل اینترنت اکسپلورر با کمک کلیک ماوس و صفحه کلید(به روش برنامه نویسی) اطلاعاتی دریافت کنم و دربرنامه ام روی آن کار کنم (البته شاید روشهای دیگری هم باشند که من با آنها آشنا نیستم و همان کلیک و صفحه کلید را انتخاب کرده ام :
1- در برنامه من روی دکمه ریختن شماره کلیک می کنیم و آ)شماره ای که در Edit برنامه من است (در نمونه برنامه ارسالی رقم 5678/1234میباشد) در کلیپبورد کپی شده ب)و با هدایت ماوس(به روش برنامه نویسی) قسمتی از پورتال که آماده دریافت شماره میباشد فعال میشود پ) و با صفحه کلید (به روش برنامه نویسی) متن داخل کلیپبورد در پورتال Paste میشود و ت) کلید اینتر فشرده میشود تا اطلاعات مربوط به آن شماره در پورتال نمایش داده شود (البته قبل از آن پیغامی ظاهر میشود و با کلیک روی آن اطلاعات نمایش داده میشود)
2- سپس روی دکمه مشخصات (در برنامه من) کلیک می کنیم و آ) ابتدا به روش برنامه نویسی ماوس روی پیغامی که داده شده است میرود و کلیک میکند و ب) ماوس روی تاریخ ظاهر شده در پورتال هدایت میشود و پ)روی رقم روز (که درنمونه برنامه 18است) دوبار کلیک میکند تا هایلایت شود و ت) آنرا توسط صفحه کلید (به روش برنامه نویسی) در حافظه کپی میکنیم (که تا اینجا مشکلی وجود ندارد و همگی انجام می شود)و ث) در برنامه من در کادر روز Paste میکنیم که در اینجا به جای روز که جدیدا در حافظه ریخته شده رقم قبلی Paste میشود یعنی این مرحله زودتر از مراحل دیگر اجرا میشود (البته اگر به صورت دستی عمل Paste را انجام دهیم رقم مربوط به روز Paste میشود)
tdkhakpur
دوشنبه 19 مهر 1389, 12:06 عصر
دوست گرامی من که گفتم از api استفاده میکنید یا نه!!
در حالت کلی استفاده از کلیپبورد برای زنجیره ای از کارها باید صورت بگیرد و شما باید صراحتا اعلام کنید که دارید با کدام کلیپبورد کار میکنید ولی کدهای شما در حالت عادی به کلیپبود جاری اشاره میکنه در صورتی که شما در انتها تقاضای داده های کلیپبورد DDEdit میکنید که این داده ها فقط برای فرمی که ساخته اید هست نه پرتال.
برای این منظور شما باید همین کار paste را برای فرم خودتان هم مانند پرتال انجام بدید تا از داده های همان کلیپبوردی استفاده شود که پرتال ازش استفاده میبرد.
پس کد btn2 شما باید به این شکل تغییر بکند.
var
p : TPoint;
begin
DDEdit.Clear;
// MouseClick(490,300,'L');
MouseClick(490,300,'D');
CopyPaste('C');
p.x := DDEdit.ClientRect.Left;
p.y := DDEdit.ClientRect.Top;
p := ClientToScreen(p);
MouseClick(p.x+10,p.y+40,'L');
CopyPaste('V');
end;
در ضمن قسمت قرمز شده را حذف کنید این کار باعث میشود رویداد دابل کلیک عملی نشود و یک رویداد جدید اتفاق بیفتد.
tdkhakpur
دوشنبه 19 مهر 1389, 14:37 عصر
ضمنا مختصات ادیت پرتال در کد بالا تغییر داده شده با توجه به مختصات خودتان اصلاح کنید.
ftn1361
دوشنبه 19 مهر 1389, 22:45 عصر
دوست گرامی من که گفتم از api استفاده میکنید یا نه!!
در حالت کلی استفاده از کلیپبورد برای زنجیره ای از کارها باید صورت بگیرد و شما باید صراحتا اعلام کنید که دارید با کدام کلیپبورد کار میکنید ولی کدهای شما در حالت عادی به کلیپبود جاری اشاره میکنه در صورتی که شما در انتها تقاضای داده های کلیپبورد DDEdit میکنید که این داده ها فقط برای فرمی که ساخته اید هست نه پرتال.
برای این منظور شما باید همین کار paste را برای فرم خودتان هم مانند پرتال انجام بدید تا از داده های همان کلیپبوردی استفاده شود که پرتال ازش استفاده میبرد.
ببخشید من دقیقا با کلیپبورد آشنا نیستم شاید مشکلم واقعا از این راه حل شود لطفا مرا در موارد زیر راهنمایی کنید :
1- چند کلیپبورد وجود دارد؟
2- کلیپبورد DDEdit با کلیپبورد ویندوز و کلیپبورد داخل پورتال مورد نظرم چه تفاوتی دارد؟
3- رابطه کلیپبورد با مختصاتهایی که مشخص کرده اید چیست؟ (چون تمام مختصاتها مشخص هستند و نیازی به به دست آوردنشان نیست اما شاید رابطه ای با کلیپبورد داشته باشد که من متوجه نمیشوم)
ftn1361
دوشنبه 19 مهر 1389, 22:56 عصر
در ضمن قسمت قرمز شده را حذف کنید این کار باعث میشود رویداد دابل کلیک عملی نشود و یک رویداد جدید اتفاق بیفتد.
در پورتال اصلی در اینترنت اکسپلورر برای هایلایت کردن متن مورد نظرم نیاز به سه بار کلیک دارم که البته میخواهم جای آنرا با فشردن دکمه کنترل و کلیک عوض کنم لازم به ذکر است که پورتالی که فرستادم فرضی است و برای مثال فرستادم
ضمنا از آنجایی که بررسی کردم و دیدم بعد از 3بارکلیک روی BitBtn2 متن مورد نظرم (در پورتال) در DDEdit ظاهر میشود موقتا روش غیراستانداردی را ابداع کردم به اینصورت که شمارنده سراسری تعریف کردم با مقدار 0 که با هربار کلیک روی BitBtn2 یک رقم به آن اضافه میشود و بعد از 3 بار متن در DDEdit ریخته میشود اما فقط برای این است که کارم راه بیافتد و به دنبال راه بهتری هستم لازم به ذکر است که این 3 کلیک هم حتما باید با دست باشد و به صورت برنامه نویسی کار نمیکند
tdkhakpur
سه شنبه 20 مهر 1389, 08:11 صبح
1- چند کلیپبورد وجود دارد؟
انواع مختلفی از نظر فرمت وجود داره مثل bitmap و text, ...
2- کلیپبورد DDEdit با کلیپبورد ویندوز و کلیپبورد داخل پورتال مورد نظرم چه تفاوتی دارد؟
تفاوت نداره فقط مسئله اصلی محل نگهداری هست وقتی شما بوسیله کد محتوای edit را داخل کلبپبور میبرید این امر باعث میشه شما از طریق نرم افزار یک حلقه به زنجیره کیلپبور اضافه کنید و داده ها در این حلقه قرار بگیرند و برای دسترسی به داده ها به هندل حلقه احتیاج دارید در صورتی که شما وقتی بوسیله صفحه کلید این عمل را انجام بدید داده ها داخل حلقه ای از کلیپبور می روند که جایش معلوم نیست.
3- رابطه کلیپبورد با مختصاتهایی که مشخص کرده اید چیست؟ (چون تمام مختصاتها مشخص هستند و نیازی به به دست آوردنشان نیست اما شاید رابطه ای با کلیپبورد داشته باشد که من متوجه نمیشوم)
نه من کارت گرافیکیم رزولیشنی را که شما استفاده میکنید نداره به همین خاطر مختصات رو تغییر دادم.
ftn1361
سه شنبه 20 مهر 1389, 12:20 عصر
تفاوت نداره فقط مسئله اصلی محل نگهداری هست وقتی شما بوسیله کد محتوای edit را داخل کلبپبور میبرید این امر باعث میشه شما از طریق نرم افزار یک حلقه به زنجیره کیلپبور اضافه کنید و داده ها در این حلقه قرار بگیرند و برای دسترسی به داده ها به هندل حلقه احتیاج دارید در صورتی که شما وقتی بوسیله صفحه کلید این عمل را انجام بدید داده ها داخل حلقه ای از کلیپبور می روند که جایش معلوم نیست.
ممنون تقریبا دارم به جوابم میرسم اما
1- اگر نخواهم بوسیله صفحه کلید متن هایلایت شده در برنامه دیگر (پورتال داخل اینترنت اکسپلورر) را به کلیپبورد بفرستم پس چگونه باید اینکار را بکنم؟ (البته لازم به ذکر است با FindWindow و توابع مشابه نمیتوان به هندلهای آن برنامه دسترسی پیدا کرد)
2- چگونه باید متن مورد نظرم را به مکان خاصی از کلیپبورد هدایت کنم و همچنین از همان مکان بازیافت کنم؟ (البته کلماتی مثل کلیپبورد و clipboard را جستجو کردم موارد زیادی هم یافت شد اما هیچیک موضوع مورد نظرم را نداشت)
3- اگر میشود بیشتر در مورد برنامه آخر که نوشتید توضیح دهید چون به نظر فقط با point ماوس را هدایت میکند و با مکان کلیپبورد کاری ندارد که مختصات مورد نظر دقیقا مشخص است و نیازی به استفاده از Point نمیبینم
tdkhakpur
سه شنبه 20 مهر 1389, 19:44 عصر
1- اگر نخواهم بوسیله صفحه کلید متن هایلایت شده در برنامه دیگر (پورتال داخل اینترنت اکسپلورر) را به کلیپبورد بفرستم پس چگونه باید اینکار را بکنم؟ (البته لازم به ذکر است با FindWindow و توابع مشابه نمیتوان به هندلهای آن برنامه دسترسی پیدا کرد)
خب رابط api برای این کار وجود نداره اگر به مشخصات رابط نگاه کنید میبینید که از شما هندل میخاد.
همین راهی که استفاده میکنید راه مناسب و صددرصد عملی هست و هیچ چی نمیتونه جلوشو بگیره.
2- چگونه باید متن مورد نظرم را به مکان خاصی از کلیپبورد هدایت کنم و همچنین از همان مکان بازیافت کنم؟ (البته کلماتی مثل کلیپبورد و clipboard را جستجو کردم موارد زیادی هم یافت شد اما هیچیک موضوع مورد نظرم را نداشت)
مکان خاص وجود ندارد شما میتونید هندل پنجره را بدیدو به کلیپبورد دسترسی پیدا کنید وقتی کلیپبورد توسط api باز میشه همیشه هندل پنجره از شما خواسته میشه و پنجره همان محل کلیپبورد در زنجیره هست.
3- اگر میشود بیشتر در مورد برنامه آخر که نوشتید توضیح دهید چون به نظر فقط با point ماوس را هدایت میکند و با مکان کلیپبورد کاری ندارد که مختصات مورد نظر دقیقا مشخص است و نیازی به استفاده از Point نمیبینم
خب اگر شما بخواهید دستی با ماوس کار کنید احتیاج به کیبورد ندارید یعنی میرید روی edit و روش عمل paste را انجام میدید برنامه هم همین کار دستی شما رو انجام داده یهنی میره روی edit و سپس paste میکنه.
ftn1361
سه شنبه 20 مهر 1389, 21:34 عصر
مکان خاص وجود ندارد شما میتونید هندل پنجره را بدیدو به کلیپبورد دسترسی پیدا کنید وقتی کلیپبورد توسط api باز میشه همیشه هندل پنجره از شما خواسته میشه و پنجره همان محل کلیپبورد در زنجیره هست.
.
اگر هندل پنجره های مورد نظر من به ترتیب (Portal - windows internet explorer) و (MainForm) باشد میتوانید قطعه برنامه ای بنویسید که یک متن هایلایت شده در برنامه (Portal - windows internet explorer) در کلیپبورد بریزد و توسط هندل پنجره ، داخل MainForm ، (یعنی برنامه نوشته شده توسط من) Paste کند؟
tdkhakpur
چهارشنبه 21 مهر 1389, 13:45 عصر
میتوانید قطعه برنامه ای بنویسید که یک متن هایلایت شده در برنامه (Portal - windows internet explorer) در کلیپبورد بریزد و توسط هندل پنجره ، داخل MainForm ، (یعنی برنامه نوشته شده توسط من) Paste کند؟
چرا نمیشه!
فقط من کد اصلی رو میفرستم شما استفاده کنید.
دو تابع زیر داده موجود در یک پنجره را داخل کیپبورد میبره و سپس میتوانید با تابع دیگر بازیابی کنید.
function StrFromClipboard(hwnd:UINT): WideString;
var
li_Format: array[0..1] of Integer;
li_Text: Integer;
lh_Clip, lh_Data: THandle;
lp_Clip, lp_Data: Pointer;
begin
Result := '';
li_Format[0] := CF_TEXT;
li_Text := GetPriorityClipboardFormat(li_Format, 1);
if (li_Text > 0) then begin
if (OpenClipboard(hwnd)) then begin
lh_Clip := GetClipboardData(li_Text);
if (lh_Clip <> 0) then begin
lh_Data := 0;
if (GlobalFlags(lh_Clip) <> GMEM_INVALID_HANDLE) then
begin
if (li_Text = CF_TEXT) then begin
lh_Data := GlobalAlloc(GHND or GMEM_SHARE, GlobalSize(lh_Clip));
lp_Clip := GlobalLock(lh_Clip);
lp_Data := GlobalLock(lh_Data);
lstrcpy(lp_Data, lp_Clip);
Result := AnsiString(PAnsiChar(lp_Data));
GlobalUnlock(lh_Data);
GlobalFree(lh_Data);
GlobalUnlock(lh_Clip); //GlobalFree????????
end;
if (lh_Data <> 0) then GlobalUnlock(lh_Data);
CloseClipboard;
end;
end;
end;
end;
end;
procedure StrToClipboard(hwnd:UINT; const sWText: WideString);
var
li_WLen, li_Len: Integer;
ls_Text: AnsiString;
lh_Mem: THandle;
lp_Data: Pointer;
begin
li_WLen := Length(sWText) * 2 + 2;
ls_Text := AnsiString(sWText);
li_Len := Length(ls_Text) + 1;
if (sWText <> '') then begin
if (OpenClipboard(hwnd)) then
begin
EmptyClipboard;
//CF_TEXT
lh_Mem := GlobalAlloc(GHND or GMEM_SHARE, li_Len);
lp_Data := GlobalLock(lh_Mem);
lstrcpy(lp_Data, PAnsiChar(ls_Text));
GlobalUnlock(lh_Mem);
SetClipboardData(CF_TEXT, lh_Mem);
CloseClipboard;
end;
end;
end;
مثال
// ذخیره
StrToClipboard(Handle, 'tdkhakpur');
بازیابی
ShowMessage(StrFromClipboard(Handle));
ftn1361
دوشنبه 26 مهر 1389, 07:28 صبح
procedure StrToClipboard(hwnd:UINT; const sWText: WideString);
[/code]
مثال
// ذخیره
StrToClipboard(Handle, 'tdkhakpur');
بازیابی
ShowMessage(StrFromClipboard(Handle));
با تشکر از زحمتی که کشیدید و برنامه ای که نوشتید اما در پروسیجر StrToClipboard مشکل من این است که متن هایلایت شده که متن مشخصی نیست را می خواهم به نقطه مشخصی از کلیپبورد بفرستم و همچنین هندل مربوط به Edit آن پنجره را نمیتوانم بیابم (چون برنامه ای در اینترنت اکسپلورر است) و فقط هندل پنجره آنرا دارم اما شما طوری نوشتید که متن مشخصی در sWText بنشیند
tdkhakpur
دوشنبه 26 مهر 1389, 11:00 صبح
اما در پروسیجر StrToClipboard مشکل من این است که متن هایلایت شده که متن مشخصی نیست را می خواهم به نقطه مشخصی از کلیپبورد بفرستم و همچنین هندل مربوط به Edit آن پنجره را نمیتوانم بیابم (چون برنامه ای در اینترنت اکسپلورر است) و فقط هندل پنجره آنرا دارم اما شما طوری نوشتید که متن مشخصی در sWText بنشیند
ببینید خب شما برنامه اصلی رو نوشتید با StrToClipboard دیتا رو وارد کلبپبورد کنید و با event داده ها رو داخل ادیتهای اینترنت اکسپلورر ببرید
شما تست کنید کاری که انجام میدید نیاز به چیز دیگه ای نداره مراحل زیر رو انجام بدید.
1 - داخل برنامه ای که میخواهید داده را به اکسپلورر بفرستید توسط StrToClipboard داده را به کلیپبورد ارسال کنید مثلا
StrToClipboard (0, 'hi i am demo text')
2 - توسط event ماوس و کیبورد به محل ادیت در اکسبلورر برید و داده ها را پیست کنید مانند
MouseClick(x,y,'L');
MouseClick(x,y,'D');
CopyPaste('V');
keybd_event(ord(13),0,0,0);
مراحل بعد هم که خودتان دارید کپی دیتا از محل و دریافت آن در برنامه جاری البته با استفاده از api
ftn1361
دوشنبه 26 مهر 1389, 11:17 صبح
ببینید خب شما برنامه اصلی رو نوشتید با StrToClipboard دیتا رو وارد کلبپبورد کنید و با event داده ها رو داخل ادیتهای اینترنت اکسپلورر ببرید
شما تست کنید کاری که انجام میدید نیاز به چیز دیگه ای نداره مراحل زیر رو انجام بدید.
1 - داخل برنامه ای که میخواهید داده را به اکسپلورر بفرستید توسط StrToClipboard داده را به کلیپبورد ارسال کنید مثلا
StrToClipboard (0, 'hi i am demo text')
2 - توسط event ماوس و کیبورد به محل ادیت در اکسبلورر برید و داده ها را پیست کنید مانند
MouseClick(x,y,'L');
MouseClick(x,y,'D');
CopyPaste('V');
keybd_event(ord(13),0,0,0);
مراحل بعد هم که خودتان دارید کپی دیتا از محل و دریافت آن در برنامه جاری البته با استفاده از api
من می خواهم داده را از اکسپلورر دریافت کنم و در برنامه ام وارد کنم شما برعکس برداشت کردید طبق همان برنامه ای که قبلا فرستادم در ارسال داده به اکسپلورر هیچ مشکلی ندارم فقط در دریافت مشکل دارم یعنی وقتی یک عدد به اکسپلورر میفرستم و دکمه داخل اکسپلورر را کلیک می کنم برای من اطلاعاتی نمایش داده می شود که آن اطلاعات را می خواهم وارد برنامه ام کنم این روند را چندین بار از ابتدای تایپیک تکرار کرده ام اما شما روی قسمت اول فقط توضیح می دهید که در آن قسمت من هیچگونه مشکلی ندارم
tdkhakpur
چهارشنبه 28 مهر 1389, 12:18 عصر
اما شما روی قسمت اول فقط توضیح می دهید که در آن قسمت من هیچگونه مشکلی ندارم
نمیدونم ولی مشکلی وجود نداره و برای من همه چی درسته!
شما برنامتان را برای رزولیشن 800*600 کد کرده و ارسال کنید تا اصلا شده و ارسال بشه.
ftn1361
دوشنبه 03 آبان 1389, 11:45 صبح
نمیدونم ولی مشکلی وجود نداره و برای من همه چی درسته!
شما برنامتان را برای رزولیشن 800*600 کد کرده و ارسال کنید تا اصلا شده و ارسال بشه.
هرچند اطمینان دارم اصل مشکل من را هنوز درک نکرده اید ولی در هر صورت متشکرم ، خودم در سایتهای انگلیسی گشتم و راه حل را یافتم و اکنون مشکلم برطرف شد و برنامه را کامل کردم. این دومین سوالی بود که در طول عضویتم در این سایت کردم و هیچکدام به پاسخ نرسیدند. البته دلیل بر این نمی شود که این سایت سایت خوبی نیست بلکه موارد بسیار مفیدی هم داخل آن یافته ام که مشکلات من را برطرف کرده است و از مسئول آن بسیار متشکرم اما از این ناراحتم که چرا سوال ها با دقت خوانده نمی شوند که پاسخ صحیح داده شوندو اعضا فقط به دنبال این هستند که خیلی سریعتر از دیگران پاسخ بدهند و مسلما سرعت همیشه دقت را کاهش می دهد.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.