PDA

View Full Version : حرفه ای: بدست آوردن هندل یک عضو داخل پنچره و تغییر متن آن (API)



shahryari
سه شنبه 26 فروردین 1393, 16:54 عصر
سلام دوستان

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool SetWindowText(IntPtr hwnd, String lpString);

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern System.IntPtr FindWindow(string lpClassName, string lpWindowName);

با توجه کدهای بالا ، با استفاده از تابع FindWindow ، هندل پنجره ای را که متن تایتل آن مد نظرم است را پیدا میکنم و با تابع SetWindowText میتوانم متن آن پنجره را تغییر دهم

IntPtr i = FindWindow(null, "Select Device");
bool b = SetWindowText(i, "انتخاب اسکنر");

شکل زیر گویای همه چیز است:

118019

حال سوالم این است
چگونه میتوانم با بدست اوردن هندل اجزای این پنجره ، متن آن عضو را تغییر دهم
بعنوان مثال بگم هندل عضوی را متنش Which device do you want use? است را بگیر و به متن دلخواه من تغییر بده..
یا عضوی را که متنش OK را به تایید تبدیل کن..
امیدوارم منظور را رسانده باشم

shahryari
پنج شنبه 04 اردیبهشت 1393, 11:12 صبح
دوستان کسی در این مورد اطلاعاتی نداره در اختیار ما بذاره و ماهم ازش تشکر کنیم؟عایا؟

plus
پنج شنبه 04 اردیبهشت 1393, 13:38 عصر
شما میتونی با استفاده از تابع EnumChildWindows، لیست Handle همه Child های پنجره اصلی رو بدست بیاری.http://msdn.microsoft.com/en-us/library/windows/desktop/ms633494(v=vs.85).aspx
با دریافت هر Handle، میتونی با ارسال پیغام WM_GETTEXT، متن هر Child رو بدست بیاری. و با متن مورد انتظار مقایسه کنی.http://msdn.microsoft.com/en-us/library/windows/desktop/ms632627(v=vs.85).aspx
و بعد با ارسال پیغام WM_SETTEXT متن پنجره Child رو تغییر بدین. http://msdn.microsoft.com/en-us/library/windows/desktop/ms632644(v=vs.85).aspx
(توجه کنید اگه پنجره مورد نظر در Process جاری باشه بجای WM_GETTEXT و WM_SETTEXT از GetWindowText و SetWindowText میتونید استفاده کنید.)

البته فکر میکنم روش بهتر در صورت امکان این هست که Dialog رو خودتون بسازین تا اینکه با این روش فارسیش کنید.

shahryari
پنج شنبه 04 اردیبهشت 1393, 16:45 عصر
شما میتونی با استفاده از تابع EnumChildWindows، لیست Handle همه Child های پنجره اصلی رو بدست بیاری.http://msdn.microsoft.com/en-us/library/windows/desktop/ms633494(v=vs.85).aspx
با دریافت هر Handle، میتونی با ارسال پیغام WM_GETTEXT، متن هر Child رو بدست بیاری. و با متن مورد انتظار مقایسه کنی.http://msdn.microsoft.com/en-us/library/windows/desktop/ms632627(v=vs.85).aspx
و بعد با ارسال پیغام WM_SETTEXT متن پنجره Child رو تغییر بدین. http://msdn.microsoft.com/en-us/library/windows/desktop/ms632644(v=vs.85).aspx
(توجه کنید اگه پنجره مورد نظر در Process جاری باشه بجای WM_GETTEXT و WM_SETTEXT از GetWindowText و SetWindowText میتونید استفاده کنید.)


با سلام و تشکر
با این تفاسیر بنظرم خیلی باید زمان بر باشه پروسه تغییر یک متن و هرکدوم از مراحل که فرمودید باید در یک ترد جداگانه اجرا بشه تا مشکلی در روند کار اصلی برنامه پیش نیاد
.
.
اوومممم...:متفکر:


البته فکر میکنم روش بهتر در صورت امکان این هست که Dialog رو خودتون بسازین تا اینکه با این روش فارسیش کنید.

این روش رو باید کار کنم و مشکلاتی از قبیل رایت تو لفت رو هم نداشته باشم
مرسی

plus
پنج شنبه 04 اردیبهشت 1393, 16:54 عصر
با سلام و تشکر
با این تفاسیر بنظرم خیلی باید زمان بر باشه پروسه تغییر یک متن و هرکدوم از مراحل که فرمودید باید در یک ترد جداگانه اجرا بشه تا مشکلی در روند کار اصلی برنامه پیش نیاد
.
.
اوومممم...:متفکر:



این روش رو باید کار کنم و مشکلاتی از قبیل رایت تو لفت رو هم نداشته باشم
مرسی
نه روش زمان بری نیست.شما همینطور که داری کرسر موس رو روی صفحه نمایش حرکت میدی چند صد پیغام ارسال و دریافت میشه بدون اینکه اصلا احساسش کنید.مقایسه رشته هم زمانبر نیست و در کل نیاز به هیچ Thread ی نیست البته روش، روش مناسبی نیست؛ طراحی یک Dialog به صورت دستی و دریافت لیست Scanner ها توسط توابع API (یا هر چیز دیگه) روش بهتری میتونه باشه.

shahryari
پنج شنبه 04 اردیبهشت 1393, 17:24 عصر
طراحی یک Dialog به صورت دستی و دریافت لیست Scanner ها توسط توابع API (یا هر چیز دیگه) روش بهتری میتونه باشه.
نه اتفاقا خیلی هم راحته
دی ال ال wia به راحتی این امکان رو میده
private void ListDevices_Click(object sender, EventArgs e)
{
// Clear the ListBox.
Devices.Items.Clear();

// Create a DeviceManager instance
var deviceManager = new DeviceManager();

// Loop through the list of devices and add the name to the listbox
for (int i = 1; i <= deviceManager.DeviceInfos.Count; i++)
{
var deviceName = deviceManager.DeviceInfos[i].Properties["Name"].get_Value().ToString();
Devices.Items.Add(deviceName);
}
}