PDA

View Full Version : سوال: ارسال فیلد از یک برنامه به برنامه دیگر



رامین مرادی
چهارشنبه 07 تیر 1391, 11:16 صبح
با سلام
شاید بگید این موضوع قبلا" بحث شده ولی من که چیزی از اون موارد سر در نیاوردم.
موضوع اصلی اینه که من یک برنامه نوشتم به زبان سی شارپ و یک برنامه تو وی بی
در صفحه برنامه سی شارپ یک دکمه وجود داره که اگه کاربر بعد از پر کردن فیلد ها و زدن اون برنامه نوشته شده در وی بی اجرا شده و اگه کاربر بخواد دکمه تایید روی فرم وی بی را بزنه اون اطلاعات از فیلد های فرم برنامه سی شارپ خانده و در فرم وی بی نمایش داده بشه . این رو هم بگم این دو برنامه دوتا بانک اطلاعات جداگانه دارند و نمی خوام از روی بانک این اطلاعات خونده بشه فقط از روی فرم ورود این کار انجام بشه :متفکر: خوب حالا چطور این رو پیاده سازیش کنم

اگه توضیحاتم رو متوجه نشدید بگید تا بیشتر توضیح بدم
ممنون

محسن واژدی
چهارشنبه 07 تیر 1391, 11:43 صبح
سلام
زیاد متوجه نشدم، منظورتان این است که میخواهید با فشردن دکمه ای در وی بی اطلاعاتی از فیلد روی فرمی در C# خوانده و در وی بی نمایش داده بشه؟

_behnam_
چهارشنبه 07 تیر 1391, 12:53 عصر
با سلام
شاید بگید این موضوع قبلا" بحث شده ولی من که چیزی از اون موارد سر در نیاوردم.
موضوع اصلی اینه که من یک برنامه نوشتم به زبان سی شارپ و یک برنامه تو وی بی
در صفحه برنامه سی شارپ یک دکمه وجود داره که اگه کاربر بعد از پر کردن فیلد ها و زدن اون برنامه نوشته شده در وی بی اجرا شده و اگه کاربر بخواد دکمه تایید روی فرم وی بی را بزنه اون اطلاعات از فیلد های فرم برنامه سی شارپ خانده و در فرم وی بی نمایش داده بشه . این رو هم بگم این دو برنامه دوتا بانک اطلاعات جداگانه دارند و نمی خوام از روی بانک این اطلاعات خونده بشه فقط از روی فرم ورود این کار انجام بشه :متفکر: خوب حالا چطور این رو پیاده سازیش کنم

اگه توضیحاتم رو متوجه نشدید بگید تا بیشتر توضیح بدم
ممنون
اول اینکه برای ارتباط با پنجره های بیرون پروژه باید از API استفاده کنید.
خوب چون اینجا بخش ویژوال بیسیک هستش ما کاری به کد سی شارپ نداریم و میپزدازیم به کد های وی بی
1. اول شما باید هندل فرم اصلی رو بدست بیارید تابع زیر : (یا باید نام کلاس پنجره ره وارد کنید یا عنوان فرم " 2 تارو نمیشه باهم وارد کرد")
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Dim hwndFound As Long
hwndFound = FindWindow(vbNullString, strWindowName)
2.وقتی که هندل پنجره اصلی بدست اومد به وصیله اون باید هندل پنجره های فرزند رو بدست بیاریم. تابع زیر :(به روش بالا اما 2 آرگومنت اضاف شده که یکی هندل پنجره اصلی و دیگری مقدار 0& را دریافت میکند)
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
htextbox = FindWindowEx(hwndFound, ByVal 0&, "ThunderRT6TextBox", vbNullString)
خوب وقتی که هندل پنجره مورد نظر رو بدست اوردی با تابع getmessage فکر کنم بود میتونید متنش رو بدست بیارید توی گوگل یه سرچ کنید نمونه های زیادی میاد

موفق باشید/

AbbasVB
چهارشنبه 07 تیر 1391, 15:45 عصر
با سلام
اولا با تشکر از دوستمون _behnam_

دوست عزیز یه را دیگه هم اینه که از کنترل وینسوک استفاده کنید
به این صورت که بعد از زدن دکمه دو برنامه به هم وصل می شن و اطلاعات رو با هم رد و بدل می کنن

رامین مرادی
پنج شنبه 08 تیر 1391, 14:15 عصر
ممنون از دوستان میشه یک نمونه کوچیک برام بزارید اخه من تست کردم هندل اون آبجکت یا تکست باکس صفر میاد یعنی خطا وجود داره در ضمن این کد نسبت به کوچیکی یا بزرگی حروف حساس هستش

رامین مرادی
سه شنبه 13 تیر 1391, 12:02 عصر
دوستان من هنوز منتظرم لطفا" با یک نمونه راهنمایی کنید

محسن واژدی
سه شنبه 13 تیر 1391, 19:24 عصر
سلام علیکم
ضمیمه زیر بررسی کنید

این نمونه با apiهایی که دوستان معرفی کردند محتویات text-boxهای موجود در فرمی را دریافت میکند، که بصورت اولیته text-boxهای هدف در این نمونه بر روی فرم برنامه قرار دارند اما شما میتوانید کلاس و نام فرم برنامه دیگری را جایگزین کنید

موفق باشید

kitcat_m18
چهارشنبه 14 تیر 1391, 15:15 عصر
با سلام،
نميشه تو VB به صورت سوئيچ پارامتر ها رو ارسال كرد؟؟؟ :متفکر:
مثلا اينطوري:
test.exe -hassan
يا اينطوري:
text.exe "hassan"
يا شايدم اينطوري:
test.exe hassan

اينم يه نمونه عملي كه به زبان ++C نوشته شده:
D:\Sierra\Half-Life\hl.exe -console -game cstrike

محسن واژدی
چهارشنبه 14 تیر 1391, 16:30 عصر
با سلام،
نميشه تو VB به صورت سوئيچ پارامتر ها رو ارسال كرد؟؟؟ :متفکر:
مثلا اينطوري:
test.exe -hassan
يا اينطوري:
text.exe "hassan"
يا شايدم اينطوري:
test.exe hassan

اينم يه نمونه عملي كه به زبان ++C نوشته شده:
D:\Sierra\Half-Life\hl.exe -console -game cstrike

سلام علیکم
چرا، پارامتر های ارسالی به برنامه در تابع Command ذخیره میشوند، در پارامترهای ساده همانند نمونه هایی که در بالا ذکر کردین بدون هیچ مشکلی میتوانیم پارامترها را تفسیر کنیم، اما در پارامترهایی مانند زیر:
forced.exe -del:"C:\Windows\System32\Shell32.dll" -silent
طبیعتا تا حدودی کدهایی که بمنظور تفسیر پارامترها نوشته میشوند پیچیده تر میشود

نمونه زیر را هم بررسی کنید

موفق باشید

رامین مرادی
چهارشنبه 14 تیر 1391, 19:32 عصر
دوستان اگه من نام اون تکست رو ندونستم چطور امکان داره مشتری از من بخواد این کار رو روی یکی از نرم افزاراش انجام بدم یعنی مشخصات رو از اون نرم افزار به نرم افزار خودم وارد کنم نرم افزار منبع هم که توسط یکی دیگه نوشته شده سورسش دست من نیست تا بفهمم نام تکستش چیه اونوقت چیکار کنم؟؟؟

محسن واژدی
چهارشنبه 14 تیر 1391, 20:22 عصر
دوستان اگه من نام اون تکست رو ندونستم چطور امکان داره مشتری از من بخواد این کار رو روی یکی از نرم افزاراش انجام بدم یعنی مشخصات رو از اون نرم افزار به نرم افزار خودم وارد کنم نرم افزار منبع هم که توسط یکی دیگه نوشته شده سورسش دست من نیست تا بفهمم نام تکستش چیه اونوقت چیکار کنم؟؟؟ بعد از کمپایل نمیتوانیم نام شی را بدست آوریم و تنها ارتباط از طریق هندل شی هست

just4froum
چهارشنبه 14 تیر 1391, 22:15 عصر
با اجازه جناب واژدی


دوستان اگه من نام اون تکست رو ندونستم چطور امکان داره مشتری از من بخواد این کار رو روی یکی از نرم افزاراش انجام بدم یعنی مشخصات رو از اون نرم افزار به نرم افزار خودم وارد کنم نرم افزار منبع هم که توسط یکی دیگه نوشته شده سورسش دست من نیست تا بفهمم نام تکستش چیه اونوقت چیکار کنم؟؟؟


همانطور که جناب واژدی گفتند بعد از کامپایل برنامه نمیشه فهمید اسمش چیه ولی اگرم می فهمیدیم زیاد به دردمون نمی خورد.
برای این که مشخصات رو وارد برنامت کنی یا باید هندل اونارو بدست بیاری یا نام class هاشو از قبل بدونی.

باید با استفاه از این کد شما اطلاعات تمامی obj هایی رو که در پنجره باشه بدست میارید :

Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch 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 Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Const GW_CHILD As Long = 5
Private Const GW_HWNDNEXT As Long = 2
Private Const WM_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE

Private Sub Form_Load()
Dim ChWnd As Long, MhWnd As Long
Dim s As String

MhWnd = FindWindow(vbNullString, "Computer")
ChWnd = GetWindow(MhWnd, GW_CHILD)


Do While ChWnd <> 0
s = CStr(ChWnd) & " - "
s = s & FindClassName(ChWnd) & " - "
s = s & FindTextA(hWnd) & " - "
s = s & FindTextB(hWnd)

List1.AddItem s
ChWnd = GetWindow(ChWnd, GW_HWNDNEXT)
Loop

End Sub

Private Function FindClassName(hWnd As Long) As String
Dim buf As String, lbuf As Long
buf = String(255, Chr(0))
lbuf = GetClassName(hWnd, buf, 255)
FindClassName = Left(buf, lbuf)
End Function

Private Function FindTextA(hWnd As Long) As String
Dim buf As String, lbuf As Long
buf = String(255, Chr(0))
lbuf = GetWindowText(hWnd, buf, 255)
FindTextA = Left(buf, lbuf)
End Function

Private Function FindTextB(hWnd As Long) As String
Dim lbuf As Long, buf As String
lbuf = SendMessage(hWnd, WM_GETTEXTLENGTH, 0&, 0&)
buf = String(lbuf, Chr(0))
Call SendMessage(hWnd, WM_GETTEXT, lbuf, ByVal buf)
FindTextB = buf
End Function