|
import sublime |
|
import sublime_plugin |
|
|
|
import time |
|
|
|
|
|
class UnregisteredKillerCommand(sublime_plugin.EventListener): |
|
SLEEP_DURATION = 0.1 |
|
LOOP_CHECK_COUNT = 30 |
|
UNREG_WINDOW_TITLE = 'This is an unregistered copy' |
|
MAIN_WINDOW_TITLE = ' - Sublime Text (UNREGISTERED)' |
|
|
|
windows_ctypes = None |
|
|
|
def __init__(self, *args, **kwargs): |
|
super().__init__(*args, **kwargs) |
|
|
|
if sublime.platform() == 'windows': |
|
import ctypes |
|
self.windows_ctypes = ctypes |
|
|
|
def on_pre_save_async(self, *args): |
|
for i in range(0, self.LOOP_CHECK_COUNT): |
|
active_windows = self.get_active_windows() |
|
unreg_window = None |
|
sublime_window = None |
|
|
|
for window in active_windows: |
|
if window['title'] == self.UNREG_WINDOW_TITLE: |
|
unreg_window = window['hwnd'] |
|
elif self.MAIN_WINDOW_TITLE in window['title']: |
|
sublime_window = window['hwnd'] |
|
|
|
if unreg_window and sublime_window: |
|
break |
|
|
|
if unreg_window and sublime_window: |
|
self.activate_window(sublime_window) |
|
self.close_window(unreg_window) |
|
break |
|
else: |
|
time.sleep(self.SLEEP_DURATION) |
|
|
|
|
|
def get_active_windows(self): |
|
windows = [] |
|
|
|
if sublime.platform() == 'windows': |
|
EnumWindows = self.windows_ctypes.windll.user32.EnumWindows |
|
EnumWindowsProc = self.windows_ctypes.WINFUNCTYPE( |
|
self.windows_ctypes.c_bool, |
|
self.windows_ctypes.POINTER(self.windows_ctypes.c_int), |
|
self.windows_ctypes.POINTER(self.windows_ctypes.c_int), |
|
) |
|
GetWindowText = self.windows_ctypes.windll.user32.GetWindowTextW |
|
GetWindowTextLength = self.windows_ctypes.windll.user32.GetWindowTextLengthW |
|
IsWindowVisible = self.windows_ctypes.windll.user32.IsWindowVisible |
|
|
|
def foreach_window(hwnd, lParam): |
|
if IsWindowVisible(hwnd): |
|
length = GetWindowTextLength(hwnd) |
|
buff = self.windows_ctypes.create_unicode_buffer(length + 1) |
|
GetWindowText(hwnd, buff, length + 1) |
|
windows.append({ |
|
'hwnd': hwnd, |
|
'title': buff.value, |
|
}) |
|
return True |
|
EnumWindows(EnumWindowsProc(foreach_window), 0) |
|
|
|
return windows |
|
|
|
def close_window(self, hwnd): |
|
if sublime.platform() == 'windows': |
|
# DestroyWindow = self.windows_ctypes.windll.user32.DestroyWindow |
|
# DestroyWindow(hwnd) |
|
|
|
SendMessage = self.windows_ctypes.windll.user32.SendMessageW |
|
WM_SYSCOMMAND = self.windows_ctypes.c_int(0x0112) |
|
SC_CLOSE = self.windows_ctypes.c_int(0xF060) |
|
SendMessage(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0) |
|
|
|
def activate_window(self, hwnd): |
|
if sublime.platform() == 'windows': |
|
SetForegroundWindow = self.windows_ctypes.windll.user32.SetForegroundWindow |
|
SetForegroundWindow(hwnd) |
LGTM