PDA

نسخه کامل مشاهده نسخه کامل : کمک SendMessageSTRING



sima_6600
02-09-2010, 12:16
سلام من یک مشکل دارم این کد تو VB.Net کار نمیکنه کسی میدونه مشکل چیه

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

_H2_
03-09-2010, 04:44
سلام
الف)
مهمترین تغییر در دستور شما برای کارکردن در نسخه های بالاتر VB تغییر Long به Integer است.
زیرا VB6-Long متغیر عددی 32 بیتی بوده در حالیکه در نسخه های بالاتر Long متغییر بسیار بزرگتر 64 بیتی شده و Integer جایش را گرفته.
این مهم ترین و کلیدی ترین مطلب و مشکل کد فوق شما است.

ب)
ولی یک مشکل جداگانه که ربطی به نسخه VB هم ندارد در کد شما وجود دارد و ان حضور عدد 397432 است.
این یک اشتباه است و ربطی به نسخه VB هم ندارد.
در مکان این عدد شما باید یک اشاره گر hWnd داشته باشید.
اشاره گر hWnd در ذات یک عدد است ولی اصلاً عدد ثابت و مشخصی نیست و با هر اجرای برنامه فرق میکند.
hWnd عدد اشاره گر هر چهارچوب یا پنجره در سیستم عامل ویندوز است.
تمام Form ها و TextBox ها و Button ها و... و... یک hWnd منحصر به فرد دارند که در زمان اجرا مشخص میشود و با هر بستن و دبل کلیک مجدد برنامه یا Restart رایانه این عدد مجدد (توسط هسته ویندوز) تخصیص داده شده و عوض میشود و اصلاً چیز ثابتی نیست که همینطوری در کد نوشته شود.

توابع API دیگری وجود دارد که این عدد را به دست می آورد...
مثلاٌ hWnd رو ترین Form ...
یا hWnd کنترلری که الآن فوکس دارد ...
یا hWnd کنترلری که الان در موقعیت فلان x,y است ...

شما باید این عدد را در runtime به دست آورید و سپس استفاده کنید، نه اینکه همینطوری در کد آن را بنویسید!!!!!!

ج)
نوشتن Integer به جای Long مشکل کد فوق را حل میکند ولی کد بهتر هم وجود دارد.
VB6 فقط برای سیستم عامل های x86 بود در حالیکه نسخه های جدیدتر قابلیت اجرا در x86 و x64 را با هم دارند.
با علم به ساختار توابع API شما میتوانید به جای برخی Integer ها در تعریف توابع API از نوع جدید IntPtr استفاده کنید.
استفاده صحیح و بجا از IntPtr باعث میشود کد شما به راحتی و بدون هیچ تغییری در سیستم های x86 و x64 همزمان به درستی کار کند.

د)
متون در VB6 فقط ASCII بودند و از این رو با متون فارسی مشکل داشت و مثلاً در همین مورد شما نمیتوانستید از کلمات و لغات فارسی و چینی و ... در ارسال به تابع API استفاده کنید و برنامه به مشکل میخورد.
نتیجتاً از توابع مخصوص ASCII استفاده میکردم تا حداقل برنامه به Error نخورد.
(گرچه باز هم مشکل زبان های غیر انگلیسی حل نمیشد ولی حداقل برنامه error نمیخورد)
در همین راستا از توابع قدیمی PostMessageA و SendMessageA و... استفاده میشود.

الآن هم میتوان همچنان از این توابع استفاده کرد ولی دیگر یونیکد به طور کامل پشتیبانی میشود و میتوان به جای انها از PostMessageW و SendMessageW یا نوع های خودکار استفاده کرد.

=====

با حصول چهار شرط و مطلب فوق کد شما چنین میشود.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
Me.Handler هندلر hWnd فرم جاری را که الآن درون آن هستیم را پس میدهد و این کد عنوان فرم جاری را عوض میکند.

موفق باشید.