|
Have a read of this thread.
|
|
|
|
|
I'm trying to capture the event where the user selects, say, Shift + 8 (hence * should be captured as a key).
The problem seems to be that the value for the '8' key ("D8") is retained whilst the value for the Shift keys ("LShiftKey" and "RShiftKey") are overwritten with the value "D8".
Would it be possible to use NativeMethods or System.Windows.Forms.Keys within this context?
E.g.
<pre>
if ((NativeMethods.GetKeyState(VK_SHIFT) & 0x8000) != 0)
{
//SHIFT is pressed
sb.AppendLine("Shift is pressed.");
}
</pre>
I'm currently assuming a UK keyboard.
Any more ideas on how to go about it please?
<pre>
private void keyPressed_KeyIntercepted(ref KeyboardHook.KeyboardHookEventArgs e)
{
keyAndModifier[0] = e.KeyName; // D8
if (keyAndModifier[0] == null) // null value
{
keyAndModifier[1] = e.KeyName; //somehow needs to be set to "LShiftKey" or "RShiftKey", so that the code works
}
else
{
// do nothing
}
switch (e.KeyName)
{ //...
case "D8":
{
if (keyAndModifier[1] == "LShiftKey" || keyAndModifier[1]== "RShiftKey")
//does NOT work because code never reads the Shift keys
{
btnMultiply.PerformClick();
break;
}
else
{
btnEight.PerformClick();
break;
}
}
//...
}
</pre>
Jon
|
|
|
|
|
Hi Jon,
what is all this? NativeMethods? KeyboardHookEventArgs?
there are many ways to figure out the state of the modifier keys in .NET Framework:
- keyboard events provide a KeyEventArgs argument, with properties
such as Control, Shift, and Alt
- Control class has a Control.ModifierKeys property that works everywhere.
Why do you care about "D8"? All the keys have a symbol defined for them, see Keys Enumeration.
BTW: seems like you created your message with some tool, then tried to paste it in here;
if so, first uncheck the "auto-encode..." checkbox, so it does not escape the HTML
commands; that way PRE tags will really work, code will be much more readable.
Luc Pattyn [Forum Guidelines] [My Articles]
This month's tips:
- before you ask a question here, search CodeProject, then Google;
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get;
- use PRE tags to preserve formatting when showing multi-line code snippets.
|
|
|
|
|
Do u have any sample code?
Jon
|
|
|
|
|
Sorry, I don't do sample code.
There is documentation with examples (Google!), there is tons of CP articles (use
the search box), and there are forums like this one to ask specific questions.
That is plenty.
Luc Pattyn [Forum Guidelines] [My Articles]
This month's tips:
- before you ask a question here, search CodeProject, then Google;
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get;
- use PRE tags to preserve formatting when showing multi-line code snippets.
|
|
|
|
|
Didn't find any working examples as yet to be honest.
With the code I'm currently using I can say, capture <8>, but I can't validate whether the user has selected <Shift> + <8> (Problem)
Code above uses source code provided within a Cp article. With the current implementation, the Shift keystrokes are captured, but I would like to validate them, i.e. something like this:
<PRE>
if (e.KeyName == Keys.Shift) { MessageBox.Show("Horray! Shift"); }
//does not work
</PRE>
Ref.
Low-level Windows API hooks from C# to stop unwanted keystrokes @
http://www.codeproject.com/KB/system/CSLLKeyboard.aspx
Any <i>pragmatic</i> ideas would help.
<PRE>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace TestApp02
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.KeyUp += new KeyEventHandler(keyPressed); //event handler
}
private void keyPressed(Object sender, KeyEventArgs e) //code does not pass through here
{
if (e.KeyValue == (int) Keys.ShiftKey) //messy - TO BE REPLACED
{ listBox2.Items.Add(e.KeyValue); }
listBox1.Items.Add(e.KeyValue);
}
private void button1_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
listBox2.Items.Clear();
}
}
}</PRE>
Jon
modified on Sunday, March 30, 2008 3:42 AM
<div class="ForumMod">modified on Sunday, March 30, 2008 4:03 AM</div>
|
|
|
|
|
Hi Jon,
jon_80 wrote: //does not work
that is no information. does it compile? does it generate a compile-time error?
if so, which one? does it generate a run-time error? if so, which one? does it
cause a computer melt-down? what?
I repeat: read the documentation
1. on KeyPressed event it says: The KeyPress event is not raised by noncharacter keys;
however, the noncharacter keys do raise the KeyDown and KeyUp events.
so why would you do your messy shift test in keyPressed()?
2. on KeyPressed event: there is a KeyPressEventArgs with a KeyChar property, which
holds the VALUE of the effective key or key combination
3. on KeyDown event it offers a KeyEventArgs which has a Shift property
4. on Control.ModifierKeys Property: Gets a value indicating which of the modifier keys
(SHIFT, CTRL, and ALT) is in a pressed state.
So the only real problem is you have to choose one of many good ways...
AND AGAIN: stop abusing the PRE tags; do you ever reread your post, and check it looks
the way you intended?
this probably was my last reply on this thread.
Luc Pattyn [Forum Guidelines] [My Articles]
This month's tips:
- before you ask a question here, search CodeProject, then Google;
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get;
- use PRE tags to preserve formatting when showing multi-line code snippets.
|
|
|
|
|
Luc Pattyn wrote: this probably was my last reply on this thread.
Bottom line. Shift happens.
|
|
|
|
|
Sh*fting my attention to more promising threads is bound to happen indeed.
Maybe I'll discover a nice haiku in Nantucket?
a real one, with 17 syllables (on for intimi) if at all possible.
Luc Pattyn [Forum Guidelines] [My Articles]
This month's tips:
- before you ask a question here, search CodeProject, then Google;
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get;
- use PRE tags to preserve formatting when showing multi-line code snippets.
|
|
|
|
|
Luc Pattyn wrote: Maybe I'll discover a nice haiku in Nantucket?
a real one, with 17 syllables (on for intimi) if at all possible.
Very nice.
|
|
|
|
|
Hello!
I am writing an application that works with a SQL Server DB, and what I need is
to send some info to the DB, and get a true / false answer from the DB.
I was working always with SQLDataAdapter, but I don't need a SELECT query,
but actually an answer (like return in c#).
How can I do it in C#, and what kind of query should it be?
Thanks in advance!
|
|
|
|
|
You can use SqlCommand object to execute any sql command you wish.
Giorgi Dalakishvili
#region signature
my articles
#endregion
|
|
|
|
|
But, can I get a return value from the DB using SqlCommand?
|
|
|
|
|
Yes, you can. You can use ExecuteScalar method or by using output parameters. What command are you trying to run?
Giorgi Dalakishvili
#region signature
my articles
#endregion
|
|
|
|
|
I don't know yet, but I know that depending on some data in the db, it should return true or
false.
|
|
|
|
|
Then just use ExecuteScalar
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Thanks! I hope I will manage with returning the value in SQL.
Thanks again!
|
|
|
|
|
It's not so hard, but it depends on your query. Is it a regular query or a stored procedure? if it is a sotred procedure, do you use output parameters or a regular return value. Here is some sample code:
using(SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
string sql = "SELECT BitColumn FROM Table WHERE Name = 'Luis'";
SqlCommand cmd = new SqlCommand(sql, conn);
bool result = Convert.ToBoolean(cmd.ExecuteScalar());
cmd = new SqlCommand("sp_Test", conn);
cmd.Parameters.Add("@BoolVal", SqlDbType.Boolean).Direction = ParameterDirection.Output;
cmd.Parameters.Add("RetVal", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery();
int result1 = Convert.ToInt32(cmd.Parameters["RetVal"].Value);
bool result2 = Convert.ToBoolean(cmd.Parameters["@BoolVal"].Value);
} For the second example, you will need a stored procedure like this:
CREATE PROCEDURE sp_Test (@BoolVal bit OUT) AS
BEGIN
-- Return in output parameter
SELECT @BoolVal = BitColumn FROM Table WHERE NAME = 'Luis';
-- Return value of the stored procedure
IF @BoolVal IS NULL
RETURN 0
ELSE
RETURN 1
END When you execute a query, it returns a resultset (a table with data). A stored procedure that SELECTs something and doesn't get it into a variable is returning a resultset. ExecuteReader and data adapters get the whole resultset, but ExecuteScalar gets the data in the first column of the first row of the first table (useful for returning one value).
The stored procedure example calls ExecuteNonQuery because no resultset is returned. Output values are either an output parameter or the return value. You access both through the Commands collection of the SqlCommand object.
I hope this helps!
|
|
|
|
|
Thank you very much!
Just one more question: If I decide to write a stored procedure, where do I store it?
When you write "cmd = new SqlCommand("sp_Test", conn);", how will SQL Server know what "sp_Test" is?
Have a nice day!
|
|
|
|
|
Yevgeny Efter wrote: If I decide to write a stored procedure, where do I store it?
It goes in your SQL Server database. You need to run the SQL query so the SP is created (the CREATE PROCEDURE thing). Search Google for "SQL server stored procedures"[^] and you will get a lot of info.
Yevgeny Efter wrote: When you write "cmd = new SqlCommand("sp_Test", conn);", how will SQL Server know what "sp_Test" is?
Sorry, I missed that part (I didn't compile and run the code). By default it is a regular query (CommandType.CommandText ). For a SP, you must specify it:
cmd.CommandTpe = CommandType.StoredProcedure; I hope this helps!
|
|
|
|
|
Thank you very much!
Have a nice day!
|
|
|
|
|
Greetings,
How do I get the Windows Software Development Kit by Microsoft. I have VS2005 and VS2008 is shipping. Does it come with VS2008 or did it come with VS2005? Or do I have to download/purchase it?
Thanks,
BP
|
|
|
|
|
|
Hi,
I have decided to make a modeling tool in my spare time to improve my skills. The tool will have several nodes and edges. I want to make it so (if possible) that each node has its own renderer, and within that renderer you call the OnPaint method which would paint the node onto a Control.
Does anyone know where I'd start with this? or any links i could read up on.
Also, if someone thinks this way is a bad idea and there is a better way of painting the nodes/edges etc, say so.
Regards,
Gareth.
|
|
|
|
|
Charles Petzold has an excellent book on working with .NET that explains how to do this called "Programming Microsost Windows with C#". It is quite an in depth book and will show you a lot about how the graphics system works.
|
|
|
|