PDA

View Full Version : به دست آوردن كد اسكي



بیتافرهی
سه شنبه 16 مهر 1387, 06:15 صبح
سلام
من فرمي دارم كه روي اون يك label گذاشته ام.
مي خواهم هر وقت كه كاربر روي يكي از دكمه هاي صفحه كليد فشار داد ،كد اسكي آن روي label نمايش داده شود.
مشكل اينجاست كه كد نوشتن اين دستور را براي به دست آوردن كد اسكي نمي دانم.
لطفا مرا راهنمايي كنيد.

afsharm
سه شنبه 16 مهر 1387, 09:20 صبح
کدی که لازم داری این است:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication12
{
class Program
{
static void Main(string[] args)
{
byte[] ascii = ASCIIEncoding.ASCII.GetBytes("A");
byte[] bignedianUnicode = UnicodeEncoding.BigEndianUnicode.GetBytes("ی");
byte[] unicode = UnicodeEncoding.Unicode.GetBytes("ی");

Console.ReadLine();
}
}
}

اگر مطمئن هستی که استرینگ فرستاده شده در قالب اسکی (۷ بیتی باشد) می‌گنجد از ASCIIEncoding استفاده کن. اگر این طور نباشد همیشه عدد ۶۳ که نشانگر کاراکتر علامت سوال در اسکی است را دریافت می‌کنی. برای حالات غیر اسکی و کلا زبان‌های فارسی و عربی و... از BigEndianUnicode یا Unicode استفاده کن. فرق این دو تا صرفا در نحوه پر کردن آرایه خروجی است.
خروجی GetBytes یک آرایه از بایت‌ها است. هر کدام از کاراکترهای موجود در استرینگ ورودی بسته به این که اسکی باشد یا یونیکد در ۱ یا ۲ عنصر این آرایه جا می‌گیرد. دقت کن که هر کاراکتر یونیکد (مثلا هر حرف یا علامت فارسی) به دو بایت برای ذخیره شدن نیاز دارد.

h.jaza
چهارشنبه 17 مهر 1387, 00:22 صبح
اگر کدی که afsharm (http://barnamenevis.org/forum/member.php?u=71806) نوشته نتونست کمکتون بکنه، یه سری به بخش نمونه برنامه های کوچک و مفيد در سي شارپ (http://barnamenevis.org/forum/showthread.php?t=64210) بزنید؛ اونجا همچین برنامه ای هست. (البته اون برنامه ای که من یادمه، خیلی امکانات بیشتری هم داشت)

بیتافرهی
چهارشنبه 17 مهر 1387, 08:56 صبح
نه اون كد تونست كمكم كنه نه از اون صفحه چيزي پيدا كردم ،كسي مي تونه كمك كنه؟

SMRAH1
چهارشنبه 17 مهر 1387, 10:15 صبح
سلام

1) یک پروژه ی Windows Form Application بساز.
2) یک label به نام label1 برای فرم بگذار.
3) خاصیت KeyPreview فرم رو True کن.
4) رویداد KeyPress فرم رو بگیر و در آن این دو خط رو بنویس :

byte[] ascii = ASCIIEncoding.ASCII.GetBytes(e.KeyChar.ToString()) ;
label1.Text = e.KeyChar.ToString() + " " + ascii[0];
حالا برنامه رو کامپایل و اجرا کن.
در این برنامه با دریافت کد حروف فشرده شده توسط کاربر،می تونی تشخیص بدی که کدوم کلید فشرده شده است.اگر کار کردی بالا تر این لازم داری،(دقیقا کد فشرده شده صفحه کلید رو می خواهی) باید کمی Win32 بدونی و متد WinProc رو override کنی.
مثل بالا ،مراحل اول و دوم رو انجام بده و بعد کد زیر رو توی فرم برنامت وارد کن :

private const int WM_KEYDOWN = 0x0100;
private const int WM_KEYUP = 0x0101;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_KEYDOWN)
{
label1.Text = m.WParam.ToString();
}
else if (m.Msg == WM_KEYUP)
{
label1.Text = "";
}
base.WndProc(ref m);
}
در این حالت هر گاه کلیدی از صفحه کلید فشرده شود (حتی کلیدهای Ctrl و Shift البته به غیر از Alt ) یک کد تولید میشه.البته برای کار با این کدها اطلاعات تکمیلی تری لازه ولی باید به چند نکته توجه کنی.اول اینکه اگر کلید A رو (به همراه Shift ، یا در حالت کیبورد انگلیسی یا فارسی فرقی نمی کنه مهم اینه که کلید A رو زده باشی) کد 65 (معادل اسکی A) رو میده.نکته دوم اینه که برای کلید های توسعه یافته(مثل کلید های جهت بر) نیاز به برنامه نویسی بیشتری داره.نکته بعد اینه که برای این کد فقط حالت فشردن و رها سازی کلید بررسی میشه و اگر در مورد امتداد فشردگی (نگهداشتن کلید) بخوای اطلاعتی کسب کنی باید کمی بیشتر روی اطلاعات دریافتی پیغام WM_KEYDOWN کار کنی (همه اینها مطالب گسترده ای داره که بهتره توی MSDN دربارشو بخونی).به این نکته این رو هم اضافه کن که اگر چند کلید رو همزمان فشرده باشی ،آخرین کلید فشرده شده رو برنامه نشون می ده (همه راه حل داره ولی به نظر نمی رسه اینقدر پیشرفته لازم باشد).در نهایت هم این متد پیغامهای WM_KEYDOWN و WM_KEYUP رو میگیره ولی اجازه پردازش اونها رو هم به فرم می ده (خط base...).

موفق باشی