PDA

View Full Version : past کردن در برنامه دیگر



toopak
چهارشنبه 03 تیر 1388, 17:23 عصر
سلام خدمت اساتید محترم
یه سوال از خدمتون دارم
میخوام ببینم چطوری میتونم یک متن رو در یک برنامه دیگه پیست کنم

با استفاده از کد
Clipboard.SetText(TextBox1.Text)

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

Ali_Mor
چهارشنبه 03 تیر 1388, 21:44 عصر
سلام
با Clipboard.GetText میتونی متنی رو که در کلیپ برد گذاشتی ، Paste کنی.
(امیدورام منظورت درست فهمیده باشم)

toopak
پنج شنبه 04 تیر 1388, 02:49 صبح
نه منظورم اینه که از برنامه ما به یه برنامه دیگه پیست بشه
مثلا به یه notepad
یه چیز تو مایه های Qsmile اگر دیده باشید
مثلا روی یکی از شکلک ها کلیک میکردین و اون شکلک میومد توی قسمت ویرایشگر وبلاگ یا سایت پیست میشد

shamsoft
پنج شنبه 04 تیر 1388, 11:12 صبح
خود .Net کلاسی برای ارتباط با برنامه های دیگه نداره! (یعنی من که ندیدم) برای این کار باید از توابع API استفاده کنید که نمونه کد زیر، عملیات Paste رو برای Notepad انجام میده. برای برنامه های دیگه هم باید هندل برنامه و جایی که قراره عملیات Paste انجام بشه رو پیدا کنید. برای این کار هم می تونید از WinSpy++ (http://www.catch22.net/software/winspy) استفاده کنید


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

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim hwnd As Int32 = FindWindow("Notepad", Nothing)
If Not hwnd = 0 Then
hwnd = FindWindowEx(hwnd, 0, "edit", Nothing)
If Not hwnd = 0 Then
SendMessage(hwnd, WM_PASTE, 0, 0)
End If
End If

End Sub

toopak
پنج شنبه 04 تیر 1388, 13:25 عصر
خیلی ممنون
حالا یه مشکلی اینجا پیش میاد
اونم اینه که من که نمیدونم کاربر میخواد توی کدوم برنامه این کارو انجام بده!!!!
میشه یه کاری کرد که برنامه دستور past رو توی قسمت edit پنجره قبلی انجام بده؟
یعنی با یه کدی به قسمت ادیت پینجره قبل از برنامه دسترسی پیدا کنیم

shamsoft
پنج شنبه 04 تیر 1388, 13:42 عصر
اینجوری که کارتون سخت میشه. و اینکه لزوما قسمت edit تو همه برنامه ها وجود نداره. تنها راه اینه که بین برنامه های باز بگردید و برنامه مورد نظر کاربر رو پیدا کنید. یا اینکه یه چیزی مثل همین WinSpy بنویسید که کاربر خودش جایی که قراره عملیات Paste انجام بشه رو انتخاب کنه. یا اینکه دنبال یه تابعی باشید که zOrder برنامه های باز رو بتونه مشخص کنه و اونوقت شما باید zOrder-1 رو انتخاب کنید و ...
در کل کار همچین ساده ای نست و نسبت به کاری که قراره انجام بدید باید یه روش مناسب پیدا کنید!

rezapassword
جمعه 05 تیر 1388, 10:39 صبح
دوست عزیز میشه یه نمونه از این نوع برنامه بزاری ؟
منم خیلی احتیاج دارم

toopak
سه شنبه 09 تیر 1388, 20:44 عصر
ممنون ولی حالا من میخوام مثلا همین قسمت متن این صفحه انجمن رو پیدا کنم
اما با اون برنامه نمیشه
همه جای صفحه رو با یه کلاس نشون میده
چطوری میتونم به این قسمت دست پیدا کنم؟

sina_saravi1
چهارشنبه 19 اسفند 1388, 22:48 عصر
خود .Net کلاسی برای ارتباط با برنامه های دیگه نداره! (یعنی من که ندیدم) برای این کار باید از توابع API استفاده کنید که نمونه کد زیر، عملیات Paste رو برای Notepad انجام میده. برای برنامه های دیگه هم باید هندل برنامه و جایی که قراره عملیات Paste انجام بشه رو پیدا کنید. برای این کار هم می تونید از WinSpy++ (http://www.catch22.net/software/winspy) استفاده کنید


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

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim hwnd As Int32 = FindWindow("Notepad", Nothing)
If Not hwnd = 0 Then
hwnd = FindWindowEx(hwnd, 0, "edit", Nothing)
If Not hwnd = 0 Then
SendMessage(hwnd, WM_PASTE, 0, 0)
End If
End If

End Sub

سلام دوست عزیز
من میدونم که این تاپیک خیلی قدیمیه

ولی من به یه مشکل برخوردم که فکر کنم شما بتونید بهم کمک کنید

کد بالاتون خوب کار میکنه
ولی من با وین اسپای هم کلاس ها رو پیدا کردم و تغییرش دادم نتونستم به نتیجه برسم

درخواست من اینه که شما بیاید این کار رو برای یاهو مسنجر انجام بده

مثلا برای چت انفرادی بین دو نفر من بتونم متن رو به قسمت ورودی متن یاهو بفرسته
ولی از کلیپ برد استفاده نکنه
از یه متغییر استفاده کنه

من حسابی سر این قضیه گیج شدم:گیج:

shamsoft
پنج شنبه 20 اسفند 1388, 21:48 عصر
روی مسنجر 10 تست کردم

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

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim hwnd As Int32 = FindWindow("CConvWndBase", Nothing)
Clipboard.SetText("Hello!")
If Not hwnd = 0 Then
hwnd = FindWindowEx(hwnd, 0, "YIMInputWindow", Nothing)
If Not hwnd = 0 Then
SendMessage(hwnd, WM_PASTE, 0, 0)
End If
End If
End Sub

sina_saravi1
جمعه 21 اسفند 1388, 15:30 عصر
نمیشه در این کار از کلیپ برد استفاده نشه؟

shamsoft
جمعه 21 اسفند 1388, 15:52 عصر
نه. شاید روش دیگه هم باشه که بدون clipboard انجام بشه.

sina_saravi1
جمعه 21 اسفند 1388, 16:24 عصر
من یادمه که یه تابع داشتیم که میشد باهاش تکست هر کنترلی را عوض کرد

setwindwtext بود فکر کنم
دقیق یادم نمیاد

ولی با این تابع از API نمیشه؟

shamsoft
سه شنبه 25 اسفند 1388, 10:35 صبح
نه نمیشه! توی MSDN (http://msdn.microsoft.com/en-us/library/ms633546%28VS.85%29.aspx) نوشته:

The SetWindowText function changes the text of the specified window's title bar (if it has one). If the specified window is a control, the text of the control is changed. However, SetWindowText cannot change the text of a control in another application.شما با این API فقط متن Caption برنامه های دیگه رو می تونید تغییر بدید، نه متن کنترل های اونو. اما با این API می تونید متن کنترلهای برنامه خودتون رو عوض کنید. مثل کد زیر:


Private Declare Function SetWindowText Lib "user32.dll" Alias "SetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As String) As Boolean
.
.
SetWindowText(TextBox1.Handle, "This is SetWindowText API")

sina_saravi1
سه شنبه 25 اسفند 1388, 15:32 عصر
من اگه بخوام از طریق Sendmessage یه تکست فرمت دار مثل ریچ تکست رو براش بفرستم
نشون نمیده
باید بدون فرمت براش بفرستم

مشکل کار چیه؟

شاپرک
چهارشنبه 26 مرداد 1390, 10:41 صبح
خود .Net کلاسی برای ارتباط با برنامه های دیگه نداره! (یعنی من که ندیدم) برای این کار باید از توابع API استفاده کنید که نمونه کد زیر، عملیات Paste رو برای Notepad انجام میده. برای برنامه های دیگه هم باید هندل برنامه و جایی که قراره عملیات Paste انجام بشه رو پیدا کنید. برای این کار هم می تونید از WinSpy++ (http://www.catch22.net/software/winspy) استفاده کنید


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

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim hwnd As Int32 = FindWindow("Notepad", Nothing)
If Not hwnd = 0 Then
hwnd = FindWindowEx(hwnd, 0, "edit", Nothing)
If Not hwnd = 0 Then
SendMessage(hwnd, WM_PASTE, 0, 0)
End If
End If

End Sub

من دقيقا همين كار رو انجام ميدم Notepad باز ميشه ولي چيزي توش Paste نميشه!!! در صورتيكه با Sendkey درست كار ميكنه!
اشكال كار كجاست!؟

Behzad_MCP
چهارشنبه 26 مرداد 1390, 14:10 عصر
خود .Net کلاسی برای ارتباط با برنامه های دیگه نداره! (یعنی من که ندیدم) برای این کار باید از توابع API استفاده کنید که نمونه کد زیر، عملیات Paste رو برای Notepad انجام میده. برای برنامه های دیگه هم باید هندل برنامه و جایی که قراره عملیات Paste انجام بشه رو پیدا کنید. برای این کار هم می تونید از WinSpy++ (http://www.catch22.net/software/winspy) استفاده کنید


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

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim hwnd As Int32 = FindWindow("Notepad", Nothing)
If Not hwnd = 0 Then
hwnd = FindWindowEx(hwnd, 0, "edit", Nothing)
If Not hwnd = 0 Then
SendMessage(hwnd, WM_PASTE, 0, 0)
End If
End If

End Sub

با سلام دوستان فکر کردم اگه این مطلبو اینجا بگم بد نباشه
درباره اینکه .Net اتفاقا ابزار قوی برای فرستادن نه تنها یه تکست ساده بلکه هرچیزی که میخواهید مثل یک آبجکت به برنامه های دیگر را داره حتی اگه برنامه مقصد .Net نباشه همه این ازارها در System.Serialization قرار داره به طوری که شما به راحتی میتونید آبجکتتونو Selialize کنید و به برنامه های دیگر بفرستید با استفاده از BinaryFormater به برنامه های تحت .Net و با SoapFormater به برنامه های دیگه مثلا COM . حتی میتونید آبجکتو به xml تبدیل کنید و وای ببینید که چه کارهایی میتونید باهاش بکنید ... خیلی کار سختی نیست یه سر به MSDN بزنید

Behzad_MCP
چهارشنبه 26 مرداد 1390, 14:12 عصر
یه چیزی درباره استفاده از API ها : اصولا MicroSoft خیلی خوشش نمیاد برنامه نویس ها از Api های Windows استفاده کنند و همیشه و همه جا گفته برای هر کاری .Net یک ابزار قوی داره ، اگر نداشت برید سراغ API ها

شاپرک
چهارشنبه 26 مرداد 1390, 14:25 عصر
به نظر شما مشكل من با Serialization حل ميشه؟ تا برم دنبالش و ياد بگيرم!!؟؟

Behzad_MCP
چهارشنبه 26 مرداد 1390, 14:52 عصر
شاپرک جان میشه دقیقا مشکلتو برام پیغام خصوصی بفرستی