PDA

View Full Version : اطلاعاتی در مورد تابع send message و اصلاح کد



m_vb1386
یک شنبه 28 بهمن 1386, 13:11 عصر
Private Const WM_COPY = &H301
Private Const WM_GETTEXT = &HD
Private Type POINTAPI
x As Long
y As Long
End Type

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Sub Timer1_Timer()
Dim pt As POINTAPI, wnd As Long
GetCursorPos pt
wnd = WindowFromPoint(pt.x, pt.y)
Dim pos As POINTAPI
Dim retval As Long
Dim retval2 As Long
Dim sp As String
retval = GetCursorPos(pos)
retval = WindowFromPoint(pos.x, pos.y)
retval2 = SendMessage(retval, WM_GETTEXT, 0, 0)
Form1.Caption = retval2
End Sub


چجوری با کد بالا مقادیری که تو یک تکس باکس هست رو بگیرم
من اطلاعاتی در موردWM_GETTEXT میخواهم نمیدونم چرا کد من جواب نمیده:متفکر:

مبین رنجبر
یک شنبه 28 بهمن 1386, 14:09 عصر
به جای استفاده از تابع SendMessage از تابع PostMessage استقاده کن چون SendMessage تابعی هست که Message هارو توی صف قرار میده و هروقت به اون Message ای که شما از برنامه خودتون ارسال گردید رسید اون Message رو ارسال میکنه که ممکنه خیلی طول بکشه تا یه پیغام اجرا بشه واسه همین شما از اجرای کد های برنامه تون باخبر نمیشین .. اما تابع PostMessage میاد اون پیغام رو مستقیم به گیرنده ارسال میکنه و اجراش میکنه .. با این کار شما میتونی نتیجه کار رو بعد ارسال پیغام مشاهده کنی

Nima_NF
یک شنبه 28 بهمن 1386, 15:06 عصر
علت ، استفاده اشتباه از تابع SendMessage برای WM_GETTEXT می باشد.
پارامتر سوم تعداد کارکتر ها می باشد و پارامتر چهارم رشته مورد نظر را برمی گرداند و نتیجه تابع نیز تعداد کارکتر های ریخته شده به رشته را بر میگرداند نه خود رشته را.
که شما دو پارامتر را اشتباها صفر قرار داده اید.

ضمنا طول رشته را می توانید قبل از آن با WM_GETTEXTLENGTH بدست بیاورید.




lResult = SendMessage((HWND) hWndControl, (UINT) WM_GETTEXT,
(WPARAM) wParam, (LPARAM) lParam );

m_vb1386
دوشنبه 29 بهمن 1386, 10:14 صبح
علت ، استفاده اشتباه از تابع SendMessage برای WM_GETTEXT می باشد.
پارامتر سوم تعداد کارکتر ها می باشد و پارامتر چهارم رشته مورد نظر را برمی گرداند و نتیجه تابع نیز تعداد کارکتر های ریخته شده به رشته را بر میگرداند نه خود رشته را.
که شما دو پارامتر را اشتباها صفر قرار داده اید.

ضمنا طول رشته را می توانید قبل از آن با WM_GETTEXTLENGTH بدست بیاورید.




lResult = SendMessage((HWND) hWndControl, (UINT) WM_GETTEXT,
(WPARAM) wParam, (LPARAM) lParam );



ممنون از راهنمایی که کردین بله حق با شماست

Mbt925
دوشنبه 29 بهمن 1386, 10:30 صبح
نمونه ای که می خواین ، در این مسیر کاملا توضیح داده شده:


http://barnamenevis.org/forum/showpost.php?p=441706&postcount=137

majjjj
سه شنبه 30 بهمن 1386, 08:32 صبح
نمونه ای که می خواین ، در این مسیر کاملا توضیح داده شده:


سلام
برنامه ای که شما گذاشتین در محیط برخی از برنامه ها از جمله Microsoft Word و Microsoft Access به خوبی جواب نمیده اما قبلا یک سورس از رومینا تو سایت پی سی ورد دیده بودم
که به نظرم در بعضی جاها کامل تره

majjjj
سه شنبه 30 بهمن 1386, 08:43 صبح
Private Const WM_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE

Private Type POINTAPI
x As Long
y As Long
End Type

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Sub Timer1_Timer()
Dim pt As POINTAPI, wnd As Long
GetCursorPos pt
wnd = WindowFromPoint(pt.x, pt.y)
Dim pos As POINTAPI
Dim retval As Long
Dim retval2 As Long
Dim lLength As Long
Dim strText As String
retval = GetCursorPos(pos)
retval = WindowFromPoint(pos.x, pos.y)
lLength = SendMessage(retval, WM_GETTEXTLENGTH, 0, ByVal 0&)
strText = Space$(lLength)
retval2 = SendMessage(retval, WM_GETTEXT, lLength + 1, ByVal strText)
Form1.Caption = retval2
Label1.Caption = Left$(strText, retval2)
End Sub


کد اصلاح شده بالا

m_vb1386
سه شنبه 30 بهمن 1386, 08:49 صبح
سروران گرامی برای ارسال متن به یک کنترل چجوری عمل کنم

anubis_ir
سه شنبه 30 بهمن 1386, 10:25 صبح
به جای استفاده از تابع SendMessage از تابع PostMessage استقاده کن چون SendMessage تابعی هست که Message هارو توی صف قرار میده و هروقت به اون Message ای که شما از برنامه خودتون ارسال گردید رسید اون Message رو ارسال میکنه که ممکنه خیلی طول بکشه تا یه پیغام اجرا بشه واسه همین شما از اجرای کد های برنامه تون باخبر نمیشین .. اما تابع PostMessage میاد اون پیغام رو مستقیم به گیرنده ارسال میکنه و اجراش میکنه .. با این کار شما میتونی نتیجه کار رو بعد ارسال پیغام مشاهده کنی

خیر.
تابع SendMessage دقیقا پیغام رو همون لحظه ارسال میکنه. تابع PostMessage پیغام‌ها رو در صف قرار میده. تابع PostMessage کارش رو به صورت asynchronous انجام میده و این باعث میشه که برنامه منتظر به پایان رسیدن کار تابع PostMessage نشود و به کارش ادامه دهد.
تابع SendMessage اینطور نیست و تا زمانیکه کارش به پایان نرسد برنامه کارش را نمی‌تواند ادامه دهد.
اگر برای مثال پلاگینی برای WINAMP بنویسید که از SendMessage استفاده میکنه، احتمالا قفل کردن کل برنامه زیاد است چون کار این تابع asynchronous نیست و ممکن است deadlock در ترد ایجاد کنه.

موفق باشید

majjjj
سه شنبه 30 بهمن 1386, 11:53 صبح
Private Const WM_SETTEXT = &HC


از این کد استفاده میشه

Mbt925
سه شنبه 30 بهمن 1386, 12:19 عصر
سلام
برنامه ای که شما گذاشتین در محیط برخی از برنامه ها از جمله Microsoft Word و Microsoft Access به خوبی جواب نمیده اما قبلا یک سورس از رومینا تو سایت پی سی ورد دیده بودم
که به نظرم در بعضی جاها کامل تره

اون روشی که توی اون نمونه استفاده شده ، برای بعضی نمونه ها نمی تونه جواب بده.

اگه پست زیره همون پست رو دیده بودین ، حرفه ای ترین نمونه در این زمینه رو می دیدید.

majjjj
سه شنبه 30 بهمن 1386, 13:18 عصر
اون روشی که توی اون نمونه استفاده شده ، برای بعضی نمونه ها نمی تونه جواب بده.

اگه پست زیره همون پست رو دیده بودین ، حرفه ای ترین نمونه در این زمینه رو می دیدید.
لطفا لینک مورد نظر را اینجا بگذارین
ممنون

Mbt925
سه شنبه 30 بهمن 1386, 13:35 عصر
طبق شناختی که دارم از شما پیدا می کنم ،
عاشق لینک های آماده این و شدیدا با هر گونه جستجو یا زحمت مخالفین دوست عزیز.


http://barnamenevis.org/forum/showpost.php?p=442452&postcount=139

majjjj
چهارشنبه 01 اسفند 1386, 08:20 صبح
سلام
این که عادت همه ایرانیها هست مگه شما ایرانیها رو نمیشناسید شاید هم تو ایران زندگی نمیکنید فکر کنم شما یک ابر رایانه هم دارین که همه رو پردازش میکنه؟
جدی نگیرید شوخی کردم
چیزی که گذاشته بودین رو قبلا دیده بودم اما این که فایل exe هست نه سورس
دی کامپایل فایلهای اجرایی هم که .....

__siavash__
چهارشنبه 01 اسفند 1386, 11:06 صبح
سلام
این که عادت همه ایرانیها هست مگه شما ایرانیها رو نمیشناسید شاید هم تو ایران زندگی نمیکنید فکر کنم شما یک ابر رایانه هم دارین که همه رو پردازش میکنه؟
جدی نگیرید شوخی کردم
چیزی که گذاشته بودین رو قبلا دیده بودم اما این که فایل exe هست نه سورس
دی کامپایل فایلهای اجرایی هم که .....
اون فایل EXE رو نصب کن بعد اکسترکت میشه و سورس ها به چند زبون تو پوشه Sample به All Programs اضافه میشه !

البته فکر کنم Demo باشه !!!

majjjj
پنج شنبه 02 اسفند 1386, 11:34 صبح
اون فایل EXE رو نصب کن بعد اکسترکت میشه و سورس ها به چند زبون تو پوشه Sample به All Programs اضافه میشه !

البته فکر کنم Demo باشه !!!

ممنون از راهنمایی که کردین از مدیریت بخش vb هم متشکرم
دوستان چرا نمیشه از تابع send message برای ارسال پیغام تو رومهای یاهو استفاده کرد

__siavash__
پنج شنبه 02 اسفند 1386, 14:40 عصر
ممنون از راهنمایی که کردین از مدیریت بخش vb هم متشکرم
دوستان چرا نمیشه از تابع send message برای ارسال پیغام تو رومهای یاهو استفاده کرد
شما پیام رو برای چه زیرپنجره ای ارسال میکنید ؟