PDA

View Full Version : سوال: عمل نکردن تابع sendkeys



aliman12
سه شنبه 23 خرداد 1391, 01:01 صبح
سلام !
من متنی را درون نوت پد نوشته ام و برنامه را اجرا کرده ام
کد زیر را درون یک تایمر با اینتروال 1 قرار داده ام
حال متن درون نوت پد را درگ میکنم
اما آن متن کات نمیشود


SendKeys "^x"

مشکل از کجاست؟

محسن واژدی
سه شنبه 23 خرداد 1391, 09:46 صبح
سلام
همانطور که مطلع هستید SendKeys تنها کلید را ارسال می کند، به عبارتی ابتدا بایستی فرم notepad فعال شود سپس همه محتویات انتخاب کنید (^A)، در نهایت از "^X" یا "^C" استفاده کنید
البته از کد زیر هم میتوانید استفاده کنید:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Const WM_GETTEXT As Long = &HD

Public Function GetNotepadText(ByVal sWindowTitle$) As String
On Error Resume Next
Dim lhwnd&
lhwnd& = FindWindow("Notepad", sWindowTitle$)
If lhwnd& > 0 Then
lhwnd& = FindWindowEx(lhwnd&, 0, "Edit", vbNullString)
sContents$ = String$(255, Chr(0))
SendMessage lhwnd&, WM_GETTEXT, Len(sContents$), ByVal sContents$
GetNotepadText = Left$(sContents$, InStr(1, sContents$, Chr(0)) - 1)
End If
End Function


برای مثال

Private Sub Command1_Click()
MsgBox GetNotepadText("Untitled - Notepad")
End Sub

موفق باشید

aliman12
سه شنبه 23 خرداد 1391, 10:13 صبح
پس چطور نرم افزارهایی مثل بابیلون این کار را انجام میدهند؟
در اون برنامه ها در هرجای ویندوز که متنی را سلکت کنید به درون برنامه وارد میشود
راز این کار چیست؟

just4froum
سه شنبه 23 خرداد 1391, 10:31 صبح
من خیلی وقته از بابیلون استفاده نکردم ولی تا اونجایی که یادمه شما وقتی متنی رو select میکردی دکمه خاصی رو فشار میدادی مثلا ctrl + RButton Mouse که برنامه میفهمید متنی انتخاب شده ولی کد بالای شما به طور متوالی دکمه های ctrl + x را فشار میده که همین موجب عمل نکردنش میشه.

aliman12
سه شنبه 23 خرداد 1391, 11:25 صبح
من خیلی وقته از بابیلون استفاده نکردم ولی تا اونجایی که یادمه شما وقتی متنی رو select میکردی دکمه خاصی رو فشار میدادی مثلا ctrl + RButton Mouse که برنامه میفهمید متنی انتخاب شده ولی کد بالای شما به طور متوالی دکمه های ctrl + x را فشار میده که همین موجب عمل نکردنش میشه.
خب همین مسئله اینجاست که اون چطور بعد از اینکه میفهمه متنی سلکت شده میتونه کپیش کنه به حافظه موقت؟
الان ما باید بدونیم که چطور تکستو کپی کنیم

محسن واژدی
سه شنبه 23 خرداد 1391, 15:45 عصر
پس چطور نرم افزارهایی مثل بابیلون این کار را انجام میدهند؟
در اون برنامه ها در هرجای ویندوز که متنی را سلکت کنید به درون برنامه وارد میشود
راز این کار چیست؟

باید از OCR استفاده کنید، ابتدا از محدوده ای که با موس کلیک شده (یا هر کلید میانبر دیگر) عکس میگیریم سپس با روش تبدیل تصویر به متن، متن را به دست می آوریم
کامپوننت زیر عملی مانند بابیلون انجام میدهد:
http://barnamenevis.org/attachment.php?attachmentid=28581&d=1235422282

موفق باشید

aliman12
سه شنبه 23 خرداد 1391, 16:12 عصر
باید از OCR استفاده کنید، ابتدا از محدوده ای که با موس کلیک شده (یا هر کلید میانبر دیگر) عکس میگیریم سپس با روش تبدیل تصویر به متن، متن را به دست می آوریم
کامپوننت زیر عملی مانند بابیلون انجام میدهد:
http://barnamenevis.org/attachment.php?attachmentid=28581&d=1235422282

موفق باشید
اوه منکه از دیدن این ترسیدم
خفن پیچیده بود. 6 تا dll اضافه کنم و کلی لاین سورس که فقط بتونم تکستو صید کنم؟ :گیج: اصلا نمیصرفه :ناراحت:
تازه اجرا هم نشد
با این حال که dll هاشو به لیست رفرنس ها اد کردم
بازم خطای cant create object رو میده !
یک روش ساده تر و روون تری برای انجام این کار وجود نداره؟
چون فکر نمیکنم بقیه نرم افزارها مثل بابیلون هم این کارو انجام بدن (کپچر از محدوده ماوس و ترنسلیت پیک به تکست)
بازم روشی که یوزر just4froum گفت عقلانی تر بود (همون که با هرکلیک چپ ماوس کلیدهای کنترل سی را سند کنیم) ولی چه فایده که این روش ناکارامده
شاید بشه یه کلک راحت بهش زد
یه راهی بگید که نرم و ملایم باشه واسه همه نه مثل این... :لبخند:

محسن واژدی
سه شنبه 23 خرداد 1391, 16:27 عصر
تازه اجرا هم نشد
با این حال که dll هاشو به لیست رفرنس ها اد کردم
بازم خطای cant create object رو میده !
دو فایل WCaptureX.dll و WMonitorX.dll را اول ریجستر کنید و یکبار پروژه را بسته و باز کنید

aliman12
سه شنبه 23 خرداد 1391, 16:41 عصر
اه اجرا شد و استارت کپچر زدم
هر چی تو نوت پد سلکت میکنم اتفاقی نمی افته
روش نرم و ملایم بلد نیستی؟
ممنونت میشم اگه یه روش ملایم بهم بگی :قلب:

just4froum
سه شنبه 23 خرداد 1391, 16:45 عصر
با اجازه استاد بزرگم جناب واژدی


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


ببین همونطور که گفتم توی این جور نرم افزار ها یه دکمه هست که وقتی متنی رو Select کردی و خواستی ترجمه کنی اونو میزنی یعنی متن انتخاب شده رو کپی و ترجمه کن.

مثل کد زیر شما متنی رو رنگی کن و موس رو روش نگه دار و سپس کلید ترکیبی کنترل و کلید وسط موس رو بزن متن رنگی شده کپی میشه.

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Private Sub Form_Load()
Timer1.Interval = 1
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
If GetAsyncKeyState(vbKeyMButton) <> 0 Then
If GetAsyncKeyState(vbKeyControl) = -32767 Then
SendKeys "^C"
End If
End If
End Sub

aliman12
سه شنبه 23 خرداد 1391, 16:58 عصر
حرف شما متین ولی من یک برنامه دیدم که با سی پلاس پلاس نوشته شده بود و کافی بود این قابلیتشو فعال میکردی بعد در هرجا که تکستیو رنگی میکردی بدون زدن هیچ کلید اضافه ای آن متن کپی میشد
بعد متوجه شدم آره متنو در کلیپبورد کپی میکنه
حالا اینکه چطوری بدون استفاده از کلید ترکیبی این کارو میکرد نمیدونیم ماها :گیج:
مثل اینکه ما پیرمردها دیگه نمیتونیم بفهمیم این برنامه نویسان تازه رو آمده چکار میکنند
هی جوانی کجایی
دیگه طوری شده که با 6 تا dll کلفت هم نمیتونیم این کارو بکنیم :لبخند: