PDA

View Full Version : 2 تا سوال در باره موش موشک (mouse)



سعید قدیری مقدم
جمعه 20 تیر 1382, 16:31 عصر
سلام بر تمامی دوستان عزیز . من در باره موس با 2 مشکل مواجه شدم می خواستم ببینم از عزیزان کسی میتونه به من کمک کنه . :lol: ممنون میشم
مشکل اول من این هست که میخوام مختصات x و y موس تو Screen بدست بیارم البته داخل فرم ها با گزینه mouse_move میشه اما من میخوام اگر موس از روی فرم هم خارج شد باز بشه مختصاتش رو تو صفحه اصلی ویندوز فهمید

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

Ali_Mor
شنبه 21 تیر 1382, 09:51 صبح
با سلام
در مورد سوال اول می‌شود مختصات موس در فرم را با مختصات فرم(left,top فرم) جمع کرد تا مختصات موس در صفحه(screen) بدست آید.

سعید قدیری مقدم
شنبه 21 تیر 1382, 12:30 عصر
سلام
آقا علی دست شما درد نکنه اما اگر برم مخفی (hide) باشه یا موس از روی فرم خارج بشه دیگه نمیشه مختصاتش رو بدست آورد :(

Voldemort
دوشنبه 23 تیر 1382, 08:27 صبح
سعید قدیری مقدم عزیز دو راه برای گرفتن متن زیر ماوس دارید. البته این سوال را در فروم قدیمی سایت هم جواب داده ام بنابراین اینجا خلاصه تر می گویم.
راه اول با پیدا کردن هندل شی زیر ماوس و بدست آوردن متن درون آن. در وبلاگم بطور مفصل درباره بدست آوردن هندل زیر ماوس تویح داده ام می توانید به آدرس زیر مراجعه کنید.
http://vblog.persianblog.com
راه دوم که نرم افزار نارسیس از آن استفاده می کند استفاده از یک اکتیوایکس OCR است.به این شکل که تصویر زیر ماوس را برگردانده و سپس با استفاده از OCR آن را به متن تبدیل می کند.

سعید قدیری مقدم
دوشنبه 23 تیر 1382, 13:42 عصر
اقا Voldemort بابت راهنمایی شما ممنون اما نیشه مقداری در باره چگونگی استفاده از WindowFromPoint و FindWindow و FindWindowEx بیشتر توضیح بدید من این API ها رو به برنامه خودم اضافه کردم ولی تو استفادشون گیر کردم در حقیقت نمیتونم از متغییر های این توابع استفاده کنم
اما در کنار این توابع mouse_event هم بود من مقداری باهاش ور رفتم متوجه شدم که جواب سوال اول من در این تابع هست اما متاسفانه از این api هم نتونستم استفاده کنم میشه مقداری بیشتر من رو راهنمایی کنید
ممنون

سعید قدیری مقدم
دوشنبه 23 تیر 1382, 13:45 عصر
راستی یاددم رفت میخواستم بپرسم activeX برای OCR رو از کجا میتونم download کنم و یا اینکه اسم این activex چیه ؟ ممنون از راهنماییتون

Voldemort
دوشنبه 23 تیر 1382, 14:48 عصر
سعید عزیز این هم مثالی برای استفاده از WindowFromPoint


Private Type POINTAPI
X As Long
Y As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function ExtTextOut Lib "gdi32" Alias "ExtTextOutA" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal wOptions As Long, ByVal lpRect As Any, ByVal lpString As String, ByVal nCount As Long, lpDx As Long) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" (ByVal hdc As Long, ByVal lpsz As String, ByVal cbString As Long, lpSize As POINTAPI) As Long
Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
'KPD-Team 1998
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
Dim Pt As POINTAPI, mWnd As Long, WR As RECT, nDC As Long
Dim TextSize As POINTAPI, CX As Long, CY As Long
'Get the current cursor position
GetCursorPos Pt
'Get the window under the cursor
mWnd = WindowFromPoint(Pt.X, Pt.Y)
'Get the window's position
GetWindowRect mWnd, WR
'Get the window'zs device context
nDC = GetWindowDC(mWnd)
'Get the height and width of our text
GetTextExtentPoint32 nDC, "Hello !", Len("Hello !"), TextSize
For CX = 1 To WR.Right - WR.Left Step TextSize.X
For CY = 1 To WR.Bottom - WR.Top Step TextSize.Y
'Draw the text on the window
ExtTextOut nDC, CX, CY, 0, ByVal 0&, "Hello !", Len("Hello !"), ByVal 0&
Next
Next
End Sub
Private Sub Form_Paint()
Me.CurrentX = 0
Me.CurrentY = 0
Me.Print "Click on this form," + vbCrLf + "Hold the mouse button," + vbCrLf + "drag the mouse over another window," + vbCrLf + "release the mouse button" + vbCrLf + "and see what happens!"
End Sub

در ضمن در مورد پیدا کردن OCX می توانید از دوست عزیزم مهدی کمک بگیرید آدرس وبلاگش این است:
http://deldadehcrack.blogsky.com

Voldemort
دوشنبه 23 تیر 1382, 14:52 عصر
مثال زیر هم در استفاده از تابع Mouse_event به شما کمک می کند ولی باز هم می گویم برای گرفتن متن با استفاده از توابع بهتر است از تابع WindowFromPoint که در یک شی تایمر دائما صدا زده می شود استفاده کنید و سپس با استفاده از تابع GetWindowText و یا توابع دیگری که در این زمینه وجود دارند و یا حتی از پیغامهای مربوط به شی مورد نظرتان برای گرفتن متن استفاده کنید


'Before you start this program, I suggest you save everything that wasn't saved yet.
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Const MOUSEEVENTF_LEFTDOWN = &H2
Const MOUSEEVENTF_LEFTUP = &H4
Const MOUSEEVENTF_MIDDLEDOWN = &H20
Const MOUSEEVENTF_MIDDLEUP = &H40
Const MOUSEEVENTF_MOVE = &H1
Const MOUSEEVENTF_ABSOLUTE = &H8000
Const MOUSEEVENTF_RIGHTDOWN = &H8
Const MOUSEEVENTF_RIGHTUP = &H10
Private Sub Form_Activate()
'KPD-Team 1998
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
Do
'Simulate a mouseclick on the cursor's position
mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0&, 0&, cButt, dwEI
DoEvents
Loop
End Sub

Voldemort
دوشنبه 23 تیر 1382, 15:06 عصر
سعید عزیز ببخشید که اول سوال دومت را جواب دادم. جواب سوال اولت هم تابع ClientToScreen است که مختصات یک نقطه را در مقیاس Client به مختصات یک نقطه در مقیاس صفحه تبدیل می کند. مثالی از این تابع هم به این شکل است:


'This project needs 2 Buttons
Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long

Dim P As POINTAPI
Private Sub Form_Load()
'KPD-Team 1998
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net

Command1.Caption = "Screen Middle"
Command2.Caption = "Form Middle"
'API uses pixels
Me.ScaleMode = vbPixels
End Sub
Private Sub Command1_Click()
'Get information about the screen's width
P.x = GetDeviceCaps(Form1.hdc, 8) / 2
'Get information about the screen's height
P.y = GetDeviceCaps(Form1.hdc, 10) / 2
'Set the mouse cursor to the middle of the screen
ret& = SetCursorPos(P.x, P.y)
End Sub
Private Sub Command2_Click()
P.x = 0
P.y = 0
'Get information about the form's left and top
ret& = ClientToScreen&(Form1.hwnd, P)
P.x = P.x + Me.ScaleWidth / 2
P.y = P.y + Me.ScaleHeight / 2
'Set the cursor to the middle of the form
ret& = SetCursorPos&(P.x, P.y)
End Sub

سعید قدیری مقدم
دوشنبه 23 تیر 1382, 18:28 عصر
سلام Voldemort , بابت راهنمایی بسیار عالی شما متشکرم . دقیقا توانستم سوال اولم رو بکمک مثالهایی که نوشته بودید حل کنم اما در باره سوال دوم در مورد تابع GetWindowtext با مشکل مواجه شدم این تابع 3 متغییر دارد . متغییر اول که شماره هندل زیر موس است و با تابع WindowFromPoint بدست می آید اما متغییر دوم فکر میکنم متن زیر موس باشد ولی متغییر سوم :?: اگر یک لطف دیگه هم بکنید و چگونگی استفاده از تابع GetWindowtext رو هم بگین ممنون میشه :oops:
راستشو بخواهید من چگونگی استفاده از Api ها رو نمیدونم از طریق msdn هم نتونستم دقیقا روش استفادشون رو بفهمم . میخواستم ببینم آیا سایتی هست که روش استفاده از api رو در بیسیک (با کد های قابل اجرا در vb) رو داشته باشه .

باز هم ممنون از راهنمایی هاتون

سعید قدیری مقدم
سه شنبه 24 تیر 1382, 12:31 عصر
سلام .من موفق شدم با کمک تابع GetWindowText متن رو خارج کنم
[/quote]
Dim MyStr As String
MyStr = String(GetWindowTextLength(mWnd), Chr$(0))
GetWindowText mWnd, MyStr, Len(MyStr) + 1
Label1.Caption = MyStr
[/quote]

اما یک مشکل وجود داره و اون اینکه کلمه زیر موس بر گشت داده نمیشه بلکه از ابتدای متن متن رو برداشت میکنه ثانیا داخل خیلی از کنترل ها کار نمیکنه مثلا داخل textbox اگر متنی باشه نمیتونه اون رو بخونه بیشنر متن داخل button ها و titel پنچره ها رو میخونه در نهایت با این تابع من نتونستم کلمه زیر موس رو بدست بیارم . میشه من رو راهنمایی کنید ممنون :)

Voldemort
پنج شنبه 26 تیر 1382, 18:25 عصر
یک راه دیگر این است که با ابتدا کلاس شی زیر ماوس را بدست بیاورید و سپس با استفاده از ارسال پیغام مناسب به آن شی متن داخل آن را بدست بیاورید. این راه کاملتر از راه قبلی می باشد ولی پیچیده تر. در ضمن در مورد انتخاب فقط یک کلمه از کل متن بدست آمده باید متوسل به ترفندهای اختراعی خودتان بشوید. به همین راحتی که نارسیس نمی نویسند. در ضمن در مورد OCR فارسی یکی پیدا کردم که قیمتش 1800دلار است :!: اگر خواستی با من تماس بگیر تا آدرسش را بهت بدهم :wink:

Voldemort
پنج شنبه 26 تیر 1382, 18:37 عصر
راستی در مورد نحوه استفاده از API ها در VB اگر انگلیسی را خوب بلدیدی که باز هم از خود MSDN می توانید استفاده کنید ولی اگر اینطور نیست :!: می توانید از کتاب VB و توابع برنامه نویسی کاربردی از انتشارات شهید (بنفام) استفاده کنید. البته کتابهای دیگری هم هست

سعید قدیری مقدم
دوشنبه 30 تیر 1382, 20:21 عصر
سلام آقای Voldemort بابت راهنمایی شما ممنون :oops: واقعا شرمنده اما من منظور شما رو از ترفند های اختراعی نفهمیدم :( تا اونجا که عقلم میکشید فکر کردم اما به جایی نرسیدم در مورد اون 1800 دلار میخواستم بگم کرکش هم سراغ دارید :shock:
اما با این وجو د از کمک تون واقعا ممنون :o

Voldemort
پنج شنبه 02 مرداد 1382, 08:09 صبح
سعید عزیز در مورد راههای اختراعی منظورم این است که باید خودت راهی برای آن پیدا کنی مثلا اگر کلاس زیر ماوس از نوع TextBox بود و این TextBox چند خطی بود می توانی با استفاده از پیغامهای آن شماره خطی که ماوس روی آن قرار دارد را بدست آوری و سپس با توجه به مکان قرار گرفتن ماوس کلمه زیر آنرا پیدا کنی.
در مورد کراک آن OCR‌ شرمنده هنوز پول هیچ کراکری به خرید آن نرسیده تا بتواند آن را کراک کند.