检测鼠标按钮是否按下

5
我是新手C++,我正在尝试仅在按住左键时激活一行代码。 在这个例子中,我的代码可以工作,但它似乎只是切换。 当我点击时,它会不断地发送H键,然后当我再次点击时,它停止。
目前我有这段代码:
if ((GetKeyState(VK_LBUTTON)))
{
    keybd_event(VkKeyScan('H'),0,0,0);
    Sleep ( 30 );
}

编辑:

我在函数内部有以下内容:

int WINAPI WinMain ( HINSTANCE hInst, HINSTANCE P, LPSTR CMD, int nShowCmd );

这个函数是在哪个函数内部调用的?你正在使用哪个库来处理鼠标事件? - pippin1289
C++并不知道你的鼠标。你正在使用某个系统的API。是哪一个?也许是Windows? - Lightness Races in Orbit
Sleep()(注意大写的 S)听起来像是 Windows。 - alk
@alk: keybd_event() 是一个Windows API函数。 - Remy Lebeau
@RemyLebeau:我差不多猜到了。然而,它的命名是如此不常见(可能来自窗口v1之类的东西),我不确定。至于Sleep(),我是确定的。 - alk
4个回答

16

3
谢谢。一开始没有成功,但是在阅读了评论后,我试着用0x100替换了0x80,现在可以了。从我所读的来看,这是因为我使用了64位系统。 - Jordan B
11
更简便的方法是 if (GetKeyState(VK_LBUTTON) < 0) { },顺带一提。 - Jonathan Potter
1
使用0x100作为掩码是错误的,应该使用0x8000。不过,使用< 0更好。 - Remy Lebeau
@RemyLebeau & 方法更加繁琐但速度更快。 - KeyC0de

4

3

使用下面的代码来检测鼠标左键是否被按下:

if(GetAsyncKeyState(VK_LBUTTON)){
   //your code controls here
 }

您可以在此处找到更多控件:https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getasynckeystate 另外,如果 GetAsyncKeyState(VK_LBUTTON) 出现语法错误,请尝试在代码的 includes 中添加 #include <winuser.h> 来包含 winuser.h。
以下是一个示例。
if(GetKeyState(VK_LBUTTON))
    {   //finding clicked position
        HWND hWnd = FindWindowA(0,("Motion Paths"));
        ::GetWindowThreadProcessId(hWnd,&pid);
        if (hWnd) { cout << "Found" << endl;}

            POINT p;
            GetCursorPos(&p);
            if (ScreenToClient(hWnd, &p))
            {
                int mouseX = p.x;
                int mouseY = p.y;
                cout<< p.x << " "<< p.y <<endl;
            }
    }

-3

首先 - 需要在代码开头定义按钮ID(或其他对象ID):

#define ID_BUTTON1      105

然后在创建 hWnd 之后,我们制作按钮:

   HWND HwndButton1 = CreateWindow( 
    L"BUTTON",  // Predefined class; Unicode assumed 
    L"OK",      // Button text 
    WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // Styles 
    10,         // x position 
    10,         // y position 
    100,        // Button width
    100,        // Button height
    hWnd,     // Parent window
   (HMENU) ID_BUTTON1, // ID кнопки в меню
    NULL,            // Сущность мне неведомая 8-)
    NULL);         // Pointer not needed.

然后在函数中添加触发器:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId=0, wmEvent;  //wmId NEED DEFINE null - if he is not available in event, else be ашипка
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
    case WM_COMMAND:
        wmEvent = HIWORD(wParam);  //  Name of EVENT - имя события
        wmId    = LOWORD(wParam);  // ID element for event - элемент с которым оно случилось

        case WM_LBUTTONDOWN: MessageBox(NULL, L"MouseL_Click", L"WndHeader", MB_OK | MB_ICONEXCLAMATION);  // Left Mouse Button pressed

        if( LOWORD(wParam) == 105 && WM_COMMAND == WM_LBUTTONDOWN){ // Клик по ID_BUTTON1 левым мышком
        EndDialog(hWnd,0);
        }
................  // Many another function
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接