PDA

View Full Version : سوال: فرستادن پارامتر بین دو فایل EXE به صورت آنلاین



mohammadreza_1382
دوشنبه 25 مرداد 1389, 19:38 عصر
با سلام خدمت شما دوستان
فرض کنید که ما دو برنامه exe داریم که با دات نت نوشتیم حالا می خواهیم هر عبارتیکه در Textbox در برنامه exe اول نوشتیم در Textbox برنامه exe دوم هم به ما نشون بده

توجه : ما نیاز داریم که برنامه در حالتیکه باز است آرگومان فرستاده شده را بخواند ! دستور زیر هنگامی کاربرد دارد که ما هر دفعه برنامه را مجددا باز کنیم اما ما این حالت را نمی خواهیم

Process.Start("filename",arguments)

Saman_12
دوشنبه 25 مرداد 1389, 20:07 عصر
سلام.
تا این جایی که من متوجه شدم :
شما می خواید نوشته موجود در تکست باکس یه برنامه دیگه رو بخونید درسته ؟
اگه درسته که کار زیادی نمی خواد باید از چندتا API استفاده کنید :لبخندساده: :
FindWindow
FindWindowEx
SendMessage
Or
GetText
و . . . . . . . .
اگه درسته بگید بیشتر توضیح بدم و اگر نیست خودتون بیشتر توضیح بدید.:متفکر:

mohammadreza_1382
دوشنبه 25 مرداد 1389, 20:21 عصر
بله همین رو می خوام یعنی هر وقت رویدادی رو فرا خونی کردم مقدار تکس باکس رو از برنامه دیگه بخونه
اگه ممکنه یه کم بیشتر توضیح بدین تا بقیش رو خودم پیدا کنم

Saman_12
دوشنبه 25 مرداد 1389, 21:09 عصر
خوب شما اول برای اینکه یک مقدار رو از یه برنامه دیگه بخونید باید هندل شئ رو توی برنامه مورد نظر بدونید.
برای پیدا کردن هندل یک شی باید هند پنجره ای که اون شئ روی اون قرار داره رو + نام کلاس شئ رو به API FinWindowEx بددید خوب قبل از این کار شما باید هندل اون پنجره رو بدست بیارید که راه های مختلفی داره میشه هندل پنجره فعال رو گرفت یه میشه هندل شئ یا پنجره زیر موس رو گرفت یا اینکه از طریق نام کلاس و یا عنوان اون پنجره هندل رو در یافت کرد.
خوب من یه روش رو توضیح میدم که با استفاده از عنوان یک پنجره ابتدا هندل اون پنجره بعد هم هند یکی از اشیاء موجود روی پنجره رو بدست بیاریم برای این کار ما از API Findwindow که هندل یک پنجره رو با استفاده از عنوانش بدست میاره استفاده میکنیم(می تونید از نام کلاس پنجره هم استفاده کنید.)و بعد با استفاده از API Sendmessage یا GetWindowText مقدار مو جود در عنوان اون شئ (که توی تکست باکس ها میشه همون تکستشون)بدست میاریم.
اول ما میایم و این API ها رو زیر Public Class دیکالر میکنیم (میشه همون تعریف کردن) :


Declare Function GetWindowTextLength Lib "user32.dll" Alias "GetWindowTextLengthA" (ByVal hWnd As Integer) As Integer
Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Integer, ByVal Msg As Integer, ByRef wParam As IntPtr, ByRef lParam As String) As Integer
Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hWnd As Integer, ByVal lpString As String, ByVal nMaxCount As Integer) As Integer
Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hwndParent As Integer, ByVal hwndChildAfter As Integer, ByVal lpszClass As String, ByVal lpszWindow As String) As Integer
Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer

خوی حالا توی یک تایمر این کد ها رو بنویسید :


Dim ExpHandle, ThingHandle, TxtLen, Er_ As Integer
Dim Txt As String
ExpHandle = FindWindow(vbNullString, "Yor Title")
If ExpHandle <> 0 Then
ThingHandle = FindWindowEx(ExpHandle, 0, "Yor Class Name", vbNullString)
If ThingHandle <> 0 Then
TxtLen = GetWindowTextLength(ThingHandle) + 1
Er_ = GetWindowText(ThingHandle, Text, TxtLen)
If Er_ <> 0 Then
Txt = (Mid(Txt, 1, TxtLen))
End If
End If
End If

خوب ما اینجا از به جای SendMessage از GetWindowText استفاده کردیم.
your Tittle عنوان پنجره مورد نظر هست و Your Class Name هم نام کلاس شئ که برای تکست باکس های .Net میشه :
WindowsForms10.EDIT.app.0.bf7d44
خوب تموم شد امید وارم مفید واقع بشه!

Saman_12
دوشنبه 25 مرداد 1389, 21:39 عصر
می بخشین توی کد بالا من Txt رو مقدار دهی نکردم به همین دلیل کد درست عمل نمی کنه شما خط :

Dim Txt As String
رو به این خط تغییر بدید :

Dim Txt As String = New String(Chr(0), 255)
حالا درست شد.

FastCode
دوشنبه 25 مرداد 1389, 23:07 عصر
این کار خیلی مشکل داره.
اولیش اینه که اطلاعات ممکنه از بین بروند.
روش استاندارد تر استفاده از یه پروتوکول مثله shared memory یا pipe یا یه چیز اینطوریه که با توجه به نوع و حجم و ساختار اطلاعاتتون خودتون باید انتخاب کنید.