ตรวจสอบว่ามีการกดปุ่มเมาส์หรือไม่จากนั้นเรียกใช้สคริปต์หรือคำสั่ง


11

มีวิธีใดบ้างที่จะทำให้สถานะปุ่มเมาส์ผิดพลาด Xdotool สามารถรับตำแหน่งเมาส์ได้เท่านั้น

ฉันต้องการตั้งค่าบางอย่างที่ฉันสามารถกำหนดกฎที่เมื่อกดปุ่มเมาส์สคริปต์สามารถดำเนินการได้


คุณสามารถตรวจจับเหตุการณ์เมาส์ได้อย่างแน่นอนแต่ฉันไม่เชื่อว่าจะมีวิธีถามระบบว่ากดปุ่มเมาส์ในขณะนี้หรือไม่ ตัวแยกวิเคราะห์กิจกรรมของเมาส์ทุกตัวที่ฉันได้ดูถ้าคุณจะให้อภัยรหัสเทียมMouseButton1DownและMouseButton1Upกิจกรรมที่ต้องดำเนินการ
DopeGhoti

ฉันต้องการสคริปต์ที่จะดูเมาส์และเมื่อกดปุ่มซ้ายมันจะทำอะไรบางอย่าง
MartinP

ต้องการคำชี้แจง คุณต้องการบางสิ่งบางอย่างเมื่อคุณอยู่ในเชลล์และคลิกที่หน้าต่างเทอร์มินัลเชลล์เฉพาะนั้นทำอะไรบางอย่าง? หรือคุณต้องการให้มันเมื่อคุณคลิกปุ่มเมาส์เฉพาะที่ใดก็ได้ที่สคริปต์ทำงาน (และคุณไม่จำเป็นต้องเห็นสคริปต์ในเทอร์มินัล)?
Patrick

ฉันต้องการสคริปต์ซึ่งฉันจะเรียกใช้แล้วมันจะดูปุ่มเมาส์ได้ทุกที่บนเดสก์ท็อป มันจะไม่ปิดกั้นเมาส์ แต่จะฟังเท่านั้น ฉันพยายามเขียนโปรแกรมใน C ด้วย Xlib แต่มีเพียง XGrabButton และ XGrabPointer และฉันไม่ต้องการเพราะมันคว้าตัวชี้และหน้าต่างอื่นไม่ได้ลงทะเบียนคลิกเหตุการณ์
MartinP

คำตอบ:


11
xinput --query-state <mouse_id>

สิ่งนี้จะทำให้คุณมีสถานะสำหรับปุ่มเมาส์ทั้งหมดซึ่งมีลักษณะดังนี้:

2 classes :
ButtonClass
    button[1]=up
    button[2]=up
    button[3]=up
    button[4]=up
    button[5]=up
    button[6]=up
    button[7]=up
    button[8]=up
    button[9]=up
    button[10]=up
    button[11]=up
    button[12]=up
    button[13]=up
    button[14]=up
    button[15]=up
    button[16]=up
ValuatorClass Mode=Relative Proximity=In
    valuator[0]=313
    valuator[1]=667
    valuator[2]=-20

mouse_id สามารถรับได้จาก:

xinput --list

นี่คือสคริปต์ตัวเฝ้าดูปุ่มเมาส์เล็กน้อย:

#!/bin/bash

MOUSE_ID=$(xinput --list | grep -i -m 1 'mouse' | grep -o 'id=[0-9]\+' | grep -o '[0-9]\+')

STATE1=$(xinput --query-state $MOUSE_ID | grep 'button\[' | sort)
while true; do
    sleep 0.2
    STATE2=$(xinput --query-state $MOUSE_ID | grep 'button\[' | sort)
    comm -13 <(echo "$STATE1") <(echo "$STATE2")
    STATE1=$STATE2
done

คุณอาจต้องเปลี่ยนสตริงการตรวจจับ MOUSE_ID ('เมาส์') เป็นอย่างอื่น


xinput --listX Input extension not available.ให้ฉัน น่าเศร้าที่ Google สำหรับเรื่องนี้ไม่เปิดเผยอะไรที่เป็นประโยชน์ในกรณีของฉัน: Xvnc4ใน Debian VM ขั้นต่ำ น่าจะเป็นเพราะฉันโชคไม่ดี
Tino

6

คุณสามารถใช้เครื่องมือบรรทัดคำสั่งxevเพื่อค้นหาสถานะของปุ่มของเมาส์ภายในสภาพแวดล้อม X

ตัวอย่าง

$ xev
...
ButtonPress event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319064320, (164,14), root:(166,101),
    state 0x0, button 1, same_screen YES

ButtonRelease event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319064439, (164,14), root:(166,101),
    state 0x100, button 1, same_screen YES

ButtonPress event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319065208, (164,14), root:(166,101),
    state 0x0, button 1, same_screen YES

ButtonRelease event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319065337, (164,14), root:(166,101),
    state 0x100, button 1, same_screen YES

ButtonPress event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319066059, (164,14), root:(166,101),
    state 0x0, button 1, same_screen YES

แต่ข้อมูลนี้ทำให้คุณได้รับการแก้ปัญหาเพียงบางส่วนเท่านั้น ข้อมูลสำคัญที่คุณต้องการแยกจากด้านบนคือหมายเลขที่เกี่ยวข้องกับปุ่มเฉพาะบนเมาส์ของคุณ ในตัวอย่างของฉันฉันกดปุ่มซ้าย "buton 1"

xbindkeys

คุณสามารถใช้เครื่องมือนี้เพื่อตั้งค่าการกระทำที่เกี่ยวข้องกับปุ่มที่ถูกกด คุณสามารถตั้งค่ากฎที่ต้องกดปุ่มหรือแม้แต่กดปุ่ม + ร่วมกัน

ตัวอย่าง

คุณต้องตรวจสอบให้แน่ใจก่อนว่ามีการติดตั้งแพ็คเกจ xbindkeys ไว้หรือไม่

จากนั้นคุณจะต้องเรียกใช้คำสั่งต่อไปนี้หนึ่งครั้งเท่านั้นเพื่อสร้างไฟล์การกำหนดค่าเทมเพลต xbindkeys

$ xbindkeys --defaults > /home/saml/.xbindkeysrc

ด้วยไฟล์ที่สร้างขึ้นคุณสามารถเปิดในโปรแกรมแก้ไขข้อความและเพิ่มกฎเช่นนี้:

"xterm"
  b:3

กฎนี้ระบุว่าเราต้องการเรียกใช้โปรแกรมxtermเมื่อกดปุ่ม 3 ปุ่ม "3" คือปุ่มเมาส์ขวาของฉัน

จากการเปลี่ยนแปลงข้างต้นทำให้เราต้องฆ่า xbindkeys ถ้ามันทำงานอยู่แล้วจากนั้นเริ่มต้นใหม่

$ killall xbindkeys
$ xbindkeys

ขณะนี้การทำงานนี้เมื่อใดก็ตามที่ฉันคลิกปุ่มเมาส์ขวาxtermจะได้รับการดำเนินการ

อ้างอิง


2
แต่ใช้งานได้กับหน้าต่างที่สร้างขึ้นเท่านั้น ฉันจะจับเหตุการณ์นั้นได้ทั่วโลกได้อย่างไร
MartinP

4

หากคุณต้องการรันคำสั่ง bash ใน xterm เมื่อคลิกเมาส์ (หรือเหตุการณ์ wheel) คุณสามารถลองตัวอย่างนี้:

$ echo -e "\e[?1000h"
$ while read -n 6; do echo hellowworld; done

สิ่งนี้ใช้สำหรับเหตุการณ์วงล้อ (สำหรับชุดคลิก 12 แทน)


ได้โปรดอธิบายหน่อยได้ไหม?
lucaswxp

2

คุณไม่สามารถกดปุ่มเค้กและทานมันได้ หากคุณต้องการให้สคริปต์ของคุณรับเหตุการณ์เมาส์เหตุการณ์ของเมาส์จะถูกส่งไปยังสคริปต์ของคุณแทนที่จะเป็นแอปพลิเคชันอื่น - นั่นหมายความว่าสคริปต์ของคุณต้องคว้าเหตุการณ์เมาส์ หากสคริปต์ของคุณไม่ได้รับการอ้างสิทธิ์เหตุการณ์หน้าต่างที่ควรได้รับ

หากคุณต้องการคุณสามารถส่งเหตุการณ์เมาส์ใหม่ไปยังหน้าต่างที่โฟกัสหรือหน้าต่างที่กำหนดพิกัด ( xdotool click)

คุณสามารถใช้XBindKeysเพื่อรันสคริปต์ในเหตุการณ์ของเมาส์หรือคีย์บอร์ด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.