마우스를 오래 사용하다 보면 한 번 클릭했는데 두 번 클릭되는 더블클릭 현상이 발생하는 경우가 있습니다.
또 마우스 버튼을 계속 누르고 있는데도 문장 선택이 중간에 풀리거나, 파일을 드래그하다가 갑자기 떨어지는 드래그 풀림 현상이 나타나기도 합니다.
제가 자주 사용하는 저가 마우스도 어느 순간부터 이 두 가지 증상이 모두 나타나기 시작했습니다.
문장을 선택하려고 드래그하면 중간에 풀리고, 파일을 옮기다가 갑자기 떨어집니다. 심할 때는 엉뚱한 폴더에 파일이 들어가버리는 일도 있었습니다.
환장할 노릇이었습니다.
문장 하나 드래그하려고 열 번 가까이 시도해야 할 정도가 되니 정상적으로 컴퓨터를 사용하기 어려운 지경이었습니다.
이럴 때 인터넷에서 흔히 볼 수 있는 임시방편도 있습니다.
마우스 버튼을 몇 초 동안 강하게 눌렀다가 떼거나, 버튼 부분을 손가락으로 몇 번 세게 튕겨주는 방법입니다.
저도 예전에는 이런 방법으로 잠깐 증상이 나아진 적이 있었지만, 이번에는 아무리 해도 소용이 없었습니다.
물론 가장 확실한 해결 방법은 문제가 있는 스위치를 교체하거나 수리하는 것, 또는 마우스 자체를 새것으로 바꾸는 것입니다.
저도 예전에 유튜브에서 마우스 스위치를 직접 손보는 영상을 보고 따라해본 적이 있습니다.
※ 위 영상의 방법은 마우스를 분해하고 스위치 내부를 직접 건드리는 작업이 포함되어 있으므로 따라 할 때 주의가 필요합니다. 따라하지 않는 것을 추천합니다. 작아서 따라 하기도 힘듭니다. 재미로 한다면 말리진 않겠습니다.
영상처럼 스위치를 열고 내부의 얇은 금속판을 조정해봤는데, 생각보다 훨씬 까다로웠습니다.
금속판을 조금만 잘못 구부려도 클릭이 제대로 되지 않거나, 클릭감이 거의 사라져 무소음 마우스처럼 느껴지기도 했습니다. 원하는 클릭감으로 다시 맞추는 것도 쉽지 않았습니다.
직접 해보고 나니 한 가지는 확실히 알게 됐습니다.
“아, 이건 아무나 하는 게 아니구나.”
그렇다고 당장 새 마우스를 사기는 애매하고, 저가형이나 서브용 마우스라 조금만 더 사용하고 싶은 경우도 있습니다.
이럴 때 사용할 수 있는 또 다른 임시방편이 AutoHotkey로 비정상적인 마우스 클릭 신호를 걸러내는 방법입니다.
고장 난 스위치를 실제로 수리하는 방법은 아닙니다.
대신 스위치에서 순간적으로 발생하는 비정상적인 클릭 신호를 소프트웨어에서 한 번 걸러내 더블클릭과 드래그 풀림 증상을 어느 정도 완화하는 방식입니다.
이번 글에서는 AutoHotkey를 이용해 이 두 가지 증상을 임시로 완화하는 방법을 알아보겠습니다.
AutoHotkey 설치하기
먼저 ㅊ 공식 홈페이지에 접속합니다.
AutoHotkey를 다운로드한 뒤 설치합니다.
이번 글의 스크립트는 AutoHotkey v2 기준으로 작성했습니다.
설치가 끝났다면 AutoHotkey Dash를 실행하고 새로운 스크립트를 만듭니다.

New Script를 누릅니다.

파일 이름은 mouse_fix.ahk 파일 이름은 꼭 같을 필요는 없습니다.
파일 이름 적고 파일 생성할 위치를 선택하고 Create버튼을 눌러 파일을 생성합니다.
스크립트 파일이 생성되면 Edit을 눌러 메모장이나 원하는 텍스트 편집기로 열어줍니다.
더블클릭·드래그 풀림 방지 코드
다음 코드를 입력합니다.
#Requires AutoHotkey v2.0
#SingleInstance Force
InstallMouseHook
; 마우스 왼쪽 버튼 채터링 / 드래그 풀림 임시 완화
;
; ChatterTime:
; 버튼을 정상적으로 놓은 직후 너무 빠르게 들어오는
; 재클릭을 채터링으로 판단해 무시합니다.
;
; ReleaseDebounce:
; 드래그 중 순간적으로 Up 상태가 발생하더라도
; 바로 버튼을 놓은 것으로 처리하지 않습니다.
; 일정 시간 동안 계속 Up 상태일 때만 실제 해제로 인정합니다.
global LastUp := 0
global ChatterTime := 60
global ReleaseDebounce := 30
$LButton::
{
global LastUp, ChatterTime, ReleaseDebounce
; 직전 정상적인 버튼 해제 직후
; 지나치게 빠른 재입력이 들어오면 무시
if (A_TickCount - LastUp < ChatterTime)
return
; Windows에 논리적인 왼쪽 버튼 Down 전달
SendEvent "{LButton Down}"
UpSince := 0
Loop
{
; 실제 마우스 왼쪽 버튼의 물리적인 상태 확인
if GetKeyState("LButton", "P")
{
; 다시 눌린 상태가 확인되면
; 직전의 짧은 Up은 순간적인 튐으로 판단
UpSince := 0
}
else
{
; 처음 Up 상태가 감지된 시간 기록
if (UpSince = 0)
UpSince := A_TickCount
; 일정 시간 동안 계속 Up 상태였다면
; 사용자가 실제로 버튼을 놓은 것으로 판단
if (A_TickCount - UpSince >= ReleaseDebounce)
break
}
Sleep 5
}
; 확인된 실제 버튼 해제를 Windows에 전달
SendEvent "{LButton Up}"
LastUp := A_TickCount
}
; 물리적인 Up 이벤트는 그대로 전달하지 않습니다.
; 위 루틴에서 일정 시간 안정적인 Up 상태인지 확인한 뒤
; 논리적인 LButton Up을 직접 전달합니다.
$LButton Up::
{
return
}입력이 끝났다면 파일을 저장합니다.
이제 mouse_fix.ahk 파일을 실행합니다.
Windows 작업 표시줄 오른쪽 알림 영역에 AutoHotkey 아이콘이 나타나면 스크립트가 실행되고 있는 것입니다.
바로 문제가 있던 마우스를 테스트해봅니다.
문장을 길게 드래그해보고 파일이나 폴더도 직접 끌어서 이동해봅니다.
더블클릭이 자주 발생했다면 일반적인 클릭도 여러 번 해봅니다.
제 경우처럼 짧은 비정상 입력 때문에 문제가 발생하는 마우스라면 증상이 완화되는 것을 확인할 수 있습니다.
스크립트를 끄는 방법과 스크립트 변경시 적용방법

스크립트를 완전히 종료하려면 작업 표시줄의 AutoHotkey 아이콘을 마우스 오른쪽 버튼으로 클릭한 뒤 Exit를 선택합니다. 일시적으로 핫키 기능만 비활성화하려면 Suspend Hotkeys를 사용할 수도 있습니다.
스크립트 설정값이나 코드를 변경한 경우에는 파일을 저장한 뒤 작업 표시줄의 AutoHotkey 아이콘을 마우스 오른쪽 버튼으로 클릭하고 Reload Script를 선택해야 변경된 내용이 적용됩니다.
이 스크립트는 어떻게 작동할까?
이번 스크립트는 더블클릭과 드래그 풀림을 서로 다른 방법으로 처리합니다.
1. 더블클릭 채터링 방지
마우스 버튼을 한 번 클릭했는데 스위치 상태가 좋지 않으면 다음과 비슷한 입력이 발생할 수 있습니다.
Down ↓ Up ↓ 10ms ↓ Down ↓ Up
사람은 한 번 클릭했지만 컴퓨터에는 두 번의 클릭처럼 보일 수 있습니다.
그래서 스크립트에서는 다음과 같이 판단합니다.
정상적인 Up 발생
↓
60ms 안에 다시 Down 발생?
↓
YES
↓
스위치 채터링일 가능성이 높은
가짜 재클릭으로 판단
↓
무시
이 시간을 결정하는 것이 다음 값입니다.
global ChatterTime := 60
즉 정상적인 버튼 해제 직후 60ms 이내에 다시 발생한 Down 입력을 무시합니다.
덕분에 스위치가 짧은 시간 동안 튀면서 만들어내는 비정상적인 두 번째 클릭을 걸러낼 수 있습니다.
2. 드래그가 중간에 풀리는 현상 방지
드래그 풀림은 조금 다르게 처리합니다.
정상적인 드래그는 다음과 같습니다.
LButton Down ↓ 버튼을 계속 누르고 있음 ↓ 마우스 이동 ↓ LButton Up
그런데 스위치 상태가 좋지 않으면 버튼을 계속 누르고 있는데도 순간적으로 Up 상태가 발생할 수 있습니다.
Down ─────────── Up ─ Down ───────────────── Up ↑ ↑ 순간적인 튐 실제 해제
Windows가 첫 번째 Up을 실제 버튼 해제로 받아들이면 그 순간 드래그가 풀려버립니다.
그래서 이번 스크립트는 Up이 발생했다고 바로 믿지 않습니다.
버튼을 누르고 있는 중 ↓ 갑자기 Up 상태 감지 ↓ 바로 Windows에 Up을 전달하지 않음 ↓ 30ms 동안 계속 Up 상태인가? │ ├─ YES │ ↓ │ 실제로 버튼을 놓은 것으로 판단 │ ↓ │ Up 전달 │ └─ NO ↓ 다시 Down 상태 ↓ 순간적으로 튄 가짜 Up으로 판단 ↓ 무시
예를 들어 버튼을 누르는 도중 Up 상태가 발생했지만 불과 8ms 후 다시 Down으로 돌아왔다고 가정합니다.
Up 발생 ↓ 30ms 확인 시작 ↓ 8ms 만에 다시 Down ↓ 30ms 동안 Up 상태를 유지하지 못함 ↓ 순간적인 접점 튐으로 판단 ↓ Windows에는 Up을 전달하지 않음 ↓ 드래그 상태 유지
반대로 실제로 손가락을 뗐다면 Up 상태가 계속 유지됩니다.
Up 발생 ↓ 30ms 경과 ↓ 여전히 Up ↓ 실제 버튼 해제로 판단 ↓ Windows에 LButton Up 전달
이 시간을 결정하는 값이 다음 부분입니다.
global ReleaseDebounce := 30
GetKeyState의 “P”는 무엇일까?
코드에는 다음과 같은 부분이 있습니다.
GetKeyState("LButton", "P")
여기서 "P"는 마우스 왼쪽 버튼의 물리적인(Physical) 상태를 확인하기 위해 사용합니다.
스크립트에서 만들어낸 논리적인 클릭 상태가 아니라 실제 마우스 버튼의 물리적인 상태를 확인하는 것입니다.
그리고 다음 코드도 사용합니다.
InstallMouseHook
마우스 훅을 설치해 AutoHotkey가 물리적인 마우스 입력 상태를 추적할 수 있도록 합니다.
60ms와 30ms는 조절할 수 있다
현재 기본 설정은 다음과 같습니다.
global ChatterTime := 60
global ReleaseDebounce := 30
각각 의미는 다음과 같습니다.
ChatterTime = 60ms
버튼을 정상적으로 놓은 직후
60ms보다 빠르게 다시 들어오는 Down
→ 채터링 후보
ReleaseDebounce = 30ms
드래그 도중 Up 상태 발생
30ms 이상 계속 Up 상태
→ 실제 버튼 해제로 인정
마우스 상태에 따라 이 값을 조금씩 조절할 수 있습니다.
더블클릭이 계속 발생한다면 ChatterTime을 다음처럼 조금 늘려봅니다.
global ChatterTime := 80
또는 다음처럼 테스트할 수도 있습니다.
global ChatterTime := 100
다만 값을 지나치게 높이면 실제로 빠르게 클릭한 정상적인 입력까지 무시할 수 있습니다.
드래그가 계속 풀린다면 ReleaseDebounce를 조금 늘려볼 수 있습니다.
global ReleaseDebounce := 40
또는
global ReleaseDebounce := 50
정도로 테스트해볼 수 있습니다.
다만 이 값을 높이면 실제로 마우스 버튼을 놓았을 때 Up이 전달되는 시간도 그만큼 늦어집니다.
저의 경우에는 global ChatterTime := 60이 더블클릭이 불편해서 30으로 바꿨더니 채터링도 잡아주고 더 잘 동작했습니다.
따라서 무조건 값을 크게 만드는 것보다는 60ms / 30ms 정도부터 시작해서 자신의 마우스 상태에 맞게 조금씩 조절하는 것이 좋습니다.
왜 이런 문제가 생길까?
마우스의 클릭 스위치에는 기계식(메커니컬) 스위치와 광학식(옵티컬, 광축) 스위치 등이 사용됩니다.
일반적인 기계식 마우스 스위치는 물리적인 금속 접점을 이용해 클릭을 감지합니다.
제품 설명을 보면 수천만 회 등의 클릭 내구성이 표시되어 있는 경우도 있습니다.
하지만 이 수치는 모든 스위치가 해당 클릭 횟수까지 반드시 아무 문제 없이 작동한다는 의미는 아닙니다.
제품 편차와 사용 환경, 스위치 상태 등에 따라 더 일찍 문제가 발생할 수도 있습니다.
기계식 접점의 상태가 좋지 않아지면 한 번의 클릭 과정에서 신호가 짧은 시간 동안 불안정하게 변할 수 있습니다.
이런 현상을 흔히 채터링(Chattering)이라고 부릅니다.
이번 스크립트가 하는 일도 결국 간단합니다.
“마우스에서 신호가 왔다고 무조건 믿지 말고, 너무 수상한 신호는 한 번 더 확인해보자.”
라는 것입니다.
어디까지나 임시방편이다
여기서 중요한 점이 있습니다.
이 스크립트는 고장 난 마우스 스위치를 실제로 고치는 프로그램이 아닙니다.
스위치에서 발생하는 짧은 비정상 입력을 소프트웨어적으로 걸러내는 방법입니다.
스위치 상태가 너무 나빠져 신호가 오랫동안 불안정하거나 정상적인 Down과 Up 자체가 제대로 발생하지 않는다면 이런 방법으로 해결할 수 없습니다.
가장 확실한 해결 방법은 결국 문제가 있는 스위치를 교체하거나 마우스를 새것으로 교체하는 것입니다.
그래도 다음과 같은 상황에서는 꽤 유용할 수 있습니다.
- 새 마우스를 주문했는데 아직 배송이 오지 않은 경우
- 서브 PC에서 사용하는 저가 마우스라 새로 구입하기 조금 아까운 경우
- 마우스를 버리기 전에 조금이라도 더 사용하고 싶은 경우
이런 경우라면 몇 분 정도 투자해서 테스트해볼 만합니다.
게임에서는 사용하지 않는 것이 좋다
일반적인 웹서핑이나 문서 작업, 파일 이동에서는 수십 ms의 차이가 크게 느껴지지 않을 수도 있습니다.
하지만 FPS 게임처럼 마우스 입력 타이밍이 중요한 환경에서는 이 스크립트를 권장하지 않습니다.
특히 ReleaseDebounce를 사용하면 실제로 버튼을 놓은 뒤에도 설정한 시간 동안 상태를 확인한 다음 Up을 전달합니다.
즉 의도적으로 약간의 지연을 추가하는 방식입니다.
FPS 게임처럼 정확한 입력 타이밍이 중요하다면 차라리 이 스크립트를 끄고 게임 하는 것이 더 좋습니다.
마무리
마우스 더블클릭이나 드래그 풀림은 일반 적인 사용에는 큰 불편함이 없을지도 모릅니다. 하지만 복사 붙여넣기 작업을 많이 하는 경우에는 아주 불편한 요소입니다.
문장을 선택할 때마다 풀리고, 파일을 옮기다가 떨어지고, 한 번 클릭했는데 두 번 열리기 시작하면 사소한 문제가 사람을 환장하게 만듭니다.
이번 AutoHotkey 스크립트에서는 두 문제를 각각 다른 방법으로 완화합니다.
더블클릭 채터링
→ Up 직후 지나치게 빠른 재클릭을 무시
드래그 풀림
→ 순간적인 Up을 바로 믿지 않고
일정 시간 유지되는지 확인
즉 고장 난 마우스를 고치는 것이 아니라 마우스가 보내는 이상한 신호를 한 번 의심해보고 Windows에 전달하는 방식입니다.
마우스가 완전히 살아난 것은 아닙니다. 아픈 마우스에게 진통제와 깁스를 채워준 정도입니다.
그래도 새 마우스를 준비할 때까지 시간은 벌어줍니다. 그리고 제가 사용해본 결과 꽤 문제 없이 오래 사용할수 있었습니다.
마지막으로 직접 분해를 하는 것은 진짜 추천하지 않습니다. 차라리 버튼이 있으면 납땜으로 다른 스위치로 바꾸는 것이 낫지 버튼 자체를 뜯어서 수리하는건 굉장히 어려웠고 제대로 동작하지도 않았습니다 ㅠㅠ
그럼 이 임시 방편이 많은 사람에게 도움이 됐으면 좋겠습니다. ㅍ마우스 더블클릭이나 드래그 풀림은 일반 적인 사용에는 큰 불편함이 없을지도 모릅니다. 하지만 복사 붙여넣기 작업을 많이 하는 경우에는 아주 불편한 요소입니다.
문장을 선택할 때마다 풀리고, 파일을 옮기다가 떨어지고, 한 번 클릭했는데 두 번 열리기 시작하면 사소한 문제가 사람을 환장하게 만듭니다.
이번 AutoHotkey 스크립트에서는 두 문제를 각각 다른 방법으로 완화합니다.
더블클릭 채터링
→ Up 직후 지나치게 빠른 재클릭을 무시
드래그 풀림
→ 순간적인 Up을 바로 믿지 않고
일정 시간 유지되는지 확인
즉 고장 난 마우스를 고치는 것이 아니라 마우스가 보내는 이상한 신호를 한 번 의심해보고 Windows에 전달하는 방식입니다.
마우스가 완전히 살아난 것은 아닙니다. 아픈 마우스에게 진통제와 깁스를 채워준 정도입니다.
그래도 새 마우스를 준비할 때까지 시간은 벌어줍니다. 그리고 제가 사용해본 결과 꽤 문제 없이 오래 사용할수 있었습니다.
마지막으로 직접 분해를 하는 것은 진짜 추천하지 않습니다. 차라리 스위치가 여분이 있다면 납땜으로 바꾸는 것이 낫지 버튼 자체를 뜯어서 수리하는 것은 굉장히 어려웠고 제대로 동작하지도 않았습니다. ㅠㅠ
손 기술이 좋은 분은 굳이 말리진 않겠습니다. ㅋㅋㅋ
그럼 이 임시 방편이 많은 사람에게 도움이 됐으면 좋겠습니다. 그리고 저 역시 나중에 같은 문제가 생겼을 때 다시 써먹기 위해 이렇게 기록을 남겨둡니다.
![[윈도우 11] Print Screen 기본 캡처 끄기 (픽픽 단축키 충돌 해결) [윈도우 11] Print Screen 기본 캡처 끄기 (픽픽 단축키 충돌 해결) - 섬네일](https://lknote.com/wp-content/uploads/2026/07/disable-print-screen-snipping-tool-windows-11-thumbnail-150x150.webp)



