添加WM_KEYDOWN函数。在函数体中case WM_KEYDOWN: if (wParam==VK_LEFT)//方向键左 { rect1left-=10; rect1right-=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_RIGHT)//方向键右 { rect1left+=10; rect1right+=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_UP)//方向键上 { rect1top-=10; rect1bottom-=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_DOWN)//方向键下 { rect1top+=10; rect1bottom+=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_PRIOR)//PG UP { rect1top-=10; rect1bottom-=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_NEXT)//PG DN { rect1top+=10; rect1bottom+=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_HOME)//HOME { rect1left-=10; rect1right-=10; InvalidateRect (hWnd,NULL,TRUE); } else if (wParam==VK_END)//END { rect1left+=10; rect1right+=10; InvalidateRect (hWnd,NULL,TRUE); } break;
我估计你分数给的在高也没人回答。来个这样的代码太麻烦了。而且百度金币用处也不大。
不过,我可以写几个鼠标函数给你参考一下。
首先了解一下鼠标的中断。
_AX=0x01 表示显示光标
_AX=0x02 停止显示光标
_AX=0x03 读取光标位置与案件
_AX=0x04 设置光标位置
所以啊。根据这四个中断,有以下几个函数
----------------------------------------------------
void MouseOn(void)//鼠标光标显示
{
_AX = 0x01;
geninterrupt(0x33);
}
----------------------------------------------------
void MouseOff(void)//鼠标光标隐藏
{
_AX = 0x02;
geninterrupt(0x33);
}
---------------------------------------------------
void MouseSetXY(int x,int y)//设置当前位置
{
_CX = x,
_CD = y;
_AX = 0x04;
geninterrupt(0x33);
}
---------------------------------------------------
int LeftPress(void)//鼠标左键按下
{
_AX = 0x33;
geninterrupt(0x33);
return(_BX&1);
}
-----------------------------------------------------
鼠标右键的应该也会了吧。不过要return(_BX&2);
-----------------------------------------------------
void MouseGetXY(void)//得到当前位置
{
_AX = 0x33;
geninterrupt(0x33);
MouseX = _CX;
MouseY = _DX;
}
---------------------------------------------------------------
最好要复制粘贴,打字打得手疼。
你可以使用热键来实现你要的功能 不需要窗口焦点 代码如下using SystemRuntimeInteropServices; [DllImport("user32dll", EntryPoint = "RegisterHotKey")]
public static extern bool RegisterHotKey
(
IntPtr hWnd, //要注册热键的窗口句柄
int id, //热键编号
int fsModifiers, //特殊键如:Ctrl,Alt,Shift,Window
int vk //一般键如:A B C F1,F2 等
); [DllImport("user32dll", EntryPoint = "UnregisterHotKey")]
public static extern bool UnregisterHotKey
(
IntPtr hWnd, //注册热键的窗口句柄
int id //热键编号上面注册热键的编号
);
private const int WM_HOTKEY = 0x312;
private enum MyKeys
{
None = 0,
Alt = 1,
Ctrl = 2,
Shift = 4,
Win = 8
}
private void Form1_Load(object sender, EventArgs e)
{
RegisterHotKey(thisHandle, 1, (int)(MyKeysCtrl | MyKeysAlt), (int)KeysW);//Ctrl+Alt+W
RegisterHotKey(thisHandle, 2, (int)(MyKeysNone), (int)KeysH);//直接按H
} private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
UnregisterHotKey(thisHandle, 1);
UnregisterHotKey(thisHandle, 2);
} protected override void WndProc(ref Message m)
{
if (mMsg == WM_HOTKEY)
{
switch (mWParamToInt32())
{
case 1://按Ctrl+Alt+W时显示窗体
thisShow();
thisWindowState = FormWindowStateNormal;
break;
case 2://直接按H输出AAAA
MessageBoxShow("AAAA");
break;
default:
break;
}
}
baseWndProc(ref m);
}
你的问题并未说清楚。在你这个循环里,不能放在12行后面。因为while(sec>0)中要判断sec是否大于0,如果放在12行后面那么sec被后面的语句改变以了的话,就有问题了。另外,因为while前有一句scanf("%d",&sec);,12行后面再scanf("%d",&sec);的话不是两个语句重复了?若去掉while前的scanf("%d",&sec);,那么第一次进入while(sec>0)时sec还没有赋值,则要出错。所以这段代码的结构决定了scanf("%d",&sec);放在while循环的最后是合理的。放在什么地方是代码结构决定的,并不是while中的scanf("%d",&sec);一定要放在最后……
以上就是关于在c语言中什么函数能实现识别键盘上的按键全部的内容,包括:在c语言中什么函数能实现识别键盘上的按键、c语言 获取鼠标键盘事件、C#中怎么获取键盘的记录,窗口没焦点也能获取的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)