C语言鼠标操作方法及源码
VC 模拟鼠标和键盘输入
VC 模拟鼠标和键盘输入 - 天下 - 博客频道 -模拟鼠标点击:1、这里是鼠标左键按下和松开两个事件的组合即一次单击:mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )2、模拟鼠标右键单击事件:mouse_event (MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 )3、两次连续的鼠标左键单击事件构成一次鼠标双击事件:mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )4、使用绝对坐标MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 500, 500, 0, 0需要说明的是,如果没有使用MOUSEEVENTF_ABSOLUTE,函数默认的是相对于鼠标当前位置的点,如果dx,和dy,用0,0表示,这函数认为是当前鼠标所在的点--直接设定绝对坐标并单击mouse_event(MOUSEEVENTF_LEFTDOWN, X * 65536 / 1024, Y * 65536 / 768, 0, 0);mouse_event(MOUSEEVENTF_LEFTUP, X * 65536 / 1024, Y * 65536 / 768, 0, 0);其中X,Y分别是你要点击的点的横坐标和纵坐标模拟键盘输入:[cpp]void EnterString(const char* text) { bool bShift = false; size_t length = strlen(text);for(size_t index = 0;index < length;index++) { int val = text[index];if(val >= 97 && val <= 122) //小写a-z {val -= 32; bShift = false; } else if(val>= 65 && val <= 90) //大写A-Z { bShift = true;} else if(val >= 48 && val <= 57) //数字0-9 { bShift = false; } else //特殊符号{ switch(val) { case '`':val = 192; bShift = false;break; case '~': val = 192;bShift = true; break; case '!':val = '1'; //!和1在同一个键盘,使用同一个键盘码,以下相同bShift = true; break; case '@': val = '2'; //@和2在同一个键盘,使用同一个键盘码,以下相同bShift = true; break; case '#': val = '3'; bShift = true;break; case '$': val = '4';bShift = true; break; case '%':val = '5'; bShift = true;break; case '^': val = '6';bShift = true; break; case '&':val = '7'; bShift = true;break; case '*': val = '8';bShift = true; break; case '(':val = '9'; bShift = true;break; case ')': val = '0';bShift = true; break; case '-':val = 189; bShift = false;break; case '=': val = 187;bShift = false; break; case '_':val = 189; bShift = true;break; case '+': val = 187;bShift = true; break; case '[':val = 219; bShift = false;break; case '{': val = 219;bShift = true; break; case ']':val = 221; bShift = false;break; case '}': val = 221;bShift = true; break; case '\\':val = 220; bShift = false;break; case '|': val = 220;bShift = true; break; case ';':val = 186; bShift = false;break; case ':': val = 186;bShift = true; case '\'': val = 222; bShift = false; break; case'\"': val = 222; bShift = true;break; case ',': val = 188;bShift = false; break; case '<': val = 188; bShift = true;break; case '.': val = 190;bShift = false; break; case '>':val = 190; bShift = true;break; case '/': val = 191;bShift = false; break; case '?':val = 191; bShift = true;break; default: break;} } if(bShift)keybd_event(VK_SHIFT,0,0,0); keybd_event(val,0,0,0);keybd_event(val,0,KEYEVENTF_KEYUP,0); if(bShift)keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0); } }但是要注意,如果用户默认是中文输入法,那我们得先想办法切换到英文输入法才行。
c获取鼠标坐标的各种方法
c获取鼠标坐标的各种方法获取鼠标坐标在编写一些程序中是非常常见的需求,它是实现一些事件或功能的基础。
本文将介绍在C语言环境下,获取鼠标坐标的各种方法。
一、使用Windows API函数Windows API函数是Windows操作系统提供的一种函数库,它可以访问操作系统的各种资源和功能。
对于Windows系统,可以使用Windows API函数获取鼠标坐标。
步骤如下:1.包含Windows API的头文件:#include <Windows.h>2.在程序主函数中,调用GetCursorPos函数获取鼠标坐标。
POINT point;GetCursorPos(&point);printf("Current mouse position is (%d,%d)\n", point.x, point.y);这里POINT是Windows API中用于表示坐标的数据类型,GetCursorPos是获取鼠标坐标的函数。
二、使用标准ASCII码值在C语言中,标准ASCII码值为十进制整数,可以使用getch()函数获取用户输入的字符的ASCII码值。
步骤如下:1.包含获取输入字符的头文件:#include <conio.h>2.在程序主函数中,使用getch()函数获取用户输入的ASCII码值。
int ch;printf("Please move your mouse and press any key to get the coordinates:\n");ch = getch();if (ch != 0xE0 && ch != 0){printf("Could not get the mouse coordinates.\n");return 1;}int x = getch();int y = getch();printf("Current mouse position is (%d,%d)\n", x, y);这里使用了两次getch()函数获取用户输入的ASCII码值,第一次获取到的是0xE0或0的标识位,第二次和第三次获取到的是鼠标当前坐标的ASCII码值。
鼠标代码文档
鼠标代码鼠标是计算机输入设备的一种,用于控制光标在屏幕上的移动、点击和拖动。
在编程中,我们可以通过使用鼠标代码来实现对鼠标的控制和操作。
本文将介绍一些常用的鼠标代码以及它们的应用。
1. 鼠标移动鼠标移动是鼠标操作中最基本的功能之一。
我们可以使用鼠标代码来控制鼠标在屏幕上的移动。
以下是一个示例代码:import pyautogui# 将鼠标移动到屏幕的坐标(100, 100)处pyautogui.moveTo(100, 100)以上代码使用了pyautogui库中的moveTo()函数来将鼠标移动到指定的坐标。
2. 鼠标点击鼠标点击是鼠标操作中非常常用的功能之一。
我们可以使用鼠标代码来模拟鼠标的点击操作。
以下是一个示例代码:import pyautogui# 在屏幕的坐标(200, 200)处进行一次左键点击pyautogui.click(200, 200)以上代码使用了pyautogui库中的click()函数来模拟鼠标的点击操作。
默认情况下,click()函数会模拟鼠标的左键点击操作。
我们也可以通过传入button参数来模拟鼠标的右键点击操作。
3. 鼠标滚轮滚轮是许多鼠标上都有的一个功能,用于在屏幕上进行垂直滚动。
我们可以使用鼠标代码来模拟鼠标滚轮的操作。
以下是一个示例代码:import pyautogui# 向上滚动鼠标滚轮一次pyautogui.scroll(1)# 向下滚动鼠标滚轮一次pyautogui.scroll(-1)以上代码使用了pyautogui库中的scroll()函数来模拟鼠标滚轮的操作。
scroll()函数的参数可以为正数或负数,表示向上或向下滚动的次数。
4. 鼠标拖拽鼠标拖拽是鼠标操作中的一项重要功能,用于在屏幕上进行物体的拖动操作。
我们可以使用鼠标代码来模拟鼠标拖拽的操作。
以下是一个示例代码:import pyautogui# 将鼠标拖拽到屏幕的坐标(300, 300)处pyautogui.dragTo(300, 300)以上代码使用了pyautogui库中的dragTo()函数来模拟鼠标拖拽的操作。
C#控制鼠标动作
C#控制鼠标动作可以通过两个函数操作鼠标:1. [DllImport("user32.dll")]2.static extern bool SetCursorPos(int X, int Y);3. [DllImport("user32.dll")]4.static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo);5. [Flags]6.enum MouseEventFlag : uint7. {8. Move = 0x0001,9. LeftDown = 0x0002,10. LeftUp = 0x0004,11. RightDown = 0x0008,12. RightUp = 0x0010,13. MiddleDown = 0x0020,14. MiddleUp = 0x0040,15. XDown = 0x0080,16. XUp = 0x0100,17. Wheel = 0x0800,18. VirtualDesk = 0x4000,19. Absolute = 0x800020. }SetCursorPos使鼠标移动到指定位置;mouse_event使用MouseEventFlag枚举中的Move,也可以使鼠标移动。
mouse_event中使用不同的枚举值可以模拟不同的鼠标事件。
值得注意的是有几点:1. 我们不能用mouse_event(, 10, 10, 0, );去模拟在(10, 10)处的左键事件,我们需要把这步拆成两步:第一步:移动鼠标到(10,10)处,用SetCursorPos(10, 10);第二步:触发左键,用mouse_event(, 0, 0, 0, );本质上是两步的事件,不能把window API 想的太聪明,认为它会自动跑到(10,10)处,再左键2. MouseEventFlag的枚举值可以多个一起用,使用| 操作符鼠标左键按下和松开两个事件的组合即一次单击: mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )两次连续的鼠标左键单击事件构成一次鼠标双击事件: mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )mouse_event (MOUSEEVENTF_LEFTDOWN |MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )3. MouseEventFlag中有个Absolute枚举,如果没指定Absolute,那么mouse_event的操作是相对于上次鼠标所在的位置;如果指定了Absolute,那么是相对于整个屏幕坐标的位置。
模拟鼠标事件的实现思路及代码
模拟鼠标事件的实现思路及代码鼠标事件是指在计算机应用程序中,用户通过鼠标和其它输入设备进行操作时产生的一系列事件。
鼠标事件包括点击、双击、移动、按下和释放等操作,对于许多交互式应用程序来说,鼠标事件是非常重要的。
在本文中,我将介绍一种实现模拟鼠标事件的思路,并提供相关的代码示例。
实现思路:1.首先,需要确定要模拟的鼠标事件的类型。
常见的鼠标事件包括点击、双击、移动、按下和释放等。
根据所需的具体功能,选择相应的事件类型。
2.确定事件的触发方式。
鼠标事件可以通过多种方式触发,例如在窗口中点击鼠标按钮、按下键盘上的一些按键等。
3. 通过操作系统提供的API或库函数,模拟鼠标事件的产生。
不同的操作系统提供不同的API或库函数来模拟鼠标事件。
在Windows操作系统中,可以使用Win32 API提供的函数来模拟鼠标事件;在Linux操作系统中,可以使用X Window系统提供的函数来模拟鼠标事件;在Mac OS操作系统中,可以使用Quartz库提供的函数来模拟鼠标事件。
4.编写代码实现相应的模拟鼠标事件功能。
根据所选的编程语言和操作系统,编写代码来实现模拟鼠标事件的功能。
代码应包括鼠标事件的触发、产生和处理等逻辑。
代码示例:下面是一个使用C#语言在Windows操作系统上实现模拟鼠标点击事件的代码示例:```csharpusing System;class Program[DllImport("user32.dll")]public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, UIntPtr dwExtraInfo);const uint MOUSEEVENTF_LEFTDOWN = 0x02;const uint MOUSEEVENTF_LEFTUP = 0x04;static void Main(string[] args)//模拟鼠标点击事件SimulateMouseClick(500, 500);}static void SimulateMouseClick(int x, int y)//移动鼠标到指定位置SetCursorPosition(x, y);//模拟鼠标按下并释放左键mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, UIntPtr.Zero);mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, UIntPtr.Zero);}static void SetCursorPosition(int x, int y)SetCursorPos(x, y);}[DllImport("user32.dll")]private static extern bool SetCursorPos(int X, int Y);```上述代码通过调用Windows提供的`mouse_event`函数,模拟鼠标点击事件。
getmousemsg函数
getmousemsg函数GetMouseMsg函数是C语言中用于获取鼠标消息的一个重要函数。
它可以在Windows和DOS环境下获取鼠标消息,利用它可以实现许多有关鼠标的应用。
下面是GetMouseMsg函数的使用步骤:一、头文件及参数说明使用GetMouseMsg函数需要引入以下头文件:#include<graphics.h>//graphics.h库文件提供了getmouse、clearmouseclick和下列类型结构的定义:struct mousestatus{int x,y;//鼠标的x,y坐标int buttons;//表示鼠标键的状态};也需要了解以下参数的含义:int[左键][右键][中键];1 = 按下鼠标键0 = 松开鼠标键二、初始化在使用GetMouseMsg函数前,需要初始化鼠标信息。
初始化时需要传入图形界面的路径。
initgraph(int *graphicedriver , int *graphmode , char*path);三、获取鼠标消息在初始化完成之后,我们就可以调用GetMouseMsg函数获取鼠标的消息。
GetMouseMsg函数的返回值是一个结构体类型,包含鼠标的坐标和状态信息。
例子:while(1){mousestatus m;m=getmouse();if(m.buttons==1){putpixel(m.x,m.y,WHITE);}}四、清除鼠标单击在使用鼠标单击之后,需要清除鼠标单击状态。
void clearmouseclick(int kind);kind是指鼠标键类型,具体取值如下:1:左键2:右键3:中键-1:清除所有单击消息五、结束程序当程序完成后,需要调用closegraph函数关闭图形界面。
closegraph();总之,使用GetMouseMsg函数可以轻易实现鼠标监听和菜单交互等应用。
模拟鼠标的操作方法
模拟鼠标的操作方法
模拟鼠标的操作方法通常可以使用编程语言提供的相关函数或库来实现。
下面是一些常见的操作方法:
1. 鼠标移动:可以使用`MouseMove`函数来模拟鼠标的移动操作。
该函数接受两个参数,分别是鼠标移动到的目标位置的横坐标和纵坐标。
例如,
`MouseMove(x, y)`可以将鼠标移动到坐标为(x, y)的位置。
2. 鼠标点击:可以使用`MouseClick`函数来模拟鼠标的点击操作。
该函数接受一个参数,表示点击的按钮。
例如,`MouseClick("left")`表示模拟鼠标左键的点击操作。
3. 鼠标双击:可以使用`MouseDoubleClick`函数来模拟鼠标的双击操作。
该函数接受一个参数,表示双击的按钮。
例如,`MouseDoubleClick("left")`表示模拟鼠标左键的双击操作。
4. 鼠标拖动:可以使用`MouseDown`、`MouseMove`和`MouseUp`等函数来模拟鼠标的拖动操作。
首先使用`MouseDown`函数按下鼠标按钮,然后使用`MouseMove`函数移动鼠标到目标位置,最后使用`MouseUp`函数释放鼠标按钮。
例如,`MouseDown("left")`、`MouseMove(x, y)`和`MouseUp("left")`可以模拟鼠标左键的拖动操作。
需要注意的是,具体的操作方法可能因编程语言和操作系统的不同而有所差异。
c语言中任意形状鼠标的实现方法
c语言中任意形状鼠标的实现方法在C语言中,可以使用图形库来实现任意形状的鼠标。
例如,Windows平台下,可以使用WinAPI中的CreateCursor函数来自定义鼠标形状。
具体步骤如下:1. 定义一个CURSORINFO结构体,包含鼠标图像的参数,例如宽度、高度、热点(即鼠标指针在图像中的位置)等。
2. 使用CreateCursor函数创建自定义鼠标图案,函数的参数为CURSORINFO结构体指针,返回一个HCURSOR类型的句柄。
3. 使用SetCursor函数将自定义的鼠标图案设为当前鼠标图案,函数的参数为HCRUSOR类型的句柄。
下面是一个示例代码,实现一个自定义的鼠标图案:```#include <windows.h>int main() {// 定义鼠标图像参数int width = 32;int height = 32;int xHotspot = 16;int yHotspot = 16;BYTE andMask[128] = {0xFF};BYTE xorMask[128] = {0};// 创建光标HCURSOR hCursor = CreateCursor(GetModuleHandle(NULL),xHotspot, yHotspot, width, height, andMask, xorMask); // 设为当前鼠标光标SetCursor(hCursor);// 进入消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return 0;}```该示例创建了一个宽度和高度都为32像素、热点在中心位置的光标,并将其设为当前光标,程序进入消息循环。
你可以自己定义鼠标图案,更改示例中的andMask和xorMask数组来实现。
C语言鼠标操作方法及源码
C语言鼠标操作方法及源码C语言不是直接支持鼠标操作的,因为C语言是一种面向过程的编程语言,主要用于系统级编程和应用程序开发。
而鼠标操作通常是通过操作系统提供的图形界面库来实现的,如Windows中的WinAPI或Linux中的X窗口系统等。
在C语言中,可以使用图形界面库或API来实现鼠标操作。
以下是一个使用WinAPI实现鼠标操作的例子:```c#include <windows.h>LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)switch (uMsg)case WM_MOUSEMOVE:int xPos = LOWORD(lParam);int yPos = HIWORD(lParam);//处理鼠标移动事件printf("鼠标移动到坐标 (%d, %d)\n", xPos, yPos);break;}case WM_LBUTTONDOWN:int xPos = LOWORD(lParam);int yPos = HIWORD(lParam);//处理鼠标左键按下事件printf("鼠标左键按下,坐标 (%d, %d)\n", xPos, yPos); break;}case WM_LBUTTONUP:int xPos = LOWORD(lParam);int yPos = HIWORD(lParam);//处理鼠标左键松开事件printf("鼠标左键松开,坐标 (%d, %d)\n", xPos, yPos); break;}//其他鼠标事件的处理...}return DefWindowProc(hwnd, uMsg, wParam, lParam);int main//创建窗口HWND hwnd;WNDCLASS wc = {0};wc.lpfnWndProc = WindowProc;wc.hInstance = GetModuleHandle(NULL);wc.lpszClassName = TEXT("MyWindowClass");RegisterClass(&wc);hwnd = CreateWindowEx(0, TEXT("MyWindowClass"), TEXT("C语言鼠标操作示例"), WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL,wc.hInstance, NULL);ShowWindow(hwnd, SW_SHOWDEFAULT);}//消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0))TranslateMessage(&msg);DispatchMessage(&msg);}return 0;```以上代码演示了一个简单的C语言程序,通过使用WinAPI,实现了基本的鼠标操作。
鼠标滚轮算法 c语言
鼠标滚轮算法 c语言以鼠标滚轮算法C语言为标题,本文将介绍鼠标滚轮算法的原理和实现。
鼠标滚轮是计算机鼠标的一种常见输入设备,它可以通过滚动滚轮来控制屏幕上的滚动条或者改变显示内容的大小。
鼠标滚轮算法是指用来处理鼠标滚轮事件的一系列程序和逻辑。
鼠标滚轮算法的实现是基于C语言的,因为C语言是一种广泛应用于系统层面的编程语言,具有高效性和灵活性。
下面将详细介绍鼠标滚轮算法的原理和实现步骤。
我们需要了解鼠标滚轮事件的原理。
鼠标滚轮通常有两个方向:向上滚动和向下滚动。
当用户通过滚动滚轮时,鼠标会发送相应的滚轮事件给计算机。
这些事件包含了滚轮的方向和滚动的距离。
在C语言中,我们可以通过使用鼠标滚轮事件的API来监测和处理滚轮事件。
通常情况下,我们会通过一个循环来不断监听鼠标滚轮事件,直到用户退出程序。
接下来,我们需要确定滚轮滚动的距离对应于显示内容的变化。
一般来说,滚轮向上滚动会使得显示内容向上移动,滚轮向下滚动会使得显示内容向下移动。
我们可以通过增加或减少显示内容的垂直偏移量来实现这个效果。
在C语言中,我们可以使用一个变量来保存显示内容的垂直偏移量。
当监听到滚轮向上滚动的事件时,我们可以将偏移量减小一个固定值,从而使得显示内容向上移动。
类似地,当监听到滚轮向下滚动的事件时,我们可以将偏移量增加一个固定值,从而使得显示内容向下移动。
除了滚动距离的计算,我们还需要考虑一些边界情况。
例如,当滚动到显示内容的最上方或最下方时,我们需要限制偏移量的变化,以防止内容溢出或显示不完整。
在C语言中,我们可以使用条件语句来判断偏移量是否越界,并在发生越界时进行相应的处理。
例如,当偏移量小于最小值时,我们可以将其设置为最小值;当偏移量大于最大值时,我们可以将其设置为最大值。
我们还可以考虑添加一些平滑滚动的效果,以提升用户体验。
例如,我们可以使用缓动函数来调整滚动距离的变化速度,使得滚动过程更加平滑和自然。
总结一下,鼠标滚轮算法的实现主要包括以下几个步骤:监听鼠标滚轮事件、计算滚动的距离、根据滚动的距离调整显示内容的偏移量、处理边界情况和添加平滑滚动效果。
c语言鼠标的操作函数集
C语言的鼠标操作函数集#include<dos.h>#include<graphics.h>#include<conio.h>#include<stdio.h>union REGS regs;int X__max,Y__max,x_max,y_max;void Initgr(void) /*屏幕初始化成图形模式*/{int w,h,grdriver=DETECT,grmode;registerbgidriver(EGAVGA_driver);initgraph(&grdriver,&grmode,"");/*在双引号中可加你tc放的路径,但要在tc里有EGAVGA.BGI这个来初始图形*/if(graphresult())/*若调用不成功,退出*/{printf("\n 调用失败!\n");exit(1);}X__max=getmaxx();/*求横向象点坐标数*/Y__max=getmaxy();/*求纵向象点坐标数*/getaspectratio(&w,&h);/*求纵横比*/x_max=1000; /*设置屏幕坐标的宽度*/y_max=x_max*(float)Y__max*h/((float)X__max*w);}int Msinit(int Xlo,int Xhi,int Ylo,int Yhi)/*鼠标初始化*/{int retcode;regs.x.ax=0;/*初始化鼠标*/int86(0x33,®s,®s);retcode=regs.x.ax;if(retcode==0) return 0;regs.x.ax=7;/*设置鼠标X方向的移动范围*/regs.x.cx=Xlo;regs.x.dx=Xhi;int86(0x33,®s,®s);regs.x.ax=8;/*设置鼠标Y方向的移动范围*/regs.x.cx=Ylo;regs.x.dx=Yhi;int86(0x33,®s,®s);regs.x.ax=15;/*设置mickey与象素的比,这各会影响鼠标移动速度*/ regs.x.cx=(int)(x_max/X__max);regs.x.dx=(int)(y_max/Y__max);int86(0x33,®s,®s);return retcode;}int Msread(int *px,int *py,int *pbuttons)/*读鼠标位置及状态*/ {static int x0=320,y0=240,but0=0;int xnew,ynew,ch;do{if(kbhit()){ch=getch();if(ch==13){*pbuttons=1;return -1;}else return ch; /*返回键盘输入*/}regs.x.ax=3; /*调用功能3,读鼠标位置及状态*/int86(0x33,®s,®s);xnew=regs.x.cx;/*返回鼠标当前的位置的X坐标*/ynew=regs.x.dx;/*返回鼠标当前的位置的Y坐标*/*pbuttons=regs.x.bx;/*返回鼠标当前的状态*/}while(xnew==x0&&ynew==y0&&*pbuttons==but0);/*当鼠标状态改变或位置改变终止循环*/but0=*pbuttons;/*将鼠标状态保存到静态变量中*/x0=xnew;y0=ynew;/*将鼠标位置保存到静态变量中*/*px=xnew;*py=(int)(y_max-ynew);return -1;}int Xpixel(int x)/*由象素坐标变换为屏幕坐标*/{ return (int)((long)X__max*x/x_max);}int Ypixel(int y){ return Y__max-(int)((long)Y__max*y/y_max);}void Cursor(int x,int y) /*显示十字光标*/{int X=Xpixel(x),Y=Ypixel(y),color;char *str=" \0";line(X-8,Y,X-3,Y);line(X,Y-8,X,Y-4);line(X+3,Y,X+8,Y);line(X,Y+4,X,Y+8);color=getcolor();setcolor(BLACK);outtextxy(X__max-100,10,str);/*删除前次显示值*/sprintf(str,"%d,%d",x,y);setcolor(WHITE);outtextxy(X__max-100,10,str);/*在屏幕右上角显示当前光标的坐标*/ setcolor(color);}Void main(){int buttons,X,Y,x,y,a,b;char i;Initgr();/*初始化图形屏幕*/setcolor(EGA_LIGHTRED);/*设置屏幕前景色*/line(1,1,X__max-1,1); /*在屏幕四周画一矩形*/line(1,1,1,Y__max-1);line(X__max-1,1,X__max-1,Y__max-1);line(1,Y__max-1,X__max-1,Y__max-1);setcolor(EGA_WHITE);printf("没\n 按鼠标右键终止程序\n");printf(" 然后按任意键退出");setwritemode(XOR_PUT);/*设置屏幕输出模式*/Msinit(0,(int)x_max,0,(int)y_max);/*初始化鼠标*/a=x_max;b=y_max;x=0;Cursor(a,b); /*在a=x_max;b=y_max;处画指针*/while(x!=2){Msread(&X,&Y,&x);Cursor(a,b); /*删除之前的鼠标,因为屏幕输出模式的关系*/if(x==1){a=(int)(X*1.0/x_max*X__max);b=(int)((y_max-Y)*1.0/y_max*Y__max);circle(a,b,1); } /*画点*/Cursor(X,Y);a=X;b=Y;}Cursor(X,Y);/*再调用一次把原来的指针削掉*/getch();closegraph();}。
VC6讲座_键盘与鼠标编程
VC6讲座(十八)处理键盘和鼠标事件上一讲中我们学习了在MFC程序中使用定时器的方法,并成功地为Schedule添加了报警功能,现在的Schedule已具备了我们在第四讲中提出的基本功能,但是它使用起来仍然不太方便,添加、编辑和删除事件条目的操作都只能通过选取菜单中相应的命令或工具栏上相应的按钮来进行,Schedule还不能接受通过键盘输入的命令,对鼠标的支持也不够强,因此在本讲中,我准备介绍一下处理键盘和鼠标事件的方法,为Schedule添加相应的消息处理函数,并设计一个弹出式菜单,让它作为Schedule的关联菜单。
添加处理键盘输入事件的函数按照Windows程序设计的基本要求,一个WIN32应用程序应该能够处理来自键盘的用户输入,这些键盘输入将以消息的形式被发送到应用程序的窗口处理函数中。
在设计MFC 程序时,我们不用直接编写窗口处理函数,但需要利用ClassWizard来添加相应的消息处理函数。
现在让我们调出ClassWizard,选中CScheduleView类,准备把处理键盘输入的函数放在视类中,不过此时可以发现在Messages列表框中列出了多种与键盘输入有关的消息,例如WM_CHAR、WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN和WM_SYSKEYUP等等,面对这么多的消息,我们应该处理哪一条呢?上述几种消息可以分成两类,一类被称为按键消息(Keystroke Messages),即当用户按下和松开某个键时拥有输入焦点的程序收到的消息,包括有WM_KEYDOWN、WM_KEYUP等四种,它们通常被用来处理键盘命令,另一类被称为字符消息(Character Messages),窗口处理函数在接收到第一类按键消息后,一般都要调用TranslateMessage()函数,该函数检查按键是否对应着一个ASCII字符,如果是的话,就额外放置一条字符消息(即WM_CHAR)到窗口的消息队列之中,字符消息通常被用来处理文字输入。
c#模拟鼠标键盘操作
c#模拟⿏标键盘操作 c#模拟⿏标键盘操作收藏⼀个简单的模拟键盘⿏标操作的类,扩充 VirtualKeys 枚举就可以了,或者直接写!using System;using System.Runtime.InteropServices;using System.Text;class Keyboard{const uint KEYEVENTF_EXTENDEDKEY = 0x1;const uint KEYEVENTF_KEYUP = 0x2;[DllImport("user32.dll")]static extern short GetKeyState(int nVirtKey);[DllImport("user32.dll")]static extern void keybd_event(byte bVk,byte bScan,uint dwFlags,uint dwExtraInfo);public enum VirtualKeys: byte{VK_NUMLOCK = 0x90, //数字锁定键VK_SCROLL = 0x91, //滚动锁定VK_CAPITAL = 0x14, //⼤⼩写锁定VK_A = 62}public static bool GetState(VirtualKeys Key){return (GetKeyState((int)Key)==1);}public static void SetState(VirtualKeys Key, bool State){if(State!=GetState(Key)){keybd_event((byte)Key,0x45,KEYEVENTF_EXTENDEDKEY | 0,);keybd_event((byte)Key,0x45,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,);}}}⽰例:模拟操作Keyboard.SetState(VirtualKeys.VK_CAPITAL,!Keyboard.GetState(VirtualKeys.VK_CAPITAL));得到键盘状态Keyboard.GetState(VirtualKeys.VK_CAPITAL)* ⼗进制值标识符 IBM兼容键盘 --------------------------------------------------------------------------------1 VK_LBUTTON ⿏标左键2 VK_RBUTTON ⿏标右键3 VK_CANCEL Ctrl+Break(通常不需要处理)4 VK_MBUTTON ⿏标中键8 VK_BACK Backspace9 VK_TAB Tab12 VK_CLEAR Num Lock关闭时的数字键盘513 VK_RETURN Enter(或者另⼀个)16 VK_SHIFT Shift(或者另⼀个)17 VK_CONTROL Ctrl(或者另⼀个)18 VK_MENU Alt(或者另⼀个)19 VK_PAUSE Pause20 VK_CAPITAL Caps Lock27 VK_ESCAPE Esc32 VK_SPACE Spacebar33 VK_PRIOR Page Up34 VK_NEXT Page Down35 VK_END End36 VK_HOME Home37 VK_LEFT 左箭头38 VK_UP 上箭头39 VK_RIGHT 右箭头40 VK_DOWN 下箭头41 VK_SELECT 可选42 VK_PRINT 可选43 VK_EXECUTE 可选44 VK_SNAPSHOT Print Screen45 VK_INSERT Insert46 VK_DELETE Delete47 VK_HELP 可选48~57 ⽆ 主键盘上的0~965~90 ⽆ A~Z96~105 VK_NUMPAD0~VK_NUMPAD9 Num Lock打开时数字键盘上的0~9106 VK_NULTIPLY 数字键盘上的*107 VK_ADD 数字键盘上的+108 VK_SEPARATOR 可选109 VK_SUBTRACT 数字键盘上的-110 VK_DECIMAL 数字键盘上的.111 VK_DIVIDE 数字键盘上的/112~135 VK_F1~VK_F24 功能键F1~F24144 VK_NUMLOCK Num Lock145 VK_SCROLL Scroll Lock*/突然发现在c#⾥⾯原来还有⼀个 System.Windows.Forms.SendKeys不过这个只能模拟键盘真正能模拟⿏标操作的代码在这⾥!找的我好⾟苦啊!函数声明:private readonly int MOUSEEVENTF_LEFTDOWN = 0x2;private readonly int MOUSEEVENTF_LEFTUP = 0x4;[DllImport("user32")]public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);调⽤⽅法:mouse_event(MOUSEEVENTF_LEFTDOWN, X * 65536 / 1024, Y * 65536 / 768, 0, 0);mouse_event(MOUSEEVENTF_LEFTUP, X * 65536 / 1024, Y * 65536 / 768, 0, 0);其中X,Y分别是你要点击的点的横坐标和纵坐标。
c 语言setconsolecursorposition的用法
c 语言setconsolecursorposition的用法1. 引言1.1 概述在C语言中,`setconsolecursorposition`函数是用于控制控制台窗口的光标位置的一个重要函数。
通过该函数,我们可以自由地控制光标在控制台屏幕上的移动,并定位到指定的行列位置。
这个函数提供了灵活的方式来处理光标操作,帮助开发者实现各种有关光标位置的功能。
1.2 文章结构本文将分为五个部分来详细讲解关于`setconsolecursorposition`函数的用法和应用场景。
首先会从引言开始介绍本文主题,然后逐渐展开更详细的内容,包括`setconsolecursorposition`函数的介绍、设置光标位置参数说明以及示例代码演示。
接着,我们将深入研究该函数在实际应用场景下的优势和应用方法,并举例说明在文本编辑器、游戏开发以及图形界面中如何使用此函数。
最后,还会列举一些常见问题并提供解决方案,总结`setconsolecursorposition`函数的用法和优势,并对其未来发展趋势进行展望。
1.3 目的本文旨在向读者介绍C语言中`setconsolecursorposition` 函数的用法,通过详细讲解其功能和应用场景,帮助读者理解并灵活运用该函数。
同时,本文也将提供一些常见问题的解决方案,以帮助读者更好地应对实际开发中可能遇到的问题。
通过阅读本文,读者可以掌握如何使用`setconsolecursorposition` 函数来控制光标位置,并了解其在不同领域中的实际应用。
最终,希望读者能够通过对此函数的学习和理解,提升自己在C语言开发中的技能水平。
2. C语言中setconsolecursorposition的用法2.1 setconsolecursorposition函数介绍setconsolecursorposition函数是C语言中的一个控制台函数,它可以设置控制台窗口光标的位置。
该函数需要提供光标的行和列坐标作为参数,以将光标定位在指定位置。
鼠标获取窗口句柄 源码 C语言版
}
TempHandle = WindowFromPoint (point);
if (TempHandle != Handle && Flag)
{
Handle = TempHandle;
hInstance, // program instance handle
NULL) ; // creation parameters
//SetBkColor (hdcEdit, RGB (255, 0, 0));
SelectObject (hdcEdit, hFont);
return 0;
case WM_COMMAND :
TEXT ("Find Handle"), // window caption
WS_CAPTION | WS_SYSMENU |
WS_MINIMIZEBOX, // window style
CW_USEDEFAULT, // initial x position
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
hAccel = LoadAccelerators (hInstance, TEXT ("EXIT"));
while (GetMessage (&msg, NULL, 0, 0))
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, // window class name
C语言鼠标操作
break;
}
}
inRec.Event.MouseEvent.dwEventFlags == RIGHTMOST_BUTTON_PRESSED) //鼠标左键双击
inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED//鼠标左键单击
void MouseEventProc(MOUSE_EVENT_RECORD mer)
{
DWORD state = mer.dwButtonState;
switch(mer.dwEventFlags)
{
case 0:
case MOUSE_MOVED:
mousePos = mer.dwMousePosition;
inRec.Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED//鼠标右键单击
inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_2ND_BUTTON_PRESSED) //鼠标滚轮单击
break;
wheele.Y = mer.dwMousePosition.Y-mousePos.Y;
//if(mer.dwButtonState & 0xFF000000)mousePos.X -= 6;//WheelDown();
//else mousePos.X -= 6;//WheelUp();
ReadConsoleInput(hInput, &inRec, 1, &res);
vc模拟键盘鼠标命令
vc模拟鼠标键盘操作实用类//****************** 类mk头文件mk.h **************************#if !defined(AFX_MK_H__B024D48F_090A_4F6F_A199_32996DF699B3__INCLUDED_)#define AFX_MK_H__B024D48F_090A_4F6F_A199_32996DF699B3__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include "winable.h"class mk{public:mk();static void Key(BYTE k, int mSeconds=0);//按一个键,mSeconds表按键后到//下一次操作延迟的时间:msstatic void Key2(BYTE k1, BYTE k2,int mSeconds=0);//按2个键static void Key3(BYTE k1,BYTE k2,BYTE k3,int mSeconds=0);//按3个键static void Click(int x,int y,int mSeconds=0);//单击static void RClick(int x,int y,int mSeconds=0);//右击static void DClick(int x,int y,int mSeconds=0);//双击static void CtrlClick(int x, int y, int mSeconds=0);//Ctrl+单击static void Drag(int x1,int y1,int x2,int y2,int mSeconds=0);//鼠标拖动virtual ~mk();};#endif// !defined(AFX_MK_H__B024D48F_090A_4F6F_A199_32996DF699B3__INCLUDED_) //****************** 类mk头文件mk.h end**************************//****************** 类mk实现文件mk.cpp **************************#include "stdafx.h"#include "mk.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////mk::mk(){}mk::~mk(){}void mk::Click(int x, int y, int mSeconds){SetCursorPos(x,y);mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);Sleep(mSeconds);}void mk::DClick(int x, int y, int mSeconds){SetCursorPos(x,y);mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); Sleep(mSeconds);}void mk::Drag(int x1, int y1, int x2, int y2, int mSeconds) {SetCursorPos(x1,y1);mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); SetCursorPos(x2,y2);mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); Sleep(mSeconds);}void mk::RClick(int x, int y, int mSeconds){SetCursorPos(x,y);mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0); mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0); Sleep(mSeconds);}void mk::Key(BYTE k, int mSeconds){keybd_event(k,0,0,0);keybd_event(k,0,KEYEVENTF_KEYUP,0);Sleep(mSeconds);}void mk::Key2(BYTE k1, BYTE k2, int mSeconds){//法1//keybd_event(k1, 0, 0 ,0);//keybd_event(k2, 0, 0 ,0);//keybd_event(k2, 0, KEYEVENTF_KEYUP,0);//keybd_event(k1, 0, KEYEVENTF_KEYUP,0);//法2,更通用,但须先#include "winable.h"INPUT input[4];memset(input,0,sizeof(input));input[0].type=input[1].type=input[2].type=input[3].type=INPUT_KEYBOARD;input[0].ki.wVk=input[3].ki.wVk=k1;input[1].ki.wVk=input[2].ki.wVk=k2;input[2].ki.dwFlags = input[3].ki.dwFlags = KEYEVENTF_KEYUP;SendInput(4, input, sizeof(INPUT));Sleep(mSeconds);}void mk::CtrlClick(int x, int y, int mSeconds){SetCursorPos(x,y);keybd_event(VK_CONTROL ,0,0,0);mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);Sleep(mSeconds);}void mk::Key3(BYTE k1, BYTE k2, BYTE k3, int mSeconds){if(k1==VK_CONTROL&&k2==VK_MENU&&k3==VK_DELETE)ShellExecute(NULL,NULL,"taskmgr.exe",NULL,NULL,SW_SHOW);else{INPUT input[6];memset(input,0,sizeof(input));input[0].type=input[1].type=input[2].type=input[3].type=input[4].type=input[5].type=INPUT_KE YBOARD;input[0].ki.wVk=input[5].ki.wVk=k1;input[1].ki.wVk=input[4].ki.wVk=k2;input[2].ki.wVk=input[3].ki.wVk=k3;input[3].ki.dwFlags=input[4].ki.dwFlags=input[5].ki.dwFlags=KEYEVENTF_KEYUP;SendInput(6, input, sizeof(INPUT));}Sleep(mSeconds);}//****************** 类mk实现文件mk.cpp end**************************===================================================================VC模拟键盘操作INPUT input[4];memset(input, 0, sizeof(input));//设置模拟键盘输入input[0].type = input[1].type = input[2].type = input[3].type = INPUT_KEYBOARD;input[0].ki.wVk = input[2].ki.wVk = VK_CONTROL;input[1].ki.wVk = input[3].ki.wVk = VK_ESCAPE;// 释放按键input[2].ki.dwFlags = input[3].ki.dwFlags = KEYEVENTF_KEYUP;SendInput(4, input, sizeof(INPUT));******************************************************************************* **符号常量十六进制值指定的鼠标或键盘按键VK_LBUTTON 01 鼠标左键VK_RBUTTON 02 鼠标右键VK_CANCEL 03 Control-break 过程VK_MBUTTON 04 鼠标中键VK_BACK 08 BACKSPACE 键VK_TAB 09 TAB 键VK_CLEAR 0C CLEAR 键VK_RETURN 0D ENTER 键VK_SHIFT 10 SHIFT 键VK_CONTROL 11 CTRL 键VK_MENU 12 ALT 键VK_PAUSE 13 PAUSE 键VK_CAPITAL 14 CAPS LOCK 键VK_ESCAPE 1B ESC 键VK_SPACE 20 SPACEBARVK_PRIOR 21 PAGE UP 键VK_NEXT 22 PAGE DOWN 键VK_END 23 END 键VK_HOME 24 HOME 键VK_LEFT 25 LEFT ARROW 键VK_UP 26 UP ARROW 键VK_RIGHT 27 RIGHT ARROW 键VK_DOWN 28 DOWN ARROW 键VK_SELECT 29 SELECT 键VK_EXECUTE 2B EXECUTE 键VK_SNAPSHOT 2C PRINT SCREEN键(用于Windows 3.0及以后版本)VK_INSERT 2D INS 键VK_DELETE 2E DEL 键VK_HELP 2F HELP 键///////////////////////////////////////////////////对于字母键和非小键盘上的数字键,直接在单引号中加入该键就行.比如:a键:'A'1键:'1'//////////////////////////////////////////////VK_LWIN 5B Left Windows 键(Microsoft自然键盘)VK_RWIN 5C Right Windows 键(Microsoft自然键盘)VK_APPS 5D Applications 键(Microsoft自然键盘)VK_NUMPAD0 60 数字小键盘上的0 键VK_NUMPAD1 61 数字小键盘上的 1 键VK_NUMPAD2 62 数字小键盘上的 2 键VK_NUMPAD3 63 数字小键盘上的 3 键VK_NUMPAD4 64 数字小键盘上的 4 键VK_NUMPAD5 65 数字小键盘上的5 键VK_NUMPAD6 66 数字小键盘上的 6 键VK_NUMPAD7 67 数字小键盘上的7 键VK_NUMPAD8 68 数字小键盘上的8 键VK_NUMPAD9 69 数字小键盘上的9 键VK_MULTIPL Y 6A Multiply 键VK_ADD 6B Add 键VK_SEPARATOR 6C Separator 键VK_SUBTRACT 6D Subtract 键VK_DECIMAL 6E Decimal 键VK_DIVIDE 6F Divide 键VK_F1 70 F1 键VK_F2 71 F2 键VK_F3 72 F3 键VK_F4 73 F4 键VK_F5 74 F5 键VK_F6 75 F6 键VK_F7 76 F7 键VK_F8 77 F8 键VK_F9 78 F9 键VK_F10 79 F10 键VK_F11 7A F11 键VK_F12 7B F12 键VK_F13 7C F13 键VK_F14 7D F14 键VK_F15 7E F15 键VK_F16 7F F16 键VK_F17 80H F17 键VK_F18 81H F18 键VK_F19 82H F19 键VK_F20 83H F20 键VK_F21 84H F21 键VK_F22 85H F22 键VK_F23 86H F23 键VK_F24 87H F24 键VK_NUMLOCK 90 NUM LOCK 键VK_SCROLL 91 SCROLL LOCK 键VK_ATTN F6 Attn 键VK_CRSEL F7 CrSel 键VK_EXSEL F8 ExSel 键VK_EREOF F9 Erase EOF 键VK_PLAY FA Play 键VK_ZOOM FB Zoom 键VK_OEM_CLEAR FE Clear 键举例:(一)响应单独的按键:先添加PreTranslateMessage()(响应WM_CHAR)也是同样的效果,因为本例只捕捉键盘) BOOL CMydilog::PreTranslateMessage(MSG* pMsg){// TODO: Add your specialized code here and/or call the base classif (pMsg->message == WM_KEYDOWN){if(pMsg->wParam=='M')//直接用上面的虚码代替就可以响应所指键MessageBox("hello");//如果按下M键弹出消息.比如想当按下小键盘1时//弹出就用VK_NUMPAD1代替'M'}return CDialog::PreTranslateMessage(pMsg);}(二)组合键的用法:(本例响应Ctrl+X键)BOOL CMydilog::PreTranslateMessage(MSG* pMsg){// TODO: Add your specialized code here and/or call the base classif (pMsg->message == WM_KEYDOWN){switch (pMsg->wParam){case VK_ESCAPE:SetFocus ();return TRUE;case 'X':if(::GetKeyState(VK_CONTROL) < 0)//如果是Shift+X这里就//改成VK_SHIFTMessageBox("hello");return TRUE;}}return CDialog::PreTranslateMessage(pMsg); }。
C语言人机交互键盘输入和鼠标事件处理
C语言人机交互键盘输入和鼠标事件处理C语言人机交互:键盘输入和鼠标事件处理C语言是一种广泛应用的编程语言,它可以与用户进行人机交互。
通过键盘输入和鼠标事件处理,我们可以实现用户与计算机之间的有效沟通和交流。
本文将详细介绍C语言中的人机交互方法,包括键盘输入的处理和鼠标事件的处理。
一、键盘输入的处理1. 单个字符的输入在C语言中,我们可以使用`getchar()`来获取用户输入的单个字符。
它会等待用户输入,并返回输入的字符。
下面是一个简单的例子:```c#include <stdio.h>int main() {char c;printf("请输入一个字符:");c = getchar();printf("您输入的字符是:%c\n", c);return 0;}```2. 字符串的输入如果需要获取用户输入的字符串,可以使用`gets()`函数。
该函数可以获取用户输入的一行字符串,并存储在指定的字符数组中。
下面是一个示例:```c#include <stdio.h>int main() {char str[100];printf("请输入一个字符串:");gets(str);printf("您输入的字符串是:%s\n", str);return 0;}```需要注意的是,`gets()`函数存在安全性问题,建议使用`fgets()`函数来代替。
`fgets()`函数可以指定缓冲区的大小,避免溢出。
二、鼠标事件的处理在C语言中,基于控制台的鼠标事件处理相对复杂。
我们可以使用Windows API来实现控制台窗口中的鼠标事件响应。
下面是一个示例,演示了如何处理鼠标的移动和点击事件:```c#include <stdio.h>#include <windows.h>void MouseEventProc(MOUSE_EVENT_RECORD mer) {DWORD dwEventFlags = mer.dwEventFlags;COORD mousePos = mer.dwMousePosition;if (dwEventFlags == MOUSE_MOVED) {printf("鼠标移动到坐标:%d, %d\n", mousePos.X, mousePos.Y);} else if (dwEventFlags == DOUBLE_CLICK) {printf("鼠标双击坐标:%d, %d\n", mousePos.X, mousePos.Y);} else if (dwEventFlags == MOUSE_WHEELED) {// 处理鼠标滚轮事件} // 其他事件处理...}int main() {HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);DWORD prevMode;INPUT_RECORD inputRecord;DWORD numEventsRead;SetConsoleMode(hInput, ENABLE_WINDOW_INPUT |ENABLE_MOUSE_INPUT); // 启用鼠标事件while (1) {ReadConsoleInput(hInput, &inputRecord, 1, &numEventsRead);if (inputRecord.EventType == MOUSE_EVENT) {MouseEventProc(inputRecord.Event.MouseEvent);}}return 0;}```在这个示例中,我们使用了`GetStdHandle()`函数获取标准输入句柄,并使用`SetConsoleMode()`函数启用了控制台窗口中的鼠标事件输入。
[C#]获取和设置鼠标的坐标
[C#]获取和设置⿏标的坐标该⽰例实现了控制⿏标的坐标,分别⽤WIndows Api和.Net库⾃带的命令实现。
APi控制和获取⿏标分别是: GetCursorPos和SetCursorPost。
下⾯是截图:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;//namespace 获取和设置⿏标的坐标{public partial class Form1 : Form{public Form1(){InitializeComponent();}/// <summary>/// 设置⿏标的坐标/// </summary>/// <param name="x">横坐标</param>/// <param name="y">纵坐标</param>[DllImport("User32")]public extern static void SetCursorPos(int x, int y);/// <summary>/// 获取⿏标的坐标/// </summary>/// <param name="lpPoint">传址参数,坐标point类型</param>/// <returns>获取成功返回真</returns>[DllImport("User32")]public extern static bool GetCursorPos(ref Point lpPoint);private void button_go_Click(object sender, EventArgs e){SetCursorPos(int.Parse(textBox_x.Text), (int.Parse(textBox_y.Text)));}Point p = new Point(1, 1);//定义存放获取坐标的point变量private void timer1_Tick(object sender, EventArgs e){GetCursorPos(ref p);label_p.Text = "X:" + p.X + "\r\nY:" + p.Y;//label_p.Text = "X:" + Cursor.Position.X + "\r\nY:" + Cursor.Position.Y; //⽤C#⾃带命令获取}}}。
c语言鼠标左右键怎么互换,用C#实现鼠标左右键的切换
c语⾔⿏标左右键怎么互换,⽤C#实现⿏标左右键的切换在平时⽤电脑的过程中,我喜欢隔段时间就把⿏标左右调换⼀下,⼀来是想让⾃⼰⼀侧的肩、⼿臂、⼿腕能得到休息,尽量避免因长期固定姿势使⽤⿏标⽽带来的⾝体不适,另⼀⽅⾯也因为我本来就是个左撇⼦,喜欢尝试给两只⼿均等的做事机会。
当然,⾃从我给电脑同时接上左右两只⿏标以后,来回调换⿏标是避免了(据我所知,有在电脑上接三四只⿏标的,真是厉害!),但系统对于⿏标左右键的安排却不听我的调换,还要费⼒地去控制⾯板中设置⼀番,⾮常⿇烦。
因此我想,何不写⼏⾏代码,让⿏标左右键能在最短的时间内左右切换呢?这主意不错!OK,马上到MSDN⾥查找⼀番,⼗⼏分钟写出了下⾯这个⼩程序。
1. SwapMouseButton根据MSDN所述,可以通过调⽤SwapMouseButton这⼀API来实现⿏标左右键功能互换,Windows控制⾯板中的相关设置也是通过调⽤该API来实现的。
该API存在于user32.dll⽂件中,它的原型是:BOOL SwapMouseButton(BOOL fSwap);我们可以在.NET⼯程中通过P/Invoke轻松声明对该API的调⽤。
我写的调⽤声明如下:// P/Invoke declarations[DllImport("user32.dll")]private extern static bool SwapMouseButton(bool fSwap);其中,fSwap是需要传⼊的参数,当它的值为true时,系统会把⿏标左右键功能进⾏互换(即换成左⼿⿏标);当它的值为false时,系统会把⿏标左右键功能还原为默认状态(即右⼿⿏标)。
因此,当我想使⽤左⼿⿏标时,只需向SwapMouseButton⽅法传⼊⼀个true变量即可实现,⾮常⽅便。
2. SystemParametersInfo除了调⽤SwapMouseButton来实现⿏标左右值功能切换之外,Windows还提供了另外⼀个实现同样效果的API:SystemParametersInfo。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2 、 如果当前鼠标指针是显示的,则操作后,鼠标指针被隐藏 3 、 鼠标指 针的显示页为 0 4 — — 、 根据屏幕的显示模式显示鼠标指针:文本 反向显示矩形块,图形 尖头形 状 5 、 水平象素比,8:8,垂直象素比,16:8 6 、 设置水平和垂直的显示边界为 当前显示模式的最大边界 7 、 允许光笔仿真 8 、 双速门槛值,64 (2)、功能 01H 功能描述: 显示鼠标指针,通常在鼠标初始化后,用此功能显示其指针 入口 参数: AX ,01H 出口参数: 无 (3)、功能 02H 功能描述: 隐藏鼠标指针,一般在程序结束时,调用此功能 入口参数: AX,02H 出口参数: 无 (4)、功能 03H 功能描述: 读取鼠标位置及其按钮状态 入口参数: AX,03H 出口参数: BX ,按键状态: 位 0=1—— 按下左键 位 1=1—— 按下右键 位 2=1—— 按下中键 —— 其它位 保留,内部使用 CX ,水平位置
int mousebutton,mouseexist,mouseX,mouseY; void mousepicture() /*画心形,可设置其它的图形*/ { int i,j,k; long hidenum[16]={ 0xe3c7,0xc183,0x8001,0x0000, 0x0000,0x0000,0x0000,0x8001, 0x8001,0xc003,0xe007,0xf00f, 0xf81f,0xfc3f,0xfe7f,0xffff, } ; /*隐码点值,是对点素进行设置*/ long burynum[16]={ 0x1c38,0x3e7c,0x7ffe,0xffff, 0xffff,0xffff,0xffff,0x7ffe, 0x3ffe,0x3ffc,0x1ff8,0x0ff0, 0x07e0,0x03c0,0x0180,0x0000, };/*掩码点值*/ for(i=0;i<16;i++) { while(hidenum[i]!=0) { for(j=15;j>=0;j--) { hide[i][j]=hidenum[i]%2; hidenum[i]/=2; } /*把隐码转化为 0-1*/ } while(burynum[i]!=0) {
功能描述: 鼠标驱动程序复位 入口参数: AX,21H 出口参数: 若 AX,-1——不成功,否则,BX,2 (33)、功能 22H 功能描述: 设置鼠标驱动程序信息语言 入口参数: AX,22H BX,语言代码:0—英语,1—法语,2—荷兰语,3—德语,4—瑞典语,5—芬兰 语,6—西 班 牙语,7—葡萄牙语,8— 意大利语 出口参数: 无 (34)、功能 23H 功能描述: 读取语种 入口参数: AX,23H 出口参数: BX ,语言代码 (35)、功能 24H 功能描述: 读取鼠标信息 入口参数: AX,24H 出口参数: BH,主版本号,BL,辅版本号 CL,中断请求号 CH,鼠标类型:1,Bus Mouse,2,Serial Mouse,3,InPort Mouse,4,PS/2 Mouse,5,HP Mouse (36)、功能 25H 功能描述: 读取鼠标驱动程序信息 入口参数: AX,25H
CX,垂直灵敏度 DX ,倍速阀值 (27)、功能 1CH 功能描述: 设置鼠标中断速率 入口参数: AX,1CH BX,每秒钟中断的次数:0—关中断,1—30/S,2—50/S,3—100/S,4—200/S 出口参数: 无 (28)、功能 1DH 功能描述: 为鼠标指针选择显示页 入口参数: AX,1DH BX ,显示页 出口参数: 无 (29)、功能 1EH 功能描述: 读取鼠标指针的显示页 入口参数: AX,1EH 出口参数: BX ,显示页 (30)、功能 1FH 功能描述: 禁止鼠标驱动程序 入口参数: AX,1FH 出口参数: 若 AX,-1——不成功,否则,ES:BX ,鼠标驱动程序的地址 (31)、功能 20H 功能描述: 启动鼠标驱动程序 入口参数: AX,20H 出口参数: 无 (32)、功能 21H
位 11 亮度 位 14~12 字符背景色 位 15 闪烁 1 — CX ,光标的起始扫描线 DX ,光标的结束扫描线 出口参数: 无(12)、功能 0BH 功能描述: 读取鼠标移动计数 入口参数: AX,0BH 出口参数: CX —— —— ,水平移动距离:正数 向右移,负数 向左移 DX —— —— ,垂直移动距离:正数 向下移,负数 向上移 (13)、功能 0CH 功能描述: 为鼠标事件设置处理程序 入口参数: AX,0CH CX ,中断掩码 位 0,1 —— 鼠标指针位置发送变化 位 1,1 —— 按下左按钮 位 2,1 —— 释放左按钮 位 3,1 —— 按下右按钮 位 4,1 —— 释放右按钮 位 5,1 —— 按下中间按钮 位 6,1 —— 释放中间按钮 位 7~15,0 —— 保留 ES:DX ,中断处理程序的地址 在进入中断处理程序时,有关寄存器的值含义: AX ,中断掩码 BX ,按键状态
CX ,鼠标指针的水平位置 DX ,鼠标指针的垂直位置 SI ,水平位置的变化量 DI ,垂直位置的变化量 出口参数: 无 (14)、功能 0DH 功能描述: 允许光笔仿真 入口参数: AX,0DH 出口参数: 无 (15)、功能 0EH 功能描述: 关闭光笔仿真 入口参数: AX,0EH 出口参数: 无 (16)、功能 0FH 功能描述: 设置鼠标计数与象素比 入口参数: AX,0FH CX ,水平比例 DX ,垂直比例 出口参数: 无 (17)、功能 10H 功能描述: 设置鼠标指针隐藏区域 入口参数: AX,10H CX,左上角 X 坐标 DX,左上角 Y 坐标 SI,右下角 X 坐标
出口参数: AX ,鼠标驱动程序信息: 位 15 ——0 : 驱动程序是.SYS 文件, 否 则, 为.COM 文件 位 14——0 : 不完全鼠标显示驱动程序,否则,为完全的 位 13-12——00 : 软件文本光标 01 : 硬件文本光标 1X : 图形光标 (37)、功能 26H 功能描述: 读取最大有效坐标 入口参数: AX,26H 出口参数: BX,鼠标驱动程序状态 CX,最大水平坐标 DX,最大垂直坐标 #include<stdio.h> #include<conio.h> #include<stdlib.h> #include<math.h> #include<graphics.h> #include<dos.h> /*鼠标信息宏定义*/ #define WAITING 0xff00 #define LEFTPRESS 0xff01 #define LEFTCLICK 0xff10 #define LEFTDRAG 0xff19#define RIGHTPRESS 0xff02 #define RIGHTCLICK 0xff20 #define RIGHTDRAG 0xff2a #define MIDDLEPRESS 0xff04 #define MIDDLECLICK 0xff40 #define MIDDLEDRAG 0xff4c #define MOUSEMOVE 0xff08 int hide[16][16], bury[16][16],mousedraw[16][16],pixelsave[16] [16];/*分别定义隐码、掩码、点值*/
出口参数: 无 (23)、功能 18H 功能描述: 为鼠标事件设置可选的处理程序 入口参数: AX,18H CX ,替换中断掩码 ES:DX ,替换中断处理程序的地址 CF,0 出口参数: 无 (24)、功能 19H 功能描述: 读取替换处理程序的地址 入口参数: AX,19H CX ,替换中断掩码 出口参数: 若 AX,-1——不成功,否则,ES:DX ,中断处理程序的地址 (25)、功能 1AH 功能描述: 设置鼠标的灵敏度,其取值 1~100 入口参数: AX,1AH BX,水平灵敏度(每 8 个象素鼠标需要移动的数量,一般为 8) CX,垂直灵敏度(每 8 个象素鼠标需要移动的数量,一般为 16) DX ,倍速阀值 出口参数: 无 (26)、功能 1BH 功能描述: 读取鼠标的灵敏度 入口参数: AX,1BH 鼠标操作方法及源码(转载) 鼠标的操作是使用 dos 中断功能,中断号:33h 下面给几个操作鼠标的示例, 后面有更详细的中断功能说明及代码。 显示鼠标: union REGS regs; regs.x.ax=1; int86(0x33,®s,®s); 检查是否被按下: union REGS regs; regs.x.ax=6; int86(0x33,®s,®s); 返回值在 bx 寄存器中; 在实际编程中一般要使用循环不断的检验是否被按下! 检验鼠标位置:union REGS regs; regs.x.ax=3; int86(0x33,®s,®s); 返回值:x 坐标在 regs.h.cx y 坐标在 regs.h.dx /*下面是各值对鼠标的设置功能*/ (1)、功能 00H 功能描述: 初始化鼠标,该操作只需要执行一次 入口参数: AX,00H 出口参数: AX,0000H——不支持鼠标功能,FFFFH——支持鼠标功能 BX,鼠标按钮个数(在支持鼠标功能时) 在支持鼠标功能的情况下,鼠标还被设置如下参数: 1 、 鼠标指针放在屏幕 中央
DI,右下角 Y 坐标 出口参数: 无 (18)、功能 13H 功能描述: 设置倍速的阈值,其缺省值为 64 入口参数: AX,13H DX ,阀值 出口参数: 无 (19)、功能 14H 功能描述: 替换鼠标事件中断 入口参数: AX,14H CX ,中断掩码 ES:DX ,中断处理程序的地址 出口参数: CX ,旧的中断掩码 ES:DX ,旧的中断处理程序地址 (20)、功能 15H 功能描述: 读取鼠标驱动器状态的缓冲区大小 入口参数: AX,15H 出口参数: BX ,存放鼠标驱动器状态所需缓冲区的大小 (21)、功能 16H 功能描述: 存储鼠标驱动器状态 入口参数: AX,16H ES:DX ,存储鼠标驱动器状态的地址 出口参数: 无(22)、功能 17H 功能描述: 重装鼠标驱动器状态 入口参数: AX,17H ES:DX ,鼠标驱动器状态的地址