PDA

View Full Version : عویض عملکرد کلیدهای Left و Right (حرکت Cursor یا همون مکان نما)



mhdashtii
شنبه 12 مرداد 1392, 11:01 صبح
سلام دوستان

همه ی دوستان میدونند که بعداز RightToLeft کردن Formها و یا کنترل ها .. کلیدهای {LEFT / RIGHT} .. برعکس عمل میکنند .. یعنی با زدن کلید {LEFT} مکان نما به راست .. وبا زدن کلید {RIGHT} مکان نما به چپ حرکت میکنه

amir200h
شنبه 12 مرداد 1392, 11:13 صبح
خوب میتونی وقتی کلید چپ رو زد کلید سمت راستو صدا کنی و برعکس

mhdashtii
شنبه 12 مرداد 1392, 11:15 صبح
خوب میتونی وقتی کلید چپ رو زد کلید سمت راستو صدا کنی و برعکس
چطوری؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟

amir200h
شنبه 12 مرداد 1392, 11:27 صبح
تو رویداد KeyPress کنترلتون اینو بنویس
if (e.KeyChar == (char)Keys.Left)
{
e.Handled = true;
SendKeys.Send("{Right}");
}

mhdashtii
شنبه 12 مرداد 1392, 11:34 صبح
تو رویداد KeyPress کنترلتون اینو بنویس
if (e.KeyChar == (char)Keys.Left)
{
e.Handled = true;
SendKeys.Send("{Right}");
}
کار نمیکنه اصلا وقتی کلید left و یا right میزنیم بدون اجرای دستورات داخل KeyPress ، بCursor جا به جا میشه

mhdashtii
شنبه 12 مرداد 1392, 12:43 عصر
کسی نیست جواب ما رو بده

negar.rafie
شنبه 12 مرداد 1392, 16:09 عصر
اینجا (http://barnamenevis.org/showthread.php?377285-%D8%AA%D8%B9%D9%88%DB%8C%D8%B6-%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF-%DA%A9%D9%84%DB%8C%D8%AF%D9%87%D8%A7%DB%8C-Left-%D9%88-Right-%28%D8%AD%D8%B1%DA%A9%D8%AA-Cursor-%DB%8C%D8%A7-%D9%87%D9%85%D9%88%D9%86-%D9%85%DA%A9%D8%A7%D9%86-%D9%86%D9%85%D8%A7%29&p=1668157&viewfull=1#post1668157)اقای the king پاسخ دادن ولی من تو vb هم تست کردم نشد

hojjatshariffam
شنبه 12 مرداد 1392, 17:53 عصر
بزارید تو رویداد KeyDown
به این صورت

private bool flag;
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{

if (flag)
{
flag = false;
return;
}
if (e.KeyCode == Keys.Left)
{
e.Handled = true;
SendKeys.Send("{Right}");
flag = true;
}
else if (e.KeyCode == Keys.Right)
{
e.Handled = true;
SendKeys.Send("{Left}");
flag = true;
}
}

اون متغییر فلگ رو باید عمومی تعریف کنید
البته به یاد داشته باشید که کار اصولی نمی تونه باشه
ضمنا یه چک هم بکنید که اگه RTL بود این عمل انجام بشه

negar.rafie
شنبه 12 مرداد 1392, 18:17 عصر
اقای the king گفتند که این روش اصولی نیست
لطفا یه نفر روشی را که اقای the king گفتند را با سی شارپ توضیح بدن

hojjatshariffam
شنبه 12 مرداد 1392, 19:11 عصر
اقای the king گفتند که این روش اصولی نیست
لطفا یه نفر روشی را که اقای the king گفتند را با سی شارپ توضیح بدن
اینم کد ایشون در سی شارپ
ولی برا خودمم کار نکرد

protected override bool ProcessKeyMessage(ref Message m)
{
if (RightToLeft != RightToLeft.Yes) return base.ProcessKeyMessage(ref m);
switch ((Keys)m.WParam)
{
case Keys.Left:
m.WParam = (IntPtr)Keys.Right;
break;
case Keys.Right:
m.WParam = (IntPtr)Keys.Left;
break;
}
return base.ProcessKeyMessage(ref m);
}

فکر کنم یه تغییر کوچولو لازم باشه

hojjatshariffam
شنبه 12 مرداد 1392, 19:42 عصر
فکر کنم یه تغییر کوچولو لازم باشه
این تغییر کوچولو این بود
یه کلاس بسازید که از تکست باکس ارث ببره
و کد رو تو اون بنویسید .

internal class Class3 : TextBox
{
protected override bool ProcessKeyMessage(ref Message m)
{
if (RightToLeft != RightToLeft.Yes) return base.ProcessKeyMessage(ref m);
switch ((Keys)m.WParam)
{
case Keys.Left:
m.WParam = (IntPtr)Keys.Right;
m.LParam = (IntPtr)Keys.Right;
break;
case Keys.Right:
m.WParam = (IntPtr)Keys.Left;
break;
}
return base.ProcessKeyMessage(ref m);
}
}

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

hojjatshariffam
شنبه 12 مرداد 1392, 21:19 عصر
اقای the king گفتند که این روش اصولی نیست
لطفا یه نفر روشی را که اقای the king گفتند را با سی شارپ توضیح بدن
یعنی به دردتون نخورد؟ یا نمی تونین ازش استفاده کنید؟
اگه متوجه نشدین بگین تا بیشتر توضیح بدم

مهرداد صفا
شنبه 12 مرداد 1392, 21:24 عصر
باسلام.
بهترین راه این است که به محض دریافت پیغام کیبورد توسط فرم، و قبل از اینکه این پیغام توسط فرم پردازش شده و رویدادهای متناظر فایر شوند، کلیدهای چپ و راست با یکدیگر جا به جا شوند.
برای این کار می توان متود wndproc مربوط به فرم را بازنویسی کرد و قبل از اینکه پیغام به کلاس فرم پاس داده شود باید مقدار WParam چک شود. در صورتی که این مقدار برابر با کلید چپ بود آن را به Keys.Right تغییر داد و بر عکس.
در نمونه کد زیر این عمل انجام شده، البته فقط در مورد رویداد KeyDown. بقیه رویدادهای کیبورد هم به همین ترتیب خواهد بود:

//in the name of god
//صل الله علی محمد و آله
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
const Int32 WM_KEYDOWN = 0x0100;
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

}


protected override void WndProc(ref Message m)
{
if (m.Msg == WM_KEYDOWN)
{
if(((Keys)m.WParam)==Keys.Right)
m.WParam=(IntPtr)Keys.Left;
else if (((Keys)m.WParam)==Keys.Left)
m.WParam=(IntPtr)Keys.Right;

}





base.WndProc(ref m);
}


private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if((e.KeyCode==Keys.Left )||(e.KeyCode==Keys.Right))
MessageBox.Show(e.KeyCode.ToString());
}


}
}