Интересно, зачем это?

Для Windows будет примерно так
import win32api
import win32con
import time
def is_key_pressed(key):
return win32api.GetAsyncKeyState(key) & 0x8000
is_button_changed = False
while True:
if is_key_pressed(win32con.VK_SHIFT):
if is_key_pressed(win32con.VK_LBUTTON):
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, 0)
is_button_changed = True
elif is_button_changed:
win32api.mouse_event(win32con.MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0)
is_button_changed = False
time.sleep(0.05)
Здесь, когда шифт нажимается, зажата ли левая клавиша мыши не имеет значения, потому что отловить реальное состояние становиться невозможным, т.к. мы посылаем MOUSEEVENTF_LEFTUP.
Возможно, правильнее бы было как-то подписаться на сообщения или поставить хук, но я winapi не силен. Гляньте MSDN или на win форумах поспрашивайте.
Если это делается в своей программе с GUI, нужно посмотреть на возможности GUI библиотеки и сделать через нее.