PDA

View Full Version : سوال: مشکل رویداد key press و کلیدهای جهتی



Ms.lemon
شنبه 06 آبان 1391, 19:07 عصر
من دارم یک بازی می نویسم و میخوام با کلیدهای جهتی، شیئی را روی فرم جابجا کنم، برای خوندن کلیدها از رویداد key press استفاده کردم، ولی این رویداد نسبت به کلیدهای جهتی، جواب نمیده، یعنی هرچقدر دکمه های جهتی را فشار می دم، فراخوانی نمی شه:متفکر: چطور میتونم این مشکل را حل کنم؟

ممنون میشم کمکم کنید

ایمان مدائنی
شنبه 06 آبان 1391, 19:19 عصر
توی event - KeyDown بهش دسترسی داری

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyValue)
{
case (char)(Keys.Up):
{
MessageBox.Show("Key Up");
break;
}
}
}

Ms.lemon
شنبه 06 آبان 1391, 19:44 عصر
خیلی ممنون، مشکل همون (char) بود... یه موضوع دیگه هم هست، من روی فرمم یه دکمه play دارم، که با زدن دکمه ی play بازی شروع میشه و باید با این دکمه های جهتی شی را جابجا کرد، یه متغیر بولین play گرفتم که با زدن دکمه play مقدار true میگیره، و توی ریوداد key down هم چک کردک که هر وقت play، true بود، با زدن دکمه های جهتی، شی را حرکت بده، اما این اتفاق نمیفته، ظاهرا بعد از زدن دکمه play کنترل بفرم بر نمی گرده، از this.select و this.activate هم استفاده کردم، اما درست نشد.



private void button1_Click(object sender, EventArgs e)
{
play = true;

}




و این:




private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (play == true)
switch (e.KeyValue)
{
case (char)(Keys.Up):
{
MessageBox.Show("Key Up");
break;
}
}

}

ایمان مدائنی
شنبه 06 آبان 1391, 20:24 عصر
اگه کدت همینه زیر if براکت کم داره که اجرا نمیشه

شما فقط دستور if یک خطی رو میتونید بدون براکت بنویسید

Ms.lemon
شنبه 06 آبان 1391, 20:57 عصر
متاسفانه با براکت هم درست نمیشه

harani
شنبه 06 آبان 1391, 21:13 عصر
ابتدا KeyPreview رو true کن .


int play;/g
private void button1_Click(object sender, EventArgs e)//f
{
play ++;//a

}




private void Form1_KeyDown(object sender, KeyEventArgs e)//a
{
if (play % 2 != 0){//b
if (e.KeyCode == Keys.Up)//c
MessageBox.Show("UP");//d
}
}


اگه Form_KeyDown جواب نداد تو PreviewKeyDown فرمت بنویس .

Ms.lemon
یک شنبه 07 آبان 1391, 00:21 صبح
ممنون، ولی نمیشه

arash.abdollahikakroodi
یک شنبه 07 آبان 1391, 08:43 صبح
دوست عزیز key press خیلی از کلید هارو نمیشناسه ، شما باید از key down یا key up استفاده کنید

harani
یک شنبه 07 آبان 1391, 10:35 صبح
دوست عزیز key press خیلی از کلید هارو نمیشناسه ، شما باید از key down یا key up استفاده کنید

خب داره از Keydown استفاده میکنه که !!!؟؟


از این کد استفاده کن .(البته فکر کنم اگر تو برنامت تکست باکس باشه باید چند بارUp رو فشار بدی تا جواب بده) KeyPreview فرمت رو هم باید حتماً true باشه .


bool play;//a
private void btnPlay_Click(object sender, EventArgs e)//b
{
play = true;//c
this.Focus();//d
}

private void Form1_KeyDown(object sender, KeyEventArgs e)//d
{
if (play)//e
{
if (e.KeyCode == Keys.Up)//f
MessageBox.Show("Up");//g
play = false;//h

}
}

Ms.lemon
یک شنبه 07 آبان 1391, 12:43 عصر
دوست عزیز key press خیلی از کلید هارو نمیشناسه ، شما باید از key down یا key up استفاده کنید

ممنون ولی keydown را هم امتحان کردم جواب نداد

Ms.lemon
یک شنبه 07 آبان 1391, 12:46 عصر
خب داره از Keydown استفاده میکنه که !!!؟؟


از این کد استفاده کن .(البته فکر کنم اگر تو برنامت تکست باکس باشه باید چند بارUp رو فشار بدی تا جواب بده) KeyPreview فرمت رو هم باید حتماً true باشه .


bool play;//a
private void btnPlay_Click(object sender, EventArgs e)//b
{
play = true;//c
this.Focus();//d
}

private void Form1_KeyDown(object sender, KeyEventArgs e)//d
{
if (play)//e
{
if (e.KeyCode == Keys.Up)//f
MessageBox.Show("Up");//g
play = false;//h

}
}


بابت پیگیری تون ممنون ولی باز هم نشد، من کد کامل و فرم را این توی پست بعدی نشد

Ms.lemon
یک شنبه 07 آبان 1391, 12:48 عصر
94403

این هم کدها، با keypress و preview هم امتحان کردم:


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

{
bool play = false;
public Form1()
{
InitializeComponent();
this.Activate();
}

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{

}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (play == true)
{
if (e.KeyCode == Keys.Up)//f
MessageBox.Show("Up");//g
play = false;
}


}

private void Form1_Load(object sender, EventArgs e)
{
this.Select();
}

private void button1_Click(object sender, EventArgs e)
{
play = true;
this.Focus();

}

private void Form1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
/* if (play == true)
{
switch (e.KeyValue)
{
case (char)(Keys.Up):
{
MessageBox.Show("Key Up");
break;
}
}
}*/
}
}
}

Ms.lemon
یک شنبه 07 آبان 1391, 22:48 عصر
توی نت که سرچ کردم پاسخ سئوالمو پیدا کردم، با نوشتن این رویداد مشکل حل میشه:


protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (play == true)
if (keyData == Keys.Left)
{
MessageBox.Show("left");
return true;
}
// etc..
return base.ProcessCmdKey(ref msg, keyData);
}