check for shift/control

How do I check if the shift or control key is down?
Currently, I set a variable under onkeydown & unset it under onkeyup; I'd rather check it programmatically at the time the event is called (basically, I want people to be able to ctrl-click or shift-click on buttons/tlistview headers)
LVL 1
delphiexpertAsked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
alanwhincupConnect With a Mentor Commented:
Ok...I'll take them, Cheers Madshi... :-)
0
 
alanwhincupCommented:
Try this:

function HighOrderBitSet(W : Word) : Boolean;
const
  HighOrderBit = 15;
type
  BitSet = set of 0..15;
begin
  HighOrderBitSet := (HighOrderBit in BitSet(W));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if HighOrderBitSet(Word(GetKeyState(VK_CONTROL))) = True then
    Label1.Caption := 'Shift is Down'
  else
    Label1.Caption := 'Shift is UP';
  if HighOrderBitSet(Word(GetKeyState(VK_SHIFT))) = True then
    Label2.Caption := 'CTRL is Down'
  else
    Label2.Caption := 'CTRL is UP';
end;

Other Virtual Keys you may want include:

VK_LSHIFT
VK_RCONTROL

Cheers,

Alan

0
 
kretzschmarCommented:
use then onMouseUp or OnMouseDown-events,
there is a ShiftState provided like

if ssControl in Shift then ... //ControlKey pressed
or
if ssShift in Shift then ... //Shift pressed
0
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
MadshiCommented:
Instead of this:

if HighOrderBitSet(Word(GetKeyState(VK_CONTROL))) = True then

You can directly write:

if HighOrderBitSet(Word(GetKeyState(VK_CONTROL))) then

Furthermore to make it shorter you can remove the "HighOrderBitSet" function and directly write:

if GetKeyState(VK_CONTROL) and $8000 <> 0 then

Then the label captions for control and shift are not swapped in Alan's example code.

Regards, Madshi.
0
 
delphiexpertAuthor Commented:
Well, thanks Alan & madshi.. both your answers are fine; tho madshi's is a bit more compact...

guess I should give alan the points?
0
 
MadshiCommented:
Okay for me.
0
 
alanwhincupCommented:
Cheers, but you can give Madshi the points if you want to seeing he gave the final answer... Choice is up to you.
0
 
MadshiCommented:
But Alan was first, I just gave some comments. So I think Alan has earned the points more...   :-)
0
 
kretzschmarCommented:
hehe, if no one wants the points ... :-))
0
 
delphiexpertAuthor Commented:
There you go! :)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.