PDA

نسخه کامل مشاهده نسخه کامل : سوال درباره کلاس my.computer.keyboard



ahsanjan
04-07-2008, 22:16
سلام من نمی دونم چطور در ویژوال بیسیک 2008 کلید capslock را روشن کنم می تونم بفهمم که روشن هست یا نه ولی نمی تونم روشنش کنم
با این کد می فهمم روشن هست یا نه

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

_H2_
04-07-2008, 23:14
سلام

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

ahsanjan
05-07-2008, 10:37
اگر می شود یک کمی در باره این قسمت و کاربرد کارهای آن توضیح دهید


If Not System.Console.CapsLock Then
keybd_event(20, 0, 0, 0)
keybd_event(20, 0, 2, 0)
End If


آیا می شود در بین کدهای VB.NET از اسمبلی و C++ هم استفاده کرد یا حداقل یک کدام را

_H2_
05-07-2008, 20:15
سلام
دستور System.Console.CapsLock با My.Computer.Keyboard.CapsLock برابر است!
کلاسسهای فضای نام My معمولاً مختص VB.Net هستند و برای راحتی برنامه نویسان قدیمی VB6 در نظر گرفته شده اند، یعنی در بقیه زبانهای دات نتی این گزینه ها در دسترس نیستند، تقریباً همه این کلاسها و توابع معادلهای رسمی در کلاسهای اصلی فریم ورک دارند.
و به نظر من بهتر است با توابع عمومی کار کرد تا به جای VB.Net کار بودن، دات نت کار باشید! و بتوانید در زبانهای دیگر هم به راحتی کار کنید.

تابع keybd_event هم رویدادهای کیبور را شبیه سازی میکند، و پارامتر اول و سومش مهم است.
-پارامتر اول کد کلید است، که کد CapsLock عدد 20 است. میتوانید از کدهای موجود در System.Windows.Forms.Keys استفاده کنید.
-پارامتر سوم هم مشخص کننده رویداد است، صفر به معنی فشرده شدن کلید و 2 به معنی رها شدن کلید است.
در کل ما چک میکنیم و اگر CapsLock خاموش باشد یک بار فشرده شدن و رها شدن آنرا شبیه سازی میکنیم.


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



آیا می شود در بین کدهای VB.NET از اسمبلی و C++ هم استفاده کرد یا حداقل یک کدام را
مستقیماً قابلانجام نیست ولی راههایی دارد، اصلی ترین راه ساخت dll در زبان دیگر و فراخانی از داخل VB.Net است.
همین keybd_event در واقع کدی به زبان ++VC است که در کتابخانه user32.dll در محل system32 مستقر است.
خود شما هم میتوانید با ++VC و یا VAsm یک dll بسازید، که البته بسته به نوع dll استفاده از ان هم فرق میکند.
user32.dll یک Dynamic-Link Library است (یعنی نوع پایه ای و ابتدایی dll ها) ولی الآن dll ها انواع مختلف دارند و دیگر در عبارت Dynamic-Link Library نمیگنجند.

اگر زبان دیگر دات نتی باشد مثل VC++.Net و یا C#.Net با کمی دردسر و دقت و کمی پیچیدگی با کامپایلهای خط فرمانی میتوان بدون ساخت یک dll دیگر هم از کدهای هم استفاده کرد.

ولی در کل لزومی این کارها نیست، شما در برنامه های مرسوم با دات نت کم نخواهید آورد که محتاج به دیگر زبانها شوید...
اگر هم میبینید ما الآن از user32.dll استفاده کردیم به خاطر این است که در ویندوز این فایل مدیر تمام بخش های رابط کاربری میباشد، و تا زمانی که در ویندوز هستید باید بالاجبار تمام فرامینی که به نوعی با رابط کاربری سروکار دارند، به این dll ارجاع شوند.

ahsanjan
05-07-2008, 21:37
خیلی ممنون ولی آیا در msdn جایی هست که این api ها را توضیح دهد مثل همین لطفا یک کلمه بگویید تا من در msdn مکان آموزش api ها را پیدا کنم

ahsanjan
07-07-2008, 11:00
با سلام آقای h2 یا هر کس دیگری که می تواند جواب من را بدهد من رفتم تو سایت مایکروسافت مثال های vb.net را دانلود کردم به یک مشکل برخورد کردم یک اینکه در این کد متد invalidate به چدر د می خورد و اصلا کارش چیست


Public Property BeadColor() As System.Drawing.Color
Get
Return privateBeadColor
End Get
Set(ByVal value As System.Drawing.Color)
privateBeadColor = value
Me.Invalidate()
End Set
End Property
Public Property BeadOutlineColor() As System.Drawing.Color
Get
Return outlineColor
End Get
Set(ByVal value As System.Drawing.Color)
outlineColor = value
Me.Invalidate()
End Set
End Property

دو اینکه در این عکس چرا imports microsoft.ink زیرش خط می کشد ویرایشگر
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

_H2_
12-07-2008, 23:18
سلام

خیلی ممنون ولی آیا در msdn جایی هست که این api ها را توضیح دهد مثل همین لطفا یک کلمه بگویید تا من در msdn مکان آموزش api ها را پیدا کنم

api های ویندوز یکی و دو تا نیست که بتوان آنها را در یک نقطه مجتمع کرد، البته مجتمع است ولی آن محل اجتماع خود msdn است.

شما میتوانید با برنامه هایی مثل depends.exe لیست api های یک dll را در اورید و اگر آن dll جزء اجزای اصلی ویندوز مایکروسافت باشد میتوانید نام api را در msdn بزنید تا توضیحاتش را پیدا کنید. مثلاً keybd_event را بزنید تا توضیحات و پارامترها و... را پیدا کنید.

البته اگر انگلیسی تان قوی تر باشد میتوانید از سرچ msdn هم برای یافتن api مورد نظر استفاده کنید.


با invalidate به چدر د می خورد و اصلا کارش چیست

تصویر کنترل را نا معتبر میکند و در پیغام رسم مجدد را به کنترلر صادر میکند، یک چیز تو مایه های Refresh تصویر کنترلر که برروی مانیتور دیده میشود.



دو اینکه در این عکس چرا imports microsoft.ink زیرش خط می کشد ویرایشگر

شما dll مربوطه را به Refrence ها اضافه نکرده اید، در اصل VS از محل و موقعیت فایل مربوطه آگاه نیست.
Project->Add Refrence->Browse
شاید بتوانید در یکی از مسیرهای زیر و یا زیر پوشه هایشان فایل مربوطه را مییابید.
C:\Program Files\Common Files\microsoft shared\ink
C:\Program Files\Reference Assemblies\Microsoft\Tablet PC

ahsanjan
13-07-2008, 10:09
ببخشید این کلمه را که وارد می کنم نمی آید عکس را ببینید
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

_H2_
13-07-2008, 23:49
سلام
عزیز جان، شما Filter تایین کرده اید، گزینه Visual Basic را به unfiltered تغییر دهید، تا msdn شرطی برای نمایش نگذارد.
چون این مطالب فراتر از آن است که مربوط به یک زبان خاص شود و توضیحات api ها، هم فقط بر پایه مبنای C++ Native است.

ahsanjan
15-07-2008, 05:55
من می خواستم برنامه ای بنویسم که وقتی اجرامی شود متن درون textbox الون انتخاب شود و با استفاده از فشرده شدن همزمان دو کنترول ctrl و c کپی شود بدون دخالت من و فقط باکد و این کدها را نوشتم ولی نمی دانم چرا کپی نمی شود مشکلشان چیست


Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TextBox1.SelectAll()
keybd_event(Keys.ControlKey, 0, 0, 0)
keybd_event(Keys.C, 0, 0, 0)
keybd_event(Keys.C, 0, 2, 0)
keybd_event(Keys.ControlKey, 0, 2, 0)
End Sub

_H2_
16-07-2008, 00:45
سلام
برای همچین کاری خود دات نت راه حل هایی دارد
شما میتوانید با کمک تابع System.Windows.Forms.SendKeys.Send عمل تایپ در برنامه های دیگر را انجام دهید و نیازی هم به copy و paste نیست (گرچه میتوانید).

ahsanjan
16-07-2008, 04:21
ممنون ولی من می خواستم بدانم همین کدیکه من نوشتم چه اشکالی دارد و فقط می خواست بدانم دو دکمه را در یک زمان گرفتن چه جوری اگر می شود بگویید مثلا alt و ctrl را چه جوری در یک زمان فشار دهیم از طریق کد

_H2_
16-07-2008, 13:08
سلام
اگر قصد فهمیدن ایراد کد قبلی تان باشد میتوانم سه نکته را متذکر شوم.
1- ایراد اصلی، درج کد در رویداد Load است که این رویداد قبل از نمایش فرم اتفاق میافتد که چیزی برای کپی و اعمال کیبورد وجود ندارد.
راه حل: از رویداد Shown یا Click و ... استفاده کنید که بعد از نمایش پنجره اتفاق می افتد.

2- شما باید مطمئن شوید که TextBox مورد نظر حتماً فوکس را داشته باشد و گرنه در همه شرایط کد فوق جواب نمیدهد.
راه حل: Me.TextBox1.Focus

3- بهتر است گزینه Option Strict را در برنامه هایتان فعال کنید و عادت کنید به تبدیلات صریح، مثل زبان C، و در این مورد خاص مثلاً از دستور CByte هم استفاده کنید، گرچه تفاوتی در نهایت ندارد، ولی این عادت پسندیده میتواند جلوی بروز بسیاری از خطاها و حواس پرتی ها را بگیرد.


معادل چهار خط کد کلیدی تایپی شما در دات نت این است!

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

اگر هم قصد صرف شبیه سازی دکمه های کیبورد نباشد، برای کپی تک دستور Me.TextBox1.Copy که همیشه هم جواب میدهد، بسیار مناسب تر است.
موفق باشید.

ahsanjan
16-07-2008, 14:55
ممنون حل شد همان طور که شما گفتید در رویداد کلیک گذاشتم