]> granicus.if.org Git - python/commitdiff
Add associator
authorBrian Curtin <brian@python.org>
Thu, 21 Jun 2012 03:48:54 +0000 (22:48 -0500)
committerBrian Curtin <brian@python.org>
Thu, 21 Jun 2012 03:48:54 +0000 (22:48 -0500)
PC/associator.c [new file with mode: 0644]
PC/associator.h [new file with mode: 0644]
PC/associator.rc [new file with mode: 0644]
PCbuild/associator.vcxproj [new file with mode: 0644]
PCbuild/associator.vcxproj.filters [new file with mode: 0644]
PCbuild/pcbuild.sln

diff --git a/PC/associator.c b/PC/associator.c
new file mode 100644 (file)
index 0000000..21dc3ff
--- /dev/null
@@ -0,0 +1,731 @@
+/*
+ * Copyright (C) 2011-2012 Vinay Sajip. All rights reserved.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <windows.h>
+#include <commctrl.h>
+#include <stdio.h>
+#include "associator.h"
+
+#define PYTHON_EXECUTABLE L"python.exe"
+
+#define MSGSIZE 1024
+#define MAX_VERSION_SIZE    4
+
+typedef struct {
+    wchar_t version[MAX_VERSION_SIZE]; /* m.n */
+    int bits;   /* 32 or 64 */
+    wchar_t executable[MAX_PATH];
+} INSTALLED_PYTHON;
+
+/*
+ * To avoid messing about with heap allocations, just assume we can allocate
+ * statically and never have to deal with more versions than this.
+ */
+#define MAX_INSTALLED_PYTHONS   100
+
+static INSTALLED_PYTHON installed_pythons[MAX_INSTALLED_PYTHONS];
+
+static size_t num_installed_pythons = 0;
+
+/* to hold SOFTWARE\Python\PythonCore\X.Y\InstallPath */
+#define IP_BASE_SIZE 40
+#define IP_SIZE (IP_BASE_SIZE + MAX_VERSION_SIZE)
+#define CORE_PATH L"SOFTWARE\\Python\\PythonCore"
+
+static wchar_t * location_checks[] = {
+    L"\\",
+/*
+    L"\\PCBuild\\",
+    L"\\PCBuild\\amd64\\",
+ */
+    NULL
+};
+
+static wchar_t *
+skip_whitespace(wchar_t * p)
+{
+    while (*p && isspace(*p))
+        ++p;
+    return p;
+}
+
+/*
+ * This function is here to minimise Visual Studio
+ * warnings about security implications of getenv, and to
+ * treat blank values as if they are absent.
+ */
+static wchar_t * get_env(wchar_t * key)
+{
+    wchar_t * result = _wgetenv(key);
+
+    if (result) {
+        result = skip_whitespace(result);
+        if (*result == L'\0')
+            result = NULL;
+    }
+    return result;
+}
+
+static FILE * log_fp = NULL;
+
+static void
+debug(wchar_t * format, ...)
+{
+    va_list va;
+
+    if (log_fp != NULL) {
+        va_start(va, format);
+        vfwprintf_s(log_fp, format, va);
+    }
+}
+
+static void winerror(int rc, wchar_t * message, int size)
+{
+    FormatMessageW(
+        FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+        NULL, rc, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+        message, size, NULL);
+}
+
+static INSTALLED_PYTHON *
+find_existing_python(wchar_t * path)
+{
+    INSTALLED_PYTHON * result = NULL;
+    size_t i;
+    INSTALLED_PYTHON * ip;
+
+    for (i = 0, ip = installed_pythons; i < num_installed_pythons; i++, ip++) {
+        if (_wcsicmp(path, ip->executable) == 0) {
+            result = ip;
+            break;
+        }
+    }
+    return result;
+}
+
+static void
+locate_pythons_for_key(HKEY root, REGSAM flags)
+{
+    HKEY core_root, ip_key;
+    LSTATUS status = RegOpenKeyExW(root, CORE_PATH, 0, flags, &core_root);
+    wchar_t message[MSGSIZE];
+    DWORD i;
+    size_t n;
+    BOOL ok;
+    DWORD type, data_size, attrs;
+    INSTALLED_PYTHON * ip, * pip;
+    wchar_t ip_path[IP_SIZE];
+    wchar_t * check;
+    wchar_t ** checkp;
+    wchar_t *key_name = (root == HKEY_LOCAL_MACHINE) ? L"HKLM" : L"HKCU";
+
+    if (status != ERROR_SUCCESS)
+        debug(L"locate_pythons_for_key: unable to open PythonCore key in %s\n",
+              key_name);
+    else {
+        ip = &installed_pythons[num_installed_pythons];
+        for (i = 0; num_installed_pythons < MAX_INSTALLED_PYTHONS; i++) {
+            status = RegEnumKeyW(core_root, i, ip->version, MAX_VERSION_SIZE);
+            if (status != ERROR_SUCCESS) {
+                if (status != ERROR_NO_MORE_ITEMS) {
+                    /* unexpected error */
+                    winerror(status, message, MSGSIZE);
+                    debug(L"Can't enumerate registry key for version %s: %s\n",
+                          ip->version, message);
+                }
+                break;
+            }
+            else {
+                _snwprintf_s(ip_path, IP_SIZE, _TRUNCATE,
+                             L"%s\\%s\\InstallPath", CORE_PATH, ip->version);
+                status = RegOpenKeyExW(root, ip_path, 0, flags, &ip_key);
+                if (status != ERROR_SUCCESS) {
+                    winerror(status, message, MSGSIZE);
+                    // Note: 'message' already has a trailing \n
+                    debug(L"%s\\%s: %s", key_name, ip_path, message);
+                    continue;
+                }
+                data_size = sizeof(ip->executable) - 1;
+                status = RegQueryValueEx(ip_key, NULL, NULL, &type,
+                                         (LPBYTE) ip->executable, &data_size);
+                RegCloseKey(ip_key);
+                if (status != ERROR_SUCCESS) {
+                    winerror(status, message, MSGSIZE);
+                    debug(L"%s\\%s: %s\n", key_name, ip_path, message);
+                    continue;
+                }
+                if (type == REG_SZ) {
+                    data_size = data_size / sizeof(wchar_t) - 1;  /* for NUL */
+                    if (ip->executable[data_size - 1] == L'\\')
+                        --data_size; /* reg value ended in a backslash */
+                    /* ip->executable is data_size long */
+                    for (checkp = location_checks; *checkp; ++checkp) {
+                        check = *checkp;
+                        _snwprintf_s(&ip->executable[data_size],
+                                     MAX_PATH - data_size,
+                                     MAX_PATH - data_size,
+                                     L"%s%s", check, PYTHON_EXECUTABLE);
+                        attrs = GetFileAttributesW(ip->executable);
+                        if (attrs == INVALID_FILE_ATTRIBUTES) {
+                            winerror(GetLastError(), message, MSGSIZE);
+                            debug(L"locate_pythons_for_key: %s: %s",
+                                  ip->executable, message);
+                        }
+                        else if (attrs & FILE_ATTRIBUTE_DIRECTORY) {
+                            debug(L"locate_pythons_for_key: '%s' is a \
+directory\n",
+                                  ip->executable, attrs);
+                        }
+                        else if (find_existing_python(ip->executable)) {
+                            debug(L"locate_pythons_for_key: %s: already \
+found: %s\n", ip->executable);
+                        }
+                        else {
+                            /* check the executable type. */
+                            ok = GetBinaryTypeW(ip->executable, &attrs);
+                            if (!ok) {
+                                debug(L"Failure getting binary type: %s\n",
+                                      ip->executable);
+                            }
+                            else {
+                                if (attrs == SCS_64BIT_BINARY)
+                                    ip->bits = 64;
+                                else if (attrs == SCS_32BIT_BINARY)
+                                    ip->bits = 32;
+                                else
+                                    ip->bits = 0;
+                                if (ip->bits == 0) {
+                                    debug(L"locate_pythons_for_key: %s: \
+invalid binary type: %X\n",
+                                          ip->executable, attrs);
+                                }
+                                else {
+                                    if (wcschr(ip->executable, L' ') != NULL) {
+                                        /* has spaces, so quote */
+                                        n = wcslen(ip->executable);
+                                        memmove(&ip->executable[1],
+                                                ip->executable, n * sizeof(wchar_t));
+                                        ip->executable[0] = L'\"';
+                                        ip->executable[n + 1] = L'\"';
+                                        ip->executable[n + 2] = L'\0';
+                                    }
+                                    debug(L"locate_pythons_for_key: %s \
+is a %dbit executable\n",
+                                        ip->executable, ip->bits);
+                                    ++num_installed_pythons;
+                                    pip = ip++;
+                                    if (num_installed_pythons >=
+                                        MAX_INSTALLED_PYTHONS)
+                                        break;
+                                    /* Copy over the attributes for the next */
+                                    *ip = *pip;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        RegCloseKey(core_root);
+    }
+}
+
+static int
+compare_pythons(const void * p1, const void * p2)
+{
+    INSTALLED_PYTHON * ip1 = (INSTALLED_PYTHON *) p1;
+    INSTALLED_PYTHON * ip2 = (INSTALLED_PYTHON *) p2;
+    /* note reverse sorting on version */
+    int result = wcscmp(ip2->version, ip1->version);
+
+    if (result == 0)
+        result = ip2->bits - ip1->bits; /* 64 before 32 */
+    return result;
+}
+
+static void
+locate_all_pythons()
+{
+#if defined(_M_X64)
+    // If we are a 64bit process, first hit the 32bit keys.
+    debug(L"locating Pythons in 32bit registry\n");
+    locate_pythons_for_key(HKEY_CURRENT_USER, KEY_READ | KEY_WOW64_32KEY);
+    locate_pythons_for_key(HKEY_LOCAL_MACHINE, KEY_READ | KEY_WOW64_32KEY);
+#else
+    // If we are a 32bit process on a 64bit Windows, first hit the 64bit keys.
+    BOOL f64 = FALSE;
+    if (IsWow64Process(GetCurrentProcess(), &f64) && f64) {
+        debug(L"locating Pythons in 64bit registry\n");
+        locate_pythons_for_key(HKEY_CURRENT_USER, KEY_READ | KEY_WOW64_64KEY);
+        locate_pythons_for_key(HKEY_LOCAL_MACHINE, KEY_READ | KEY_WOW64_64KEY);
+    }
+#endif    
+    // now hit the "native" key for this process bittedness.
+    debug(L"locating Pythons in native registry\n");
+    locate_pythons_for_key(HKEY_CURRENT_USER, KEY_READ);
+    locate_pythons_for_key(HKEY_LOCAL_MACHINE, KEY_READ);
+    qsort(installed_pythons, num_installed_pythons, sizeof(INSTALLED_PYTHON),
+          compare_pythons);
+}
+
+typedef struct {
+    wchar_t * path;
+    wchar_t * key;
+    wchar_t * value;
+} REGISTRY_ENTRY;
+
+static REGISTRY_ENTRY registry_entries[] = {
+    { L".py", NULL, L"Python.File" },
+    { L".pyc", NULL, L"Python.CompiledFile" },
+    { L".pyo", NULL, L"Python.CompiledFile" },
+    { L".pyw", NULL, L"Python.NoConFile" },
+
+    { L"Python.CompiledFile", NULL, L"Compiled Python File" },
+    { L"Python.CompiledFile\\DefaultIcon", NULL, L"pyc.ico" },
+    { L"Python.CompiledFile\\shell\\open", NULL, L"Open" },
+    { L"Python.CompiledFile\\shell\\open\\command", NULL, L"python.exe" },
+
+    { L"Python.File", NULL, L"Python File" },
+    { L"Python.File\\DefaultIcon", NULL, L"py.ico" },
+    { L"Python.File\\shell\\open", NULL, L"Open" },
+    { L"Python.File\\shell\\open\\command", NULL, L"python.exe" },
+
+    { L"Python.NoConFile", NULL, L"Python File (no console)" },
+    { L"Python.NoConFile\\DefaultIcon", NULL, L"py.ico" },
+    { L"Python.NoConFile\\shell\\open", NULL, L"Open" },
+    { L"Python.NoConFile\\shell\\open\\command", NULL, L"pythonw.exe" },
+
+    { NULL }
+};
+
+static BOOL
+do_association(INSTALLED_PYTHON * ip)
+{
+    LONG rc;
+    BOOL result = TRUE;
+    REGISTRY_ENTRY * rp = registry_entries;
+    wchar_t value[MAX_PATH];
+    wchar_t root[MAX_PATH];
+    wchar_t message[MSGSIZE];
+    wchar_t * pvalue;
+    HKEY hKey;
+    DWORD len;
+
+    wcsncpy_s(root, MAX_PATH, ip->executable, _TRUNCATE);
+    pvalue = wcsrchr(root, '\\');
+    if (pvalue)
+        *pvalue = L'\0';
+
+    for (; rp->path; ++rp) {
+        if (wcsstr(rp->path, L"DefaultIcon")) {
+            pvalue = value;
+            _snwprintf_s(value, MAX_PATH, _TRUNCATE,
+                         L"%s\\DLLs\\%s", root, rp->value);
+        }
+        else if (wcsstr(rp->path, L"open\\command")) {
+            pvalue = value;
+            _snwprintf_s(value, MAX_PATH, _TRUNCATE,
+                         L"%s\\%s \"%%1\" %%*", root, rp->value);
+        }
+        else {
+            pvalue = rp->value;
+        }
+        /* use rp->path, rp->key, pvalue */
+        /* NOTE: size is in bytes */
+        len = (DWORD) ((1 + wcslen(pvalue)) * sizeof(wchar_t));
+        rc = RegOpenKeyEx(HKEY_CLASSES_ROOT, rp->path, 0, KEY_SET_VALUE, &hKey);
+        if (rc == ERROR_SUCCESS) {
+            rc = RegSetValueExW(hKey, rp->key, 0, REG_SZ, (LPBYTE) pvalue, len);
+            RegCloseKey(hKey);
+        }
+        if (rc != ERROR_SUCCESS) {
+            winerror(rc, message, MSGSIZE);
+            MessageBoxW(NULL, message, L"Unable to set file associations", MB_OK | MB_ICONSTOP);
+            result = FALSE;
+            break;
+        }
+    }
+    return result;
+}
+
+static BOOL
+associations_exist()
+{
+    BOOL result = FALSE;
+    REGISTRY_ENTRY * rp = registry_entries;
+    wchar_t buffer[MSGSIZE];
+    LONG csize = MSGSIZE * sizeof(wchar_t);
+    LONG rc;
+
+    /* Currently, if any is found, we assume they're all there. */
+
+    for (; rp->path; ++rp) {
+        LONG size = csize;
+        rc = RegQueryValueW(HKEY_CLASSES_ROOT, rp->path, buffer, &size); 
+        if (rc == ERROR_SUCCESS) {
+            result = TRUE;
+            break;
+        }
+    }
+    return result;
+}
+
+/* --------------------------------------------------------------------*/
+
+static BOOL CALLBACK
+find_by_title(HWND hwnd, LPARAM lParam)
+{
+    wchar_t buffer[MSGSIZE];
+    BOOL not_found = TRUE;
+
+    wchar_t * p = (wchar_t *) GetWindowTextW(hwnd, buffer, MSGSIZE);
+    if (wcsstr(buffer, L"Python Launcher") == buffer) {
+        not_found = FALSE;
+        *((HWND *) lParam) = hwnd;
+    }
+    return not_found;
+}
+
+static HWND
+find_installer_window()
+{
+    HWND result = NULL;
+    BOOL found = EnumWindows(find_by_title, (LPARAM) &result);
+
+    return result;
+}
+
+static void
+centre_window_in_front(HWND hwnd)
+{
+    HWND hwndParent;
+    RECT rect, rectP;
+    int width, height;      
+    int screenwidth, screenheight;
+    int x, y;
+
+    //make the window relative to its parent
+
+    screenwidth  = GetSystemMetrics(SM_CXSCREEN);
+    screenheight = GetSystemMetrics(SM_CYSCREEN);
+
+    hwndParent = GetParent(hwnd);
+
+    GetWindowRect(hwnd, &rect);
+    if (hwndParent) {
+        GetWindowRect(hwndParent, &rectP);
+    }
+    else {
+        rectP.left = rectP.top = 0;
+        rectP.right = screenwidth;
+        rectP.bottom = screenheight;
+    }
+
+    width  = rect.right  - rect.left;
+    height = rect.bottom - rect.top;
+
+    x = ((rectP.right-rectP.left) -  width) / 2 + rectP.left;
+    y = ((rectP.bottom-rectP.top) - height) / 2 + rectP.top;
+
+
+    //make sure that the dialog box never moves outside of
+    //the screen
+
+    if (x < 0)
+        x = 0;
+
+    if (y < 0)
+        y = 0;
+
+    if (x + width  > screenwidth)
+        x = screenwidth  - width;
+    if (y + height > screenheight)
+        y = screenheight - height;
+
+    SetWindowPos(hwnd, HWND_TOPMOST, x, y, width, height, SWP_SHOWWINDOW);
+}
+
+static void
+init_list(HWND hList)
+{
+    LVCOLUMNW column;
+    LVITEMW item;
+    int colno = 0;
+    int width = 0;
+    int row;
+    size_t i;
+    INSTALLED_PYTHON * ip;
+    RECT r;
+    LPARAM style;
+
+    GetClientRect(hList, &r);
+
+    style = SendMessage(hList, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
+    SendMessage(hList, LVM_SETEXTENDEDLISTVIEWSTYLE,
+                0, style | LVS_EX_FULLROWSELECT);
+
+    /* First set up the columns */
+    memset(&column, 0, sizeof(column));
+    column.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
+    column.pszText = L"Version";
+    column.cx = 60;
+    width += column.cx;
+    SendMessage(hList, LVM_INSERTCOLUMN, colno++,(LPARAM) &column);
+#if defined(_M_X64)
+    column.pszText = L"Bits";
+    column.cx = 40;
+    column.iSubItem = colno;
+    SendMessage(hList, LVM_INSERTCOLUMN, colno++,(LPARAM) &column);
+    width += column.cx;
+#endif
+    column.pszText = L"Path";
+    column.cx = r.right - r.top - width;
+    column.iSubItem = colno;
+    SendMessage(hList, LVM_INSERTCOLUMN, colno++,(LPARAM) &column);
+
+    /* Then insert the rows */
+    memset(&item, 0, sizeof(item));
+    item.mask = LVIF_TEXT;
+    for (i = 0, ip = installed_pythons;  i < num_installed_pythons; i++,ip++) {
+        item.iItem = (int) i;
+        item.iSubItem = 0;
+        item.pszText = ip->version;
+        colno = 0;
+        row = (int) SendMessage(hList, LVM_INSERTITEM, 0, (LPARAM) &item);
+#if defined(_M_X64)
+        item.iSubItem = ++colno;
+        item.pszText = (ip->bits == 64) ? L"64": L"32";
+        SendMessage(hList, LVM_SETITEM, row, (LPARAM) &item);
+#endif
+        item.iSubItem = ++colno;
+        item.pszText = ip->executable;
+        SendMessage(hList, LVM_SETITEM, row, (LPARAM) &item);
+    }
+}
+
+/* ----------------------------------------------------------------*/
+
+typedef int (__stdcall *MSGBOXWAPI)(IN HWND hWnd, 
+        IN LPCWSTR lpText, IN LPCWSTR lpCaption, 
+        IN UINT uType, IN WORD wLanguageId, IN DWORD dwMilliseconds);
+
+int MessageBoxTimeoutW(IN HWND hWnd, IN LPCWSTR lpText, 
+    IN LPCWSTR lpCaption, IN UINT uType, 
+    IN WORD wLanguageId, IN DWORD dwMilliseconds);
+
+#define MB_TIMEDOUT 32000
+
+int MessageBoxTimeoutW(HWND hWnd, LPCWSTR lpText, 
+    LPCWSTR lpCaption, UINT uType, WORD wLanguageId, DWORD dwMilliseconds)
+{
+    static MSGBOXWAPI MsgBoxTOW = NULL;
+
+    if (!MsgBoxTOW) {
+        HMODULE hUser32 = GetModuleHandleW(L"user32.dll");
+        if (hUser32)
+            MsgBoxTOW = (MSGBOXWAPI)GetProcAddress(hUser32, 
+                                      "MessageBoxTimeoutW");
+        else {
+            //stuff happened, add code to handle it here 
+            //(possibly just call MessageBox())
+            return 0;
+        }
+    }
+
+    if (MsgBoxTOW)
+        return MsgBoxTOW(hWnd, lpText, lpCaption, uType, wLanguageId,
+                         dwMilliseconds);
+
+    return 0;
+}
+/* ----------------------------------------------------------------*/
+
+static INT_PTR CALLBACK
+DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    HWND hList;
+    HWND hChild;
+    static int selected_index = -1;
+    WORD low = LOWORD(wParam);
+    wchar_t confirmation[MSGSIZE];
+    BOOL result = FALSE;
+
+    debug(L"DialogProc entry: 0x%02X\n", message);
+    switch (message) {
+    case WM_INITDIALOG:
+        hList = GetDlgItem(hDlg, IDC_LIST1);
+        init_list(hList);
+        SetFocus(hList);
+        result = TRUE;
+        break;
+    case WM_COMMAND:
+        if((low == IDOK) || (low == IDCANCEL)) {
+            HMODULE hUser32 = LoadLibraryW(L"user32.dll");
+
+            if (low == IDCANCEL)
+                wcsncpy_s(confirmation, MSGSIZE, L"No association was \
+performed.", _TRUNCATE);
+            else {
+                if (selected_index < 0) {
+                /* should never happen */
+                    wcsncpy_s(confirmation, MSGSIZE, L"The Python version to \
+associate with couldn't be determined.", _TRUNCATE);
+                }
+                else {
+                    INSTALLED_PYTHON * ip = &installed_pythons[selected_index];
+
+                    /* Do the association and set the message. */
+                    do_association(ip);
+                    _snwprintf_s(confirmation, MSGSIZE, _TRUNCATE,
+                                 L"Associated Python files with the Python %s \
+found at '%s'", ip->version, ip->executable);
+                }
+            }
+
+            if (hUser32) {
+                MessageBoxTimeoutW(hDlg,
+                                   confirmation, 
+                                   L"Association Status",
+                                   MB_OK | MB_SETFOREGROUND |
+                                   MB_ICONINFORMATION,
+                                   0, 2000);
+                FreeLibrary(hUser32);
+            }
+            PostQuitMessage(0);
+            EndDialog(hDlg, 0);
+            result = TRUE;
+        }
+        break;
+    case WM_NOTIFY:
+        if (low == IDC_LIST1) {
+            NMLISTVIEW * p = (NMLISTVIEW *) lParam;
+
+            if ((p->hdr.code == LVN_ITEMCHANGED) &&
+                (p->uNewState & LVIS_SELECTED)) {
+                hChild = GetDlgItem(hDlg, IDOK);
+                selected_index = p->iItem;
+                EnableWindow(hChild, selected_index >= 0);
+            }
+            result = TRUE;
+        }
+        break;
+    case WM_DESTROY:
+        PostQuitMessage(0);
+        result = TRUE;
+        break;
+    case WM_CLOSE:
+        DestroyWindow(hDlg);
+        result = TRUE;
+        break;
+    }
+    debug(L"DialogProc exit: %d\n", result);
+    return result;
+}
+
+int WINAPI wWinMain(HINSTANCE hInstance,
+                   HINSTANCE hPrevInstance,
+                   LPWSTR lpCmdLine, int nShow)
+{
+    MSG  msg;
+    HWND hDialog = 0;
+    HICON hIcon;
+    HWND hParent;
+    int status;
+    DWORD dw;
+    INITCOMMONCONTROLSEX icx;
+    wchar_t * wp;
+
+    wp = get_env(L"PYASSOC_DEBUG");
+    if ((wp != NULL) && (*wp != L'\0')) {
+        fopen_s(&log_fp, "c:\\temp\\associator.log", "w");
+    }
+
+    if (!lpCmdLine) {
+        debug(L"No command line specified.\n");
+        return 0;
+    }
+    if (!wcsstr(lpCmdLine, L"nocheck") &&
+        associations_exist())   /* Could have been restored by uninstall. */
+        return 0;
+
+    locate_all_pythons();
+
+    if (num_installed_pythons == 0)
+        return 0;
+
+    debug(L"%d pythons found.\n", num_installed_pythons);
+
+    /*
+     * OK, now there's something to do.
+     *
+     * We need to find the installer window to be the parent of
+     * our dialog, otherwise our dialog will be behind it.
+     *
+     * First, initialize common controls. If you don't - on
+     * some machines it works fine, on others the dialog never
+     * appears!
+     */
+
+    icx.dwSize = sizeof(icx);
+    icx.dwICC = ICC_LISTVIEW_CLASSES;
+    InitCommonControlsEx(&icx);
+
+    hParent = find_installer_window();
+    debug(L"installer window: %X\n", hParent);
+    hDialog = CreateDialogW(hInstance, MAKEINTRESOURCE(DLG_MAIN), hParent,
+                            DialogProc);
+    dw = GetLastError();
+    debug(L"dialog created: %X: error: %X\n", hDialog, dw);
+
+    if (!hDialog)
+    {
+        wchar_t buf [100];
+        _snwprintf_s(buf, 100, _TRUNCATE, L"Error 0x%x", GetLastError());
+        MessageBoxW(0, buf, L"CreateDialog", MB_ICONEXCLAMATION | MB_OK);
+        return 1;
+    }
+
+    centre_window_in_front(hDialog);
+    hIcon = LoadIcon( GetModuleHandle(NULL), MAKEINTRESOURCE(DLG_ICON));
+    if( hIcon )
+    {
+       SendMessage(hDialog, WM_SETICON, ICON_BIG, (LPARAM) hIcon);
+       SendMessage(hDialog, WM_SETICON, ICON_SMALL, (LPARAM) hIcon);
+       DestroyIcon(hIcon);
+    }
+
+    while ((status = GetMessage (& msg, 0, 0, 0)) != 0)
+    {
+        if (status == -1)
+            return -1;
+        if (!IsDialogMessage(hDialog, & msg))
+        {
+            TranslateMessage( & msg );
+            DispatchMessage( & msg );
+        }
+    }
+
+    return (int) msg.wParam;
+}
diff --git a/PC/associator.h b/PC/associator.h
new file mode 100644 (file)
index 0000000..a2c1cde
--- /dev/null
@@ -0,0 +1,1480 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by main.rc
+//
+#define SW_HIDE                         0
+#define HIDE_WINDOW                     0
+#define WM_NULL                         0x0000
+#define WA_INACTIVE                     0
+#define HTNOWHERE                       0
+#define SMTO_NORMAL                     0x0000
+#define ICON_SMALL                      0
+#define SIZE_RESTORED                   0
+#define BN_CLICKED                      0
+#define BST_UNCHECKED                   0x0000
+#define HDS_HORZ                        0x0000
+#define TBSTYLE_BUTTON                  0x0000
+#define TBS_HORZ                        0x0000
+#define TBS_BOTTOM                      0x0000
+#define TBS_RIGHT                       0x0000
+#define LVS_ICON                        0x0000
+#define LVS_ALIGNTOP                    0x0000
+#define TCS_TABS                        0x0000
+#define TCS_SINGLELINE                  0x0000
+#define TCS_RIGHTJUSTIFY                0x0000
+#define DTS_SHORTDATEFORMAT             0x0000
+#define PGS_VERT                        0x00000000
+#define LANG_NEUTRAL                    0x00
+#define SUBLANG_NEUTRAL                 0x00
+#define SORT_DEFAULT                    0x0
+#define SORT_JAPANESE_XJIS              0x0
+#define SORT_CHINESE_BIG5               0x0
+#define SORT_CHINESE_PRCP               0x0
+#define SORT_KOREAN_KSC                 0x0
+#define SORT_HUNGARIAN_DEFAULT          0x0
+#define SORT_GEORGIAN_TRADITIONAL       0x0
+#define _USE_DECLSPECS_FOR_SAL          0
+#define SW_SHOWNORMAL                   1
+#define SW_NORMAL                       1
+#define SHOW_OPENWINDOW                 1
+#define SW_PARENTCLOSING                1
+#define VK_LBUTTON                      0x01
+#define WM_CREATE                       0x0001
+#define WA_ACTIVE                       1
+#define PWR_OK                          1
+#define PWR_SUSPENDREQUEST              1
+#define NFR_ANSI                        1
+#define UIS_SET                         1
+#define UISF_HIDEFOCUS                  0x1
+#define XBUTTON1                        0x0001
+#define WMSZ_LEFT                       1
+#define HTCLIENT                        1
+#define SMTO_BLOCK                      0x0001
+#define MA_ACTIVATE                     1
+#define ICON_BIG                        1
+#define SIZE_MINIMIZED                  1
+#define MK_LBUTTON                      0x0001
+#define TME_HOVER                       0x00000001
+#define CS_VREDRAW                      0x0001
+#define CF_TEXT                         1
+#define SCF_ISSECURE                    0x00000001
+#define IDOK                            1
+#define BN_PAINT                        1
+#define BST_CHECKED                     0x0001
+#define TBSTYLE_SEP                     0x0001
+#define TTS_ALWAYSTIP                   0x01
+#define TBS_AUTOTICKS                   0x0001
+#define UDS_WRAP                        0x0001
+#define PBS_SMOOTH                      0x01
+#define LWS_TRANSPARENT                 0x0001
+#define LVS_REPORT                      0x0001
+#define TVS_HASBUTTONS                  0x0001
+#define TCS_SCROLLOPPOSITE              0x0001
+#define ACS_CENTER                      0x0001
+#define MCS_DAYSTATE                    0x0001
+#define DTS_UPDOWN                      0x0001
+#define PGS_HORZ                        0x00000001
+#define NFS_EDIT                        0x0001
+#define BCSIF_GLYPH                     0x0001
+#define BCSS_NOSPLIT                    0x0001
+#define LANG_ARABIC                     0x01
+#define SUBLANG_DEFAULT                 0x01
+#define SUBLANG_AFRIKAANS_SOUTH_AFRICA  0x01
+#define SUBLANG_ALBANIAN_ALBANIA        0x01
+#define SUBLANG_ALSATIAN_FRANCE         0x01
+#define SUBLANG_AMHARIC_ETHIOPIA        0x01
+#define SUBLANG_ARABIC_SAUDI_ARABIA     0x01
+#define SUBLANG_ARMENIAN_ARMENIA        0x01
+#define SUBLANG_ASSAMESE_INDIA          0x01
+#define SUBLANG_AZERI_LATIN             0x01
+#define SUBLANG_BASHKIR_RUSSIA          0x01
+#define SUBLANG_BASQUE_BASQUE           0x01
+#define SUBLANG_BELARUSIAN_BELARUS      0x01
+#define SUBLANG_BENGALI_INDIA           0x01
+#define SUBLANG_BRETON_FRANCE           0x01
+#define SUBLANG_BULGARIAN_BULGARIA      0x01
+#define SUBLANG_CATALAN_CATALAN         0x01
+#define SUBLANG_CHINESE_TRADITIONAL     0x01
+#define SUBLANG_CORSICAN_FRANCE         0x01
+#define SUBLANG_CZECH_CZECH_REPUBLIC    0x01
+#define SUBLANG_CROATIAN_CROATIA        0x01
+#define SUBLANG_DANISH_DENMARK          0x01
+#define SUBLANG_DARI_AFGHANISTAN        0x01
+#define SUBLANG_DIVEHI_MALDIVES         0x01
+#define SUBLANG_DUTCH                   0x01
+#define SUBLANG_ENGLISH_US              0x01
+#define SUBLANG_ESTONIAN_ESTONIA        0x01
+#define SUBLANG_FAEROESE_FAROE_ISLANDS  0x01
+#define SUBLANG_FILIPINO_PHILIPPINES    0x01
+#define SUBLANG_FINNISH_FINLAND         0x01
+#define SUBLANG_FRENCH                  0x01
+#define SUBLANG_FRISIAN_NETHERLANDS     0x01
+#define SUBLANG_GALICIAN_GALICIAN       0x01
+#define SUBLANG_GEORGIAN_GEORGIA        0x01
+#define SUBLANG_GERMAN                  0x01
+#define SUBLANG_GREEK_GREECE            0x01
+#define SUBLANG_GREENLANDIC_GREENLAND   0x01
+#define SUBLANG_GUJARATI_INDIA          0x01
+#define SUBLANG_HAUSA_NIGERIA_LATIN     0x01
+#define SUBLANG_HEBREW_ISRAEL           0x01
+#define SUBLANG_HINDI_INDIA             0x01
+#define SUBLANG_HUNGARIAN_HUNGARY       0x01
+#define SUBLANG_ICELANDIC_ICELAND       0x01
+#define SUBLANG_IGBO_NIGERIA            0x01
+#define SUBLANG_INDONESIAN_INDONESIA    0x01
+#define SUBLANG_INUKTITUT_CANADA        0x01
+#define SUBLANG_ITALIAN                 0x01
+#define SUBLANG_JAPANESE_JAPAN          0x01
+#define SUBLANG_KANNADA_INDIA           0x01
+#define SUBLANG_KAZAK_KAZAKHSTAN        0x01
+#define SUBLANG_KHMER_CAMBODIA          0x01
+#define SUBLANG_KICHE_GUATEMALA         0x01
+#define SUBLANG_KINYARWANDA_RWANDA      0x01
+#define SUBLANG_KONKANI_INDIA           0x01
+#define SUBLANG_KOREAN                  0x01
+#define SUBLANG_KYRGYZ_KYRGYZSTAN       0x01
+#define SUBLANG_LAO_LAO                 0x01
+#define SUBLANG_LATVIAN_LATVIA          0x01
+#define SUBLANG_LITHUANIAN              0x01
+#define SUBLANG_LUXEMBOURGISH_LUXEMBOURG 0x01
+#define SUBLANG_MACEDONIAN_MACEDONIA    0x01
+#define SUBLANG_MALAY_MALAYSIA          0x01
+#define SUBLANG_MALAYALAM_INDIA         0x01
+#define SUBLANG_MALTESE_MALTA           0x01
+#define SUBLANG_MAORI_NEW_ZEALAND       0x01
+#define SUBLANG_MAPUDUNGUN_CHILE        0x01
+#define SUBLANG_MARATHI_INDIA           0x01
+#define SUBLANG_MOHAWK_MOHAWK           0x01
+#define SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA 0x01
+#define SUBLANG_NEPALI_NEPAL            0x01
+#define SUBLANG_NORWEGIAN_BOKMAL        0x01
+#define SUBLANG_OCCITAN_FRANCE          0x01
+#define SUBLANG_ORIYA_INDIA             0x01
+#define SUBLANG_PASHTO_AFGHANISTAN      0x01
+#define SUBLANG_PERSIAN_IRAN            0x01
+#define SUBLANG_POLISH_POLAND           0x01
+#define SUBLANG_PORTUGUESE_BRAZILIAN    0x01
+#define SUBLANG_PUNJABI_INDIA           0x01
+#define SUBLANG_QUECHUA_BOLIVIA         0x01
+#define SUBLANG_ROMANIAN_ROMANIA        0x01
+#define SUBLANG_ROMANSH_SWITZERLAND     0x01
+#define SUBLANG_RUSSIAN_RUSSIA          0x01
+#define SUBLANG_SAMI_NORTHERN_NORWAY    0x01
+#define SUBLANG_SANSKRIT_INDIA          0x01
+#define SUBLANG_SERBIAN_CROATIA         0x01
+#define SUBLANG_SINDHI_INDIA            0x01
+#define SUBLANG_SINHALESE_SRI_LANKA     0x01
+#define SUBLANG_SOTHO_NORTHERN_SOUTH_AFRICA 0x01
+#define SUBLANG_SLOVAK_SLOVAKIA         0x01
+#define SUBLANG_SLOVENIAN_SLOVENIA      0x01
+#define SUBLANG_SPANISH                 0x01
+#define SUBLANG_SWAHILI_KENYA           0x01
+#define SUBLANG_SWEDISH                 0x01
+#define SUBLANG_SYRIAC_SYRIA            0x01
+#define SUBLANG_TAJIK_TAJIKISTAN        0x01
+#define SUBLANG_TAMIL_INDIA             0x01
+#define SUBLANG_TATAR_RUSSIA            0x01
+#define SUBLANG_TELUGU_INDIA            0x01
+#define SUBLANG_THAI_THAILAND           0x01
+#define SUBLANG_TIBETAN_PRC             0x01
+#define SUBLANG_TSWANA_SOUTH_AFRICA     0x01
+#define SUBLANG_TURKISH_TURKEY          0x01
+#define SUBLANG_TURKMEN_TURKMENISTAN    0x01
+#define SUBLANG_UIGHUR_PRC              0x01
+#define SUBLANG_UKRAINIAN_UKRAINE       0x01
+#define SUBLANG_UPPER_SORBIAN_GERMANY   0x01
+#define SUBLANG_URDU_PAKISTAN           0x01
+#define SUBLANG_UZBEK_LATIN             0x01
+#define SUBLANG_VIETNAMESE_VIETNAM      0x01
+#define SUBLANG_WELSH_UNITED_KINGDOM    0x01
+#define SUBLANG_WOLOF_SENEGAL           0x01
+#define SUBLANG_XHOSA_SOUTH_AFRICA      0x01
+#define SUBLANG_YAKUT_RUSSIA            0x01
+#define SUBLANG_YI_PRC                  0x01
+#define SUBLANG_YORUBA_NIGERIA          0x01
+#define SUBLANG_ZULU_SOUTH_AFRICA       0x01
+#define SORT_INVARIANT_MATH             0x1
+#define SORT_JAPANESE_UNICODE           0x1
+#define SORT_CHINESE_UNICODE            0x1
+#define SORT_KOREAN_UNICODE             0x1
+#define SORT_GERMAN_PHONE_BOOK          0x1
+#define SORT_HUNGARIAN_TECHNICAL        0x1
+#define SORT_GEORGIAN_MODERN            0x1
+#define VS_VERSION_INFO                 1
+#define VFFF_ISSHAREDFILE               0x0001
+#define VFF_CURNEDEST                   0x0001
+#define VIFF_FORCEINSTALL               0x0001
+#define SW_SHOWMINIMIZED                2
+#define SHOW_ICONWINDOW                 2
+#define SW_OTHERZOOM                    2
+#define VK_RBUTTON                      0x02
+#define WM_DESTROY                      0x0002
+#define WA_CLICKACTIVE                  2
+#define PWR_SUSPENDRESUME               2
+#define NFR_UNICODE                     2
+#define UIS_CLEAR                       2
+#define UISF_HIDEACCEL                  0x2
+#define XBUTTON2                        0x0002
+#define WMSZ_RIGHT                      2
+#define HTCAPTION                       2
+#define SMTO_ABORTIFHUNG                0x0002
+#define MA_ACTIVATEANDEAT               2
+#define ICON_SMALL2                     2
+#define SIZE_MAXIMIZED                  2
+#define MK_RBUTTON                      0x0002
+#define TME_LEAVE                       0x00000002
+#define CS_HREDRAW                      0x0002
+#define CF_BITMAP                       2
+#define IDCANCEL                        2
+#define BN_HILITE                       2
+#define BST_INDETERMINATE               0x0002
+#define HDS_BUTTONS                     0x0002
+#define TBSTYLE_CHECK                   0x0002
+#define TTS_NOPREFIX                    0x02
+#define TBS_VERT                        0x0002
+#define UDS_SETBUDDYINT                 0x0002
+#define LWS_IGNORERETURN                0x0002
+#define LVS_SMALLICON                   0x0002
+#define TVS_HASLINES                    0x0002
+#define TVS_EX_MULTISELECT              0x0002
+#define TCS_BOTTOM                      0x0002
+#define TCS_RIGHT                       0x0002
+#define ACS_TRANSPARENT                 0x0002
+#define MCS_MULTISELECT                 0x0002
+#define DTS_SHOWNONE                    0x0002
+#define PGS_AUTOSCROLL                  0x00000002
+#define NFS_STATIC                      0x0002
+#define BCSIF_IMAGE                     0x0002
+#define BCSS_STRETCH                    0x0002
+#define LANG_BULGARIAN                  0x02
+#define SUBLANG_SYS_DEFAULT             0x02
+#define SUBLANG_ARABIC_IRAQ             0x02
+#define SUBLANG_AZERI_CYRILLIC          0x02
+#define SUBLANG_BENGALI_BANGLADESH      0x02
+#define SUBLANG_CHINESE_SIMPLIFIED      0x02
+#define SUBLANG_DUTCH_BELGIAN           0x02
+#define SUBLANG_ENGLISH_UK              0x02
+#define SUBLANG_FRENCH_BELGIAN          0x02
+#define SUBLANG_GERMAN_SWISS            0x02
+#define SUBLANG_INUKTITUT_CANADA_LATIN  0x02
+#define SUBLANG_IRISH_IRELAND           0x02
+#define SUBLANG_ITALIAN_SWISS           0x02
+#define SUBLANG_KASHMIRI_SASIA          0x02
+#define SUBLANG_KASHMIRI_INDIA          0x02
+#define SUBLANG_LOWER_SORBIAN_GERMANY   0x02
+#define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02
+#define SUBLANG_MONGOLIAN_PRC           0x02
+#define SUBLANG_NEPALI_INDIA            0x02
+#define SUBLANG_NORWEGIAN_NYNORSK       0x02
+#define SUBLANG_PORTUGUESE              0x02
+#define SUBLANG_QUECHUA_ECUADOR         0x02
+#define SUBLANG_SAMI_NORTHERN_SWEDEN    0x02
+#define SUBLANG_SERBIAN_LATIN           0x02
+#define SUBLANG_SINDHI_PAKISTAN         0x02
+#define SUBLANG_SINDHI_AFGHANISTAN      0x02
+#define SUBLANG_SPANISH_MEXICAN         0x02
+#define SUBLANG_SWEDISH_FINLAND         0x02
+#define SUBLANG_TAMAZIGHT_ALGERIA_LATIN 0x02
+#define SUBLANG_TIGRIGNA_ERITREA        0x02
+#define SUBLANG_URDU_INDIA              0x02
+#define SUBLANG_UZBEK_CYRILLIC          0x02
+#define SORT_CHINESE_PRC                0x2
+#define VFF_FILEINUSE                   0x0002
+#define VIFF_DONTDELETEOLD              0x0002
+#define SW_SHOWMAXIMIZED                3
+#define SW_MAXIMIZE                     3
+#define SHOW_FULLSCREEN                 3
+#define SW_PARENTOPENING                3
+#define VK_CANCEL                       0x03
+#define WM_MOVE                         0x0003
+#define PWR_CRITICALRESUME              3
+#define NF_QUERY                        3
+#define UIS_INITIALIZE                  3
+#define WMSZ_TOP                        3
+#define HTSYSMENU                       3
+#define MA_NOACTIVATE                   3
+#define SIZE_MAXSHOW                    3
+#define CF_METAFILEPICT                 3
+#define IDABORT                         3
+#define BN_UNHILITE                     3
+#define LVS_LIST                        0x0003
+#define LVS_TYPEMASK                    0x0003
+#define LANG_CATALAN                    0x03
+#define SUBLANG_CUSTOM_DEFAULT          0x03
+#define SUBLANG_ARABIC_EGYPT            0x03
+#define SUBLANG_CHINESE_HONGKONG        0x03
+#define SUBLANG_ENGLISH_AUS             0x03
+#define SUBLANG_FRENCH_CANADIAN         0x03
+#define SUBLANG_GERMAN_AUSTRIAN         0x03
+#define SUBLANG_QUECHUA_PERU            0x03
+#define SUBLANG_SAMI_NORTHERN_FINLAND   0x03
+#define SUBLANG_SERBIAN_CYRILLIC        0x03
+#define SUBLANG_SPANISH_MODERN          0x03
+#define SORT_CHINESE_BOPOMOFO           0x3
+#define SW_SHOWNOACTIVATE               4
+#define SHOW_OPENNOACTIVATE             4
+#define SW_OTHERUNZOOM                  4
+#define VK_MBUTTON                      0x04
+#define NF_REQUERY                      4
+#define UISF_ACTIVE                     0x4
+#define WMSZ_TOPLEFT                    4
+#define HTGROWBOX                       4
+#define MA_NOACTIVATEANDEAT             4
+#define SIZE_MAXHIDE                    4
+#define MK_SHIFT                        0x0004
+#define CF_SYLK                         4
+#define IDRETRY                         4
+#define BN_DISABLE                      4
+#define BST_PUSHED                      0x0004
+#define HDS_HOTTRACK                    0x0004
+#define TBSTYLE_GROUP                   0x0004
+#define TBS_TOP                         0x0004
+#define TBS_LEFT                        0x0004
+#define UDS_ALIGNRIGHT                  0x0004
+#define PBS_VERTICAL                    0x04
+#define LWS_NOPREFIX                    0x0004
+#define LVS_SINGLESEL                   0x0004
+#define TVS_LINESATROOT                 0x0004
+#define TVS_EX_DOUBLEBUFFER             0x0004
+#define TCS_MULTISELECT                 0x0004
+#define ACS_AUTOPLAY                    0x0004
+#define MCS_WEEKNUMBERS                 0x0004
+#define DTS_LONGDATEFORMAT              0x0004
+#define PGS_DRAGNDROP                   0x00000004
+#define NFS_LISTCOMBO                   0x0004
+#define BCSIF_STYLE                     0x0004
+#define BCSS_ALIGNLEFT                  0x0004
+#define LANG_CHINESE                    0x04
+#define LANG_CHINESE_SIMPLIFIED         0x04
+#define SUBLANG_CUSTOM_UNSPECIFIED      0x04
+#define SUBLANG_ARABIC_LIBYA            0x04
+#define SUBLANG_CHINESE_SINGAPORE       0x04
+#define SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN 0x04
+#define SUBLANG_ENGLISH_CAN             0x04
+#define SUBLANG_FRENCH_SWISS            0x04
+#define SUBLANG_GERMAN_LUXEMBOURG       0x04
+#define SUBLANG_SAMI_LULE_NORWAY        0x04
+#define SUBLANG_SPANISH_GUATEMALA       0x04
+#define SORT_JAPANESE_RADICALSTROKE     0x4
+#define VFF_BUFFTOOSMALL                0x0004
+#define SW_SHOW                         5
+#define VK_XBUTTON1                     0x05
+#define WM_SIZE                         0x0005
+#define WMSZ_TOPRIGHT                   5
+#define HTMENU                          5
+#define CF_DIF                          5
+#define IDIGNORE                        5
+#define BN_DOUBLECLICKED                5
+#define LANG_CZECH                      0x05
+#define SUBLANG_UI_CUSTOM_DEFAULT       0x05
+#define SUBLANG_ARABIC_ALGERIA          0x05
+#define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN 0x05
+#define SUBLANG_CHINESE_MACAU           0x05
+#define SUBLANG_ENGLISH_NZ              0x05
+#define SUBLANG_FRENCH_LUXEMBOURG       0x05
+#define SUBLANG_GERMAN_LIECHTENSTEIN    0x05
+#define SUBLANG_SAMI_LULE_SWEDEN        0x05
+#define SUBLANG_SPANISH_COSTA_RICA      0x05
+#define SW_MINIMIZE                     6
+#define VK_XBUTTON2                     0x06
+#define WM_ACTIVATE                     0x0006
+#define WMSZ_BOTTOM                     6
+#define HTHSCROLL                       6
+#define CF_TIFF                         6
+#define IDYES                           6
+#define BN_SETFOCUS                     6
+#define LANG_DANISH                     0x06
+#define SUBLANG_ARABIC_MOROCCO          0x06
+#define SUBLANG_ENGLISH_EIRE            0x06
+#define SUBLANG_FRENCH_MONACO           0x06
+#define SUBLANG_SAMI_SOUTHERN_NORWAY    0x06
+#define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_LATIN 0x06
+#define SUBLANG_SPANISH_PANAMA          0x06
+#define SW_SHOWMINNOACTIVE              7
+#define WM_SETFOCUS                     0x0007
+#define WMSZ_BOTTOMLEFT                 7
+#define HTVSCROLL                       7
+#define CF_OEMTEXT                      7
+#define IDNO                            7
+#define BN_KILLFOCUS                    7
+#define LANG_GERMAN                     0x07
+#define SUBLANG_ARABIC_TUNISIA          0x07
+#define SUBLANG_ENGLISH_SOUTH_AFRICA    0x07
+#define SUBLANG_SAMI_SOUTHERN_SWEDEN    0x07
+#define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x07
+#define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07
+#define SW_SHOWNA                       8
+#define VK_BACK                         0x08
+#define WM_KILLFOCUS                    0x0008
+#define WMSZ_BOTTOMRIGHT                8
+#define HTMINBUTTON                     8
+#define SMTO_NOTIMEOUTIFNOTHUNG         0x0008
+#define MK_CONTROL                      0x0008
+#define CS_DBLCLKS                      0x0008
+#define CF_DIB                          8
+#define IDCLOSE                         8
+#define BST_FOCUS                       0x0008
+#define HDS_HIDDEN                      0x0008
+#define TBSTYLE_DROPDOWN                0x0008
+#define TBS_BOTH                        0x0008
+#define UDS_ALIGNLEFT                   0x0008
+#define PBS_MARQUEE                     0x08
+#define LWS_USEVISUALSTYLE              0x0008
+#define LVS_SHOWSELALWAYS               0x0008
+#define TVS_EDITLABELS                  0x0008
+#define TVS_EX_NOINDENTSTATE            0x0008
+#define TCS_FLATBUTTONS                 0x0008
+#define ACS_TIMER                       0x0008
+#define MCS_NOTODAYCIRCLE               0x0008
+#define NFS_BUTTON                      0x0008
+#define BCSIF_SIZE                      0x0008
+#define BCSS_IMAGE                      0x0008
+#define LANG_GREEK                      0x08
+#define SUBLANG_ARABIC_OMAN             0x08
+#define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x08
+#define SUBLANG_ENGLISH_JAMAICA         0x08
+#define SUBLANG_SAMI_SKOLT_FINLAND      0x08
+#define SUBLANG_SPANISH_VENEZUELA       0x08
+#define SW_RESTORE                      9
+#define VK_TAB                          0x09
+#define HTMAXBUTTON                     9
+#define CF_PALETTE                      9
+#define IDHELP                          9
+#define DTS_TIMEFORMAT                  0x0009
+#define LANG_ENGLISH                    0x09
+#define SUBLANG_ARABIC_YEMEN            0x09
+#define SUBLANG_ENGLISH_CARIBBEAN       0x09
+#define SUBLANG_SAMI_INARI_FINLAND      0x09
+#define SUBLANG_SPANISH_COLOMBIA        0x09
+#define SW_SHOWDEFAULT                  10
+#define WM_ENABLE                       0x000A
+#define HTLEFT                          10
+#define CF_PENDATA                      10
+#define IDTRYAGAIN                      10
+#define HELP_CONTEXTMENU                0x000a
+#define LANG_SPANISH                    0x0a
+#define SUBLANG_ARABIC_SYRIA            0x0a
+#define SUBLANG_ENGLISH_BELIZE          0x0a
+#define SUBLANG_SPANISH_PERU            0x0a
+#define SW_FORCEMINIMIZE                11
+#define SW_MAX                          11
+#define WM_SETREDRAW                    0x000B
+#define HTRIGHT                         11
+#define CF_RIFF                         11
+#define IDCONTINUE                      11
+#define HELP_FINDER                     0x000b
+#define LANG_FINNISH                    0x0b
+#define SUBLANG_ARABIC_JORDAN           0x0b
+#define SUBLANG_ENGLISH_TRINIDAD        0x0b
+#define SUBLANG_SPANISH_ARGENTINA       0x0b
+#define VK_CLEAR                        0x0C
+#define WM_SETTEXT                      0x000C
+#define HTTOP                           12
+#define CF_WAVE                         12
+#define HELP_WM_HELP                    0x000c
+#define DTS_SHORTDATECENTURYFORMAT      0x000C
+#define LANG_FRENCH                     0x0c
+#define SUBLANG_ARABIC_LEBANON          0x0c
+#define SUBLANG_ENGLISH_ZIMBABWE        0x0c
+#define SUBLANG_SPANISH_ECUADOR         0x0c
+#define VK_RETURN                       0x0D
+#define WM_GETTEXT                      0x000D
+#define HTTOPLEFT                       13
+#define CF_UNICODETEXT                  13
+#define HELP_SETPOPUP_POS               0x000d
+#define LANG_HEBREW                     0x0d
+#define SUBLANG_ARABIC_KUWAIT           0x0d
+#define SUBLANG_ENGLISH_PHILIPPINES     0x0d
+#define SUBLANG_SPANISH_CHILE           0x0d
+#define WM_GETTEXTLENGTH                0x000E
+#define HTTOPRIGHT                      14
+#define CF_ENHMETAFILE                  14
+#define LANG_HUNGARIAN                  0x0e
+#define SUBLANG_ARABIC_UAE              0x0e
+#define SUBLANG_SPANISH_URUGUAY         0x0e
+#define WM_PAINT                        0x000F
+#define HTBOTTOM                        15
+#define CF_HDROP                        15
+#define LANG_ICELANDIC                  0x0f
+#define SUBLANG_ARABIC_BAHRAIN          0x0f
+#define SUBLANG_SPANISH_PARAGUAY        0x0f
+#define VK_SHIFT                        0x10
+#define WM_CLOSE                        0x0010
+#define HTBOTTOMLEFT                    16
+#define WVR_ALIGNTOP                    0x0010
+#define MK_MBUTTON                      0x0010
+#define TME_NONCLIENT                   0x00000010
+#define CF_LOCALE                       16
+#define HELP_TCARD_DATA                 0x0010
+#define TBSTYLE_AUTOSIZE                0x0010
+#define TTS_NOANIMATE                   0x10
+#define TBS_NOTICKS                     0x0010
+#define UDS_AUTOBUDDY                   0x0010
+#define PBS_SMOOTHREVERSE               0x10
+#define LWS_USECUSTOMTEXT               0x0010
+#define LVS_SORTASCENDING               0x0010
+#define TVS_DISABLEDRAGDROP             0x0010
+#define TVS_EX_RICHTOOLTIP              0x0010
+#define TCS_FORCEICONLEFT               0x0010
+#define MCS_NOTODAY                     0x0010
+#define DTS_APPCANPARSE                 0x0010
+#define NFS_ALL                         0x0010
+#define LANG_ITALIAN                    0x10
+#define SUBLANG_ARABIC_QATAR            0x10
+#define SUBLANG_ENGLISH_INDIA           0x10
+#define SUBLANG_SPANISH_BOLIVIA         0x10
+#define VK_CONTROL                      0x11
+#define WM_QUERYENDSESSION              0x0011
+#define HTBOTTOMRIGHT                   17
+#define CF_DIBV5                        17
+#define HELP_TCARD_OTHER_CALLER         0x0011
+#define LANG_JAPANESE                   0x11
+#define SUBLANG_ENGLISH_MALAYSIA        0x11
+#define SUBLANG_SPANISH_EL_SALVADOR     0x11
+#define VK_MENU                         0x12
+#define WM_QUIT                         0x0012
+#define HTBORDER                        18
+#define CF_MAX                          18
+#define LANG_KOREAN                     0x12
+#define SUBLANG_ENGLISH_SINGAPORE       0x12
+#define SUBLANG_SPANISH_HONDURAS        0x12
+#define VK_PAUSE                        0x13
+#define WM_QUERYOPEN                    0x0013
+#define HTOBJECT                        19
+#define LANG_DUTCH                      0x13
+#define SUBLANG_SPANISH_NICARAGUA       0x13
+#define VK_CAPITAL                      0x14
+#define WM_ERASEBKGND                   0x0014
+#define HTCLOSE                         20
+#define LANG_NORWEGIAN                  0x14
+#define SUBLANG_SPANISH_PUERTO_RICO     0x14
+#define VK_KANA                         0x15
+#define VK_HANGEUL                      0x15
+#define VK_HANGUL                       0x15
+#define WM_SYSCOLORCHANGE               0x0015
+#define HTHELP                          21
+#define LANG_POLISH                     0x15
+#define SUBLANG_SPANISH_US              0x15
+#define WM_ENDSESSION                   0x0016
+#define LANG_PORTUGUESE                 0x16
+#define VK_JUNJA                        0x17
+#define LANG_ROMANSH                    0x17
+#define VK_FINAL                        0x18
+#define WM_SHOWWINDOW                   0x0018
+#define LANG_ROMANIAN                   0x18
+#define VK_HANJA                        0x19
+#define VK_KANJI                        0x19
+#define LANG_RUSSIAN                    0x19
+#define WM_WININICHANGE                 0x001A
+#define LANG_BOSNIAN                    0x1a
+#define LANG_CROATIAN                   0x1a
+#define LANG_SERBIAN                    0x1a
+#define VK_ESCAPE                       0x1B
+#define WM_DEVMODECHANGE                0x001B
+#define LANG_SLOVAK                     0x1b
+#define VK_CONVERT                      0x1C
+#define WM_ACTIVATEAPP                  0x001C
+#define LANG_ALBANIAN                   0x1c
+#define VK_NONCONVERT                   0x1D
+#define WM_FONTCHANGE                   0x001D
+#define LANG_SWEDISH                    0x1d
+#define VK_ACCEPT                       0x1E
+#define WM_TIMECHANGE                   0x001E
+#define LANG_THAI                       0x1e
+#define VK_MODECHANGE                   0x1F
+#define WM_CANCELMODE                   0x001F
+#define LANG_TURKISH                    0x1f
+#define VK_SPACE                        0x20
+#define WM_SETCURSOR                    0x0020
+#define SMTO_ERRORONEXIT                0x0020
+#define WVR_ALIGNLEFT                   0x0020
+#define MK_XBUTTON1                     0x0020
+#define CS_OWNDC                        0x0020
+#define TBSTYLE_NOPREFIX                0x0020
+#define TTS_NOFADE                      0x20
+#define TBS_ENABLESELRANGE              0x0020
+#define UDS_ARROWKEYS                   0x0020
+#define LWS_RIGHT                       0x0020
+#define LVS_SORTDESCENDING              0x0020
+#define TVS_SHOWSELALWAYS               0x0020
+#define TVS_EX_AUTOHSCROLL              0x0020
+#define TCS_FORCELABELLEFT              0x0020
+#define DTS_RIGHTALIGN                  0x0020
+#define NFS_USEFONTASSOC                0x0020
+#define LANG_URDU                       0x20
+#define VK_PRIOR                        0x21
+#define WM_MOUSEACTIVATE                0x0021
+#define LANG_INDONESIAN                 0x21
+#define VK_NEXT                         0x22
+#define WM_CHILDACTIVATE                0x0022
+#define LANG_UKRAINIAN                  0x22
+#define VK_END                          0x23
+#define WM_QUEUESYNC                    0x0023
+#define LANG_BELARUSIAN                 0x23
+#define VK_HOME                         0x24
+#define WM_GETMINMAXINFO                0x0024
+#define LANG_SLOVENIAN                  0x24
+#define VK_LEFT                         0x25
+#define LANG_ESTONIAN                   0x25
+#define VK_UP                           0x26
+#define WM_PAINTICON                    0x0026
+#define LANG_LATVIAN                    0x26
+#define VK_RIGHT                        0x27
+#define WM_ICONERASEBKGND               0x0027
+#define LANG_LITHUANIAN                 0x27
+#define VK_DOWN                         0x28
+#define WM_NEXTDLGCTL                   0x0028
+#define LANG_TAJIK                      0x28
+#define VK_SELECT                       0x29
+#define LANG_FARSI                      0x29
+#define LANG_PERSIAN                    0x29
+#define VK_PRINT                        0x2A
+#define WM_SPOOLERSTATUS                0x002A
+#define LANG_VIETNAMESE                 0x2a
+#define VK_EXECUTE                      0x2B
+#define WM_DRAWITEM                     0x002B
+#define LANG_ARMENIAN                   0x2b
+#define VK_SNAPSHOT                     0x2C
+#define WM_MEASUREITEM                  0x002C
+#define LANG_AZERI                      0x2c
+#define VK_INSERT                       0x2D
+#define WM_DELETEITEM                   0x002D
+#define LANG_BASQUE                     0x2d
+#define VK_DELETE                       0x2E
+#define WM_VKEYTOITEM                   0x002E
+#define LANG_LOWER_SORBIAN              0x2e
+#define LANG_UPPER_SORBIAN              0x2e
+#define VK_HELP                         0x2F
+#define WM_CHARTOITEM                   0x002F
+#define LANG_MACEDONIAN                 0x2f
+#define WM_SETFONT                      0x0030
+#define WM_GETFONT                      0x0031
+#define WM_SETHOTKEY                    0x0032
+#define LANG_TSWANA                     0x32
+#define WM_GETHOTKEY                    0x0033
+#define LANG_XHOSA                      0x34
+#define LANG_ZULU                       0x35
+#define LANG_AFRIKAANS                  0x36
+#define WM_QUERYDRAGICON                0x0037
+#define LANG_GEORGIAN                   0x37
+#define LANG_FAEROESE                   0x38
+#define WM_COMPAREITEM                  0x0039
+#define LANG_HINDI                      0x39
+#define LANG_MALTESE                    0x3a
+#define LANG_SAMI                       0x3b
+#define LANG_IRISH                      0x3c
+#define WM_GETOBJECT                    0x003D
+#define LANG_MALAY                      0x3e
+#define LANG_KAZAK                      0x3f
+#define WVR_ALIGNBOTTOM                 0x0040
+#define MK_XBUTTON2                     0x0040
+#define CS_CLASSDC                      0x0040
+#define HDS_DRAGDROP                    0x0040
+#define BTNS_SHOWTEXT                   0x0040
+#define TTS_BALLOON                     0x40
+#define TBS_FIXEDLENGTH                 0x0040
+#define UDS_HORZ                        0x0040
+#define LVS_SHAREIMAGELISTS             0x0040
+#define TVS_RTLREADING                  0x0040
+#define TVS_EX_FADEINOUTEXPANDOS        0x0040
+#define TCS_HOTTRACK                    0x0040
+#define MCS_NOTRAILINGDATES             0x0040
+#define LANG_KYRGYZ                     0x40
+#define WM_COMPACTING                   0x0041
+#define LANG_SWAHILI                    0x41
+#define LANG_TURKMEN                    0x42
+#define LANG_UZBEK                      0x43
+#define WM_COMMNOTIFY                   0x0044
+#define LANG_TATAR                      0x44
+#define LANG_BENGALI                    0x45
+#define WM_WINDOWPOSCHANGING            0x0046
+#define LANG_PUNJABI                    0x46
+#define WM_WINDOWPOSCHANGED             0x0047
+#define LANG_GUJARATI                   0x47
+#define WM_POWER                        0x0048
+#define LANG_ORIYA                      0x48
+#define LANG_TAMIL                      0x49
+#define WM_COPYDATA                     0x004A
+#define LANG_TELUGU                     0x4a
+#define WM_CANCELJOURNAL                0x004B
+#define LANG_KANNADA                    0x4b
+#define LANG_MALAYALAM                  0x4c
+#define LANG_ASSAMESE                   0x4d
+#define WM_NOTIFY                       0x004E
+#define LANG_MARATHI                    0x4e
+#define LANG_SANSKRIT                   0x4f
+#define WM_INPUTLANGCHANGEREQUEST       0x0050
+#define LANG_MONGOLIAN                  0x50
+#define WM_INPUTLANGCHANGE              0x0051
+#define LANG_TIBETAN                    0x51
+#define WM_TCARD                        0x0052
+#define LANG_WELSH                      0x52
+#define WM_HELP                         0x0053
+#define LANG_KHMER                      0x53
+#define WM_USERCHANGED                  0x0054
+#define LANG_LAO                        0x54
+#define WM_NOTIFYFORMAT                 0x0055
+#define LANG_GALICIAN                   0x56
+#define LANG_KONKANI                    0x57
+#define LANG_MANIPURI                   0x58
+#define LANG_SINDHI                     0x59
+#define LANG_SYRIAC                     0x5a
+#define VK_LWIN                         0x5B
+#define LANG_SINHALESE                  0x5b
+#define VK_RWIN                         0x5C
+#define VK_APPS                         0x5D
+#define LANG_INUKTITUT                  0x5d
+#define LANG_AMHARIC                    0x5e
+#define VK_SLEEP                        0x5F
+#define LANG_TAMAZIGHT                  0x5f
+#define VK_NUMPAD0                      0x60
+#define LANG_KASHMIRI                   0x60
+#define VK_NUMPAD1                      0x61
+#define LANG_NEPALI                     0x61
+#define VK_NUMPAD2                      0x62
+#define LANG_FRISIAN                    0x62
+#define VK_NUMPAD3                      0x63
+#define LANG_PASHTO                     0x63
+#define VK_NUMPAD4                      0x64
+#define LANG_FILIPINO                   0x64
+#define VS_USER_DEFINED                 100
+#define VK_NUMPAD5                      0x65
+#define LANG_DIVEHI                     0x65
+#define VK_NUMPAD6                      0x66
+#define VK_NUMPAD7                      0x67
+#define VK_NUMPAD8                      0x68
+#define LANG_HAUSA                      0x68
+#define VK_NUMPAD9                      0x69
+#define VK_MULTIPLY                     0x6A
+#define LANG_YORUBA                     0x6a
+#define VK_ADD                          0x6B
+#define LANG_QUECHUA                    0x6b
+#define VK_SEPARATOR                    0x6C
+#define LANG_SOTHO                      0x6c
+#define VK_SUBTRACT                     0x6D
+#define LANG_BASHKIR                    0x6d
+#define VK_DECIMAL                      0x6E
+#define LANG_LUXEMBOURGISH              0x6e
+#define VK_DIVIDE                       0x6F
+#define LANG_GREENLANDIC                0x6f
+#define VK_F1                           0x70
+#define LANG_IGBO                       0x70
+#define VK_F2                           0x71
+#define VK_F3                           0x72
+#define VK_F4                           0x73
+#define LANG_TIGRIGNA                   0x73
+#define VK_F5                           0x74
+#define VK_F6                           0x75
+#define VK_F7                           0x76
+#define VK_F8                           0x77
+#define VK_F9                           0x78
+#define WHEEL_DELTA                     120
+#define LANG_YI                         0x78
+#define VK_F10                          0x79
+#define VK_F11                          0x7A
+#define LANG_MAPUDUNGUN                 0x7a
+#define VK_F12                          0x7B
+#define WM_CONTEXTMENU                  0x007B
+#define VK_F13                          0x7C
+#define WM_STYLECHANGING                0x007C
+#define LANG_MOHAWK                     0x7c
+#define VK_F14                          0x7D
+#define WM_STYLECHANGED                 0x007D
+#define VK_F15                          0x7E
+#define WM_DISPLAYCHANGE                0x007E
+#define LANG_BRETON                     0x7e
+#define VK_F16                          0x7F
+#define WM_GETICON                      0x007F
+#define LANG_INVARIANT                  0x7f
+#define VK_F17                          0x80
+#define WM_SETICON                      0x0080
+#define WVR_ALIGNRIGHT                  0x0080
+#define CS_PARENTDC                     0x0080
+#define CF_OWNERDISPLAY                 0x0080
+#define HDS_FULLDRAG                    0x0080
+#define BTNS_WHOLEDROPDOWN              0x0080
+#define TTS_CLOSE                       0x80
+#define TBS_NOTHUMB                     0x0080
+#define UDS_NOTHOUSANDS                 0x0080
+#define LVS_NOLABELWRAP                 0x0080
+#define TVS_NOTOOLTIPS                  0x0080
+#define TVS_EX_PARTIALCHECKBOXES        0x0080
+#define TCS_VERTICAL                    0x0080
+#define MCS_SHORTDAYSOFWEEK             0x0080
+#define LANG_UIGHUR                     0x80
+#define VK_F18                          0x81
+#define WM_NCCREATE                     0x0081
+#define CF_DSPTEXT                      0x0081
+#define LANG_MAORI                      0x81
+#define VK_F19                          0x82
+#define WM_NCDESTROY                    0x0082
+#define CF_DSPBITMAP                    0x0082
+#define LANG_OCCITAN                    0x82
+#define VK_F20                          0x83
+#define WM_NCCALCSIZE                   0x0083
+#define CF_DSPMETAFILEPICT              0x0083
+#define LANG_CORSICAN                   0x83
+#define VK_F21                          0x84
+#define WM_NCHITTEST                    0x0084
+#define LANG_ALSATIAN                   0x84
+#define VK_F22                          0x85
+#define WM_NCPAINT                      0x0085
+#define LANG_YAKUT                      0x85
+#define VK_F23                          0x86
+#define WM_NCACTIVATE                   0x0086
+#define LANG_KICHE                      0x86
+#define VK_F24                          0x87
+#define WM_GETDLGCODE                   0x0087
+#define LANG_KINYARWANDA                0x87
+#define WM_SYNCPAINT                    0x0088
+#define LANG_WOLOF                      0x88
+#define LANG_DARI                       0x8c
+#define CF_DSPENHMETAFILE               0x008E
+#define VK_NUMLOCK                      0x90
+#define VK_SCROLL                       0x91
+#define VK_OEM_NEC_EQUAL                0x92
+#define VK_OEM_FJ_JISHO                 0x92
+#define VK_OEM_FJ_MASSHOU               0x93
+#define VK_OEM_FJ_TOUROKU               0x94
+#define VK_OEM_FJ_LOYA                  0x95
+#define VK_OEM_FJ_ROYA                  0x96
+#define VK_LSHIFT                       0xA0
+#define WM_NCMOUSEMOVE                  0x00A0
+#define VK_RSHIFT                       0xA1
+#define WM_NCLBUTTONDOWN                0x00A1
+#define VK_LCONTROL                     0xA2
+#define WM_NCLBUTTONUP                  0x00A2
+#define VK_RCONTROL                     0xA3
+#define WM_NCLBUTTONDBLCLK              0x00A3
+#define VK_LMENU                        0xA4
+#define WM_NCRBUTTONDOWN                0x00A4
+#define VK_RMENU                        0xA5
+#define WM_NCRBUTTONUP                  0x00A5
+#define VK_BROWSER_BACK                 0xA6
+#define WM_NCRBUTTONDBLCLK              0x00A6
+#define VK_BROWSER_FORWARD              0xA7
+#define WM_NCMBUTTONDOWN                0x00A7
+#define VK_BROWSER_REFRESH              0xA8
+#define WM_NCMBUTTONUP                  0x00A8
+#define VK_BROWSER_STOP                 0xA9
+#define WM_NCMBUTTONDBLCLK              0x00A9
+#define VK_BROWSER_SEARCH               0xAA
+#define VK_BROWSER_FAVORITES            0xAB
+#define WM_NCXBUTTONDOWN                0x00AB
+#define VK_BROWSER_HOME                 0xAC
+#define WM_NCXBUTTONUP                  0x00AC
+#define VK_VOLUME_MUTE                  0xAD
+#define WM_NCXBUTTONDBLCLK              0x00AD
+#define VK_VOLUME_DOWN                  0xAE
+#define VK_VOLUME_UP                    0xAF
+#define VK_MEDIA_NEXT_TRACK             0xB0
+#define EM_GETSEL                       0x00B0
+#define VK_MEDIA_PREV_TRACK             0xB1
+#define EM_SETSEL                       0x00B1
+#define VK_MEDIA_STOP                   0xB2
+#define EM_GETRECT                      0x00B2
+#define VK_MEDIA_PLAY_PAUSE             0xB3
+#define EM_SETRECT                      0x00B3
+#define VK_LAUNCH_MAIL                  0xB4
+#define EM_SETRECTNP                    0x00B4
+#define VK_LAUNCH_MEDIA_SELECT          0xB5
+#define EM_SCROLL                       0x00B5
+#define VK_LAUNCH_APP1                  0xB6
+#define EM_LINESCROLL                   0x00B6
+#define VK_LAUNCH_APP2                  0xB7
+#define EM_SCROLLCARET                  0x00B7
+#define EM_GETMODIFY                    0x00B8
+#define EM_SETMODIFY                    0x00B9
+#define VK_OEM_1                        0xBA
+#define EM_GETLINECOUNT                 0x00BA
+#define VK_OEM_PLUS                     0xBB
+#define EM_LINEINDEX                    0x00BB
+#define VK_OEM_COMMA                    0xBC
+#define EM_SETHANDLE                    0x00BC
+#define VK_OEM_MINUS                    0xBD
+#define EM_GETHANDLE                    0x00BD
+#define VK_OEM_PERIOD                   0xBE
+#define EM_GETTHUMB                     0x00BE
+#define VK_OEM_2                        0xBF
+#define VK_OEM_3                        0xC0
+#define EM_LINELENGTH                   0x00C1
+#define EM_REPLACESEL                   0x00C2
+#define EM_GETLINE                      0x00C4
+#define EM_LIMITTEXT                    0x00C5
+#define EM_CANUNDO                      0x00C6
+#define EM_UNDO                         0x00C7
+#define EM_FMTLINES                     0x00C8
+#define DLG_MAIN                        200
+#define EM_LINEFROMCHAR                 0x00C9
+#define EM_SETTABSTOPS                  0x00CB
+#define EM_SETPASSWORDCHAR              0x00CC
+#define EM_EMPTYUNDOBUFFER              0x00CD
+#define EM_GETFIRSTVISIBLELINE          0x00CE
+#define EM_SETREADONLY                  0x00CF
+#define EM_SETWORDBREAKPROC             0x00D0
+#define EM_GETWORDBREAKPROC             0x00D1
+#define EM_GETPASSWORDCHAR              0x00D2
+#define EM_SETMARGINS                   0x00D3
+#define EM_GETMARGINS                   0x00D4
+#define EM_GETLIMITTEXT                 0x00D5
+#define EM_POSFROMCHAR                  0x00D6
+#define EM_CHARFROMPOS                  0x00D7
+#define EM_SETIMESTATUS                 0x00D8
+#define EM_GETIMESTATUS                 0x00D9
+#define VK_OEM_4                        0xDB
+#define VK_OEM_5                        0xDC
+#define VK_OEM_6                        0xDD
+#define VK_OEM_7                        0xDE
+#define VK_OEM_8                        0xDF
+#define VK_OEM_AX                       0xE1
+#define VK_OEM_102                      0xE2
+#define VK_ICO_HELP                     0xE3
+#define VK_ICO_00                       0xE4
+#define VK_PROCESSKEY                   0xE5
+#define VK_ICO_CLEAR                    0xE6
+#define VK_PACKET                       0xE7
+#define VK_OEM_RESET                    0xE9
+#define VK_OEM_JUMP                     0xEA
+#define VK_OEM_PA1                      0xEB
+#define VK_OEM_PA2                      0xEC
+#define VK_OEM_PA3                      0xED
+#define VK_OEM_WSCTRL                   0xEE
+#define VK_OEM_CUSEL                    0xEF
+#define VK_OEM_ATTN                     0xF0
+#define BM_GETCHECK                     0x00F0
+#define VK_OEM_FINISH                   0xF1
+#define BM_SETCHECK                     0x00F1
+#define VK_OEM_COPY                     0xF2
+#define BM_GETSTATE                     0x00F2
+#define VK_OEM_AUTO                     0xF3
+#define BM_SETSTATE                     0x00F3
+#define VK_OEM_ENLW                     0xF4
+#define BM_SETSTYLE                     0x00F4
+#define VK_OEM_BACKTAB                  0xF5
+#define BM_CLICK                        0x00F5
+#define VK_ATTN                         0xF6
+#define BM_GETIMAGE                     0x00F6
+#define VK_CRSEL                        0xF7
+#define BM_SETIMAGE                     0x00F7
+#define VK_EXSEL                        0xF8
+#define BM_SETDONTCLICK                 0x00F8
+#define VK_EREOF                        0xF9
+#define VK_PLAY                         0xFA
+#define VK_ZOOM                         0xFB
+#define VK_NONAME                       0xFC
+#define VK_PA1                          0xFD
+#define VK_OEM_CLEAR                    0xFE
+#define WM_INPUT_DEVICE_CHANGE          0x00FE
+#define SUBVERSION_MASK                 0x000000FF
+#define WM_INPUT                        0x00FF
+#define WM_KEYFIRST                     0x0100
+#define WM_KEYDOWN                      0x0100
+#define WVR_HREDRAW                     0x0100
+#define HDS_FILTERBAR                   0x0100
+#define TBSTYLE_TOOLTIPS                0x0100
+#define RBS_TOOLTIPS                    0x00000100
+#define TTS_USEVISUALSTYLE              0x100
+#define SBARS_SIZEGRIP                  0x0100
+#define TBS_TOOLTIPS                    0x0100
+#define UDS_HOTTRACK                    0x0100
+#define LVS_AUTOARRANGE                 0x0100
+#define TVS_CHECKBOXES                  0x0100
+#define TVS_EX_EXCLUSIONCHECKBOXES      0x0100
+#define TCS_BUTTONS                     0x0100
+#define MCS_NOSELCHANGEONNAV            0x0100
+#define WM_KEYUP                        0x0101
+#define WM_CHAR                         0x0102
+#define WM_DEADCHAR                     0x0103
+#define WM_SYSKEYDOWN                   0x0104
+#define WM_SYSKEYUP                     0x0105
+#define WM_SYSCHAR                      0x0106
+#define WM_SYSDEADCHAR                  0x0107
+#define WM_UNICHAR                      0x0109
+#define WM_IME_STARTCOMPOSITION         0x010D
+#define WM_IME_ENDCOMPOSITION           0x010E
+#define WM_IME_COMPOSITION              0x010F
+#define WM_IME_KEYLAST                  0x010F
+#define WM_INITDIALOG                   0x0110
+#define WM_COMMAND                      0x0111
+#define WM_SYSCOMMAND                   0x0112
+#define WM_TIMER                        0x0113
+#define WM_HSCROLL                      0x0114
+#define WM_VSCROLL                      0x0115
+#define WM_INITMENU                     0x0116
+#define WM_INITMENUPOPUP                0x0117
+#define WM_MENUSELECT                   0x011F
+#define WM_MENUCHAR                     0x0120
+#define WM_ENTERIDLE                    0x0121
+#define WM_MENURBUTTONUP                0x0122
+#define WM_MENUDRAG                     0x0123
+#define WM_MENUGETOBJECT                0x0124
+#define WM_UNINITMENUPOPUP              0x0125
+#define WM_MENUCOMMAND                  0x0126
+#define WM_CHANGEUISTATE                0x0127
+#define WM_UPDATEUISTATE                0x0128
+#define WM_QUERYUISTATE                 0x0129
+#define DLG_ICON                        300
+#define WM_CTLCOLORMSGBOX               0x0132
+#define WM_CTLCOLOREDIT                 0x0133
+#define WM_CTLCOLORLISTBOX              0x0134
+#define WM_CTLCOLORBTN                  0x0135
+#define WM_CTLCOLORDLG                  0x0136
+#define WM_CTLCOLORSCROLLBAR            0x0137
+#define WM_CTLCOLORSTATIC               0x0138
+#define MN_GETHMENU                     0x01E1
+#define _WIN32_IE_IE20                  0x0200
+#define WM_MOUSEFIRST                   0x0200
+#define WM_MOUSEMOVE                    0x0200
+#define WVR_VREDRAW                     0x0200
+#define CS_NOCLOSE                      0x0200
+#define CF_PRIVATEFIRST                 0x0200
+#define HDS_FLAT                        0x0200
+#define TBSTYLE_WRAPABLE                0x0200
+#define RBS_VARHEIGHT                   0x00000200
+#define TBS_REVERSED                    0x0200
+#define LVS_EDITLABELS                  0x0200
+#define TVS_TRACKSELECT                 0x0200
+#define TVS_EX_DIMMEDCHECKBOXES         0x0200
+#define TCS_MULTILINE                   0x0200
+#define WM_LBUTTONDOWN                  0x0201
+#define WM_LBUTTONUP                    0x0202
+#define WM_LBUTTONDBLCLK                0x0203
+#define WM_RBUTTONDOWN                  0x0204
+#define WM_RBUTTONUP                    0x0205
+#define WM_RBUTTONDBLCLK                0x0206
+#define WM_MBUTTONDOWN                  0x0207
+#define WM_MBUTTONUP                    0x0208
+#define WM_MBUTTONDBLCLK                0x0209
+#define WM_MOUSEWHEEL                   0x020A
+#define WM_XBUTTONDOWN                  0x020B
+#define WM_XBUTTONUP                    0x020C
+#define WM_XBUTTONDBLCLK                0x020D
+#define WM_MOUSEHWHEEL                  0x020E
+#define WM_PARENTNOTIFY                 0x0210
+#define WM_ENTERMENULOOP                0x0211
+#define WM_EXITMENULOOP                 0x0212
+#define WM_NEXTMENU                     0x0213
+#define WM_SIZING                       0x0214
+#define WM_CAPTURECHANGED               0x0215
+#define WM_MOVING                       0x0216
+#define WM_POWERBROADCAST               0x0218
+#define WM_DEVICECHANGE                 0x0219
+#define WM_MDICREATE                    0x0220
+#define WM_MDIDESTROY                   0x0221
+#define WM_MDIACTIVATE                  0x0222
+#define WM_MDIRESTORE                   0x0223
+#define WM_MDINEXT                      0x0224
+#define WM_MDIMAXIMIZE                  0x0225
+#define WM_MDITILE                      0x0226
+#define WM_MDICASCADE                   0x0227
+#define WM_MDIICONARRANGE               0x0228
+#define WM_MDIGETACTIVE                 0x0229
+#define WM_MDISETMENU                   0x0230
+#define WM_ENTERSIZEMOVE                0x0231
+#define WM_EXITSIZEMOVE                 0x0232
+#define WM_DROPFILES                    0x0233
+#define WM_MDIREFRESHMENU               0x0234
+#define WM_IME_SETCONTEXT               0x0281
+#define WM_IME_NOTIFY                   0x0282
+#define WM_IME_CONTROL                  0x0283
+#define WM_IME_COMPOSITIONFULL          0x0284
+#define WM_IME_SELECT                   0x0285
+#define WM_IME_CHAR                     0x0286
+#define WM_IME_REQUEST                  0x0288
+#define WM_IME_KEYDOWN                  0x0290
+#define WM_IME_KEYUP                    0x0291
+#define WM_NCMOUSEHOVER                 0x02A0
+#define WM_MOUSEHOVER                   0x02A1
+#define WM_NCMOUSELEAVE                 0x02A2
+#define WM_MOUSELEAVE                   0x02A3
+#define WM_WTSSESSION_CHANGE            0x02B1
+#define WM_TABLET_FIRST                 0x02c0
+#define WM_TABLET_LAST                  0x02df
+#define CF_PRIVATELAST                  0x02FF
+#define _WIN32_IE_IE30                  0x0300
+#define WM_CUT                          0x0300
+#define CF_GDIOBJFIRST                  0x0300
+#define WM_COPY                         0x0301
+#define _WIN32_IE_IE302                 0x0302
+#define WM_PASTE                        0x0302
+#define WM_CLEAR                        0x0303
+#define WM_UNDO                         0x0304
+#define WM_RENDERFORMAT                 0x0305
+#define WM_RENDERALLFORMATS             0x0306
+#define WM_DESTROYCLIPBOARD             0x0307
+#define WM_DRAWCLIPBOARD                0x0308
+#define WM_PAINTCLIPBOARD               0x0309
+#define WM_VSCROLLCLIPBOARD             0x030A
+#define WM_SIZECLIPBOARD                0x030B
+#define WM_ASKCBFORMATNAME              0x030C
+#define WM_CHANGECBCHAIN                0x030D
+#define WM_HSCROLLCLIPBOARD             0x030E
+#define WM_QUERYNEWPALETTE              0x030F
+#define WM_PALETTEISCHANGING            0x0310
+#define WM_PALETTECHANGED               0x0311
+#define WM_HOTKEY                       0x0312
+#define WM_PRINT                        0x0317
+#define WM_PRINTCLIENT                  0x0318
+#define WM_APPCOMMAND                   0x0319
+#define WM_THEMECHANGED                 0x031A
+#define WM_CLIPBOARDUPDATE              0x031D
+#define WM_DWMCOMPOSITIONCHANGED        0x031E
+#define WM_DWMNCRENDERINGCHANGED        0x031F
+#define WM_DWMCOLORIZATIONCOLORCHANGED  0x0320
+#define WM_DWMWINDOWMAXIMIZEDCHANGE     0x0321
+#define WM_GETTITLEBARINFOEX            0x033F
+#define WM_HANDHELDFIRST                0x0358
+#define WM_HANDHELDLAST                 0x035F
+#define WM_AFXFIRST                     0x0360
+#define WM_AFXLAST                      0x037F
+#define WM_PENWINFIRST                  0x0380
+#define WM_PENWINLAST                   0x038F
+#define WM_DDE_FIRST                    0x03E0
+#define IDC_STATUS                      1000
+#define IDC_LIST1                       1000
+#define IDC_LEFT                        1001
+#define IDC_RIGHT                       1002
+#define IDC_TOP                         1003
+#define IDC_MIDDLE                      1004
+#define IDC_BOTTOM                      1005
+#define IDC_EDIT                        1010
+#define IDC_CLEAR                       1011
+#define CF_GDIOBJLAST                   0x03FF
+#define _WIN32_WINNT_NT4                0x0400
+#define _WIN32_IE_IE40                  0x0400
+#define WM_USER                         0x0400
+#define WVR_VALIDRECTS                  0x0400
+#define HDS_CHECKBOXES                  0x0400
+#define TBSTYLE_ALTDRAG                 0x0400
+#define RBS_BANDBORDERS                 0x00000400
+#define TBS_DOWNISLEFT                  0x0400
+#define LVS_OWNERDRAWFIXED              0x0400
+#define TVS_SINGLEEXPAND                0x0400
+#define TVS_EX_DRAWIMAGEASYNC           0x0400
+#define TCS_FIXEDWIDTH                  0x0400
+#define ctlFirst                        0x0400
+#define psh1                            0x0400
+#define _WIN32_IE_IE401                 0x0401
+#define psh2                            0x0401
+#define psh3                            0x0402
+#define psh4                            0x0403
+#define psh5                            0x0404
+#define psh6                            0x0405
+#define psh7                            0x0406
+#define psh8                            0x0407
+#define psh9                            0x0408
+#define psh10                           0x0409
+#define psh11                           0x040a
+#define psh12                           0x040b
+#define psh13                           0x040c
+#define psh14                           0x040d
+#define psh15                           0x040e
+#define psh16                           0x040f
+#define _WIN32_WINDOWS                  0x0410
+#define chx1                            0x0410
+#define chx2                            0x0411
+#define chx3                            0x0412
+#define chx4                            0x0413
+#define chx5                            0x0414
+#define chx6                            0x0415
+#define chx7                            0x0416
+#define chx8                            0x0417
+#define chx9                            0x0418
+#define chx10                           0x0419
+#define chx11                           0x041a
+#define chx12                           0x041b
+#define chx13                           0x041c
+#define chx14                           0x041d
+#define chx15                           0x041e
+#define chx16                           0x041f
+#define rad1                            0x0420
+#define rad2                            0x0421
+#define rad3                            0x0422
+#define rad4                            0x0423
+#define rad5                            0x0424
+#define rad6                            0x0425
+#define rad7                            0x0426
+#define rad8                            0x0427
+#define rad9                            0x0428
+#define rad10                           0x0429
+#define rad11                           0x042a
+#define rad12                           0x042b
+#define rad13                           0x042c
+#define rad14                           0x042d
+#define rad15                           0x042e
+#define rad16                           0x042f
+#define grp1                            0x0430
+#define grp2                            0x0431
+#define grp3                            0x0432
+#define grp4                            0x0433
+#define frm1                            0x0434
+#define frm2                            0x0435
+#define frm3                            0x0436
+#define frm4                            0x0437
+#define rct1                            0x0438
+#define rct2                            0x0439
+#define rct3                            0x043a
+#define rct4                            0x043b
+#define ico1                            0x043c
+#define ico2                            0x043d
+#define ico3                            0x043e
+#define ico4                            0x043f
+#define stc1                            0x0440
+#define stc2                            0x0441
+#define stc3                            0x0442
+#define stc4                            0x0443
+#define stc5                            0x0444
+#define stc6                            0x0445
+#define stc7                            0x0446
+#define stc8                            0x0447
+#define stc9                            0x0448
+#define stc10                           0x0449
+#define stc11                           0x044a
+#define stc12                           0x044b
+#define stc13                           0x044c
+#define stc14                           0x044d
+#define stc15                           0x044e
+#define stc16                           0x044f
+#define stc17                           0x0450
+#define stc18                           0x0451
+#define stc19                           0x0452
+#define stc20                           0x0453
+#define stc21                           0x0454
+#define stc22                           0x0455
+#define stc23                           0x0456
+#define stc24                           0x0457
+#define stc25                           0x0458
+#define stc26                           0x0459
+#define stc27                           0x045a
+#define stc28                           0x045b
+#define stc29                           0x045c
+#define stc30                           0x045d
+#define stc31                           0x045e
+#define stc32                           0x045f
+#define lst1                            0x0460
+#define lst2                            0x0461
+#define lst3                            0x0462
+#define lst4                            0x0463
+#define lst5                            0x0464
+#define lst6                            0x0465
+#define lst7                            0x0466
+#define lst8                            0x0467
+#define lst9                            0x0468
+#define lst10                           0x0469
+#define lst11                           0x046a
+#define lst12                           0x046b
+#define lst13                           0x046c
+#define lst14                           0x046d
+#define lst15                           0x046e
+#define lst16                           0x046f
+#define cmb1                            0x0470
+#define cmb2                            0x0471
+#define cmb3                            0x0472
+#define cmb4                            0x0473
+#define cmb5                            0x0474
+#define cmb6                            0x0475
+#define cmb7                            0x0476
+#define cmb8                            0x0477
+#define cmb9                            0x0478
+#define cmb10                           0x0479
+#define cmb11                           0x047a
+#define cmb12                           0x047b
+#define cmb13                           0x047c
+#define cmb14                           0x047d
+#define cmb15                           0x047e
+#define cmb16                           0x047f
+#define edt1                            0x0480
+#define edt2                            0x0481
+#define edt3                            0x0482
+#define edt4                            0x0483
+#define edt5                            0x0484
+#define edt6                            0x0485
+#define edt7                            0x0486
+#define edt8                            0x0487
+#define edt9                            0x0488
+#define edt10                           0x0489
+#define edt11                           0x048a
+#define edt12                           0x048b
+#define edt13                           0x048c
+#define edt14                           0x048d
+#define edt15                           0x048e
+#define edt16                           0x048f
+#define scr1                            0x0490
+#define scr2                            0x0491
+#define scr3                            0x0492
+#define scr4                            0x0493
+#define scr5                            0x0494
+#define scr6                            0x0495
+#define scr7                            0x0496
+#define scr8                            0x0497
+#define ctl1                            0x04A0
+#define ctlLast                         0x04ff
+#define _WIN32_WINNT_WIN2K              0x0500
+#define _WIN32_IE_IE50                  0x0500
+#define _WIN32_WINNT_WINXP              0x0501
+#define _WIN32_IE_IE501                 0x0501
+#define _WIN32_WINNT_WS03               0x0502
+#define _WIN32_IE_IE55                  0x0550
+#define _WIN32_WINNT_LONGHORN           0x0600
+#define _WIN32_IE_IE60                  0x0600
+#define FILEOPENORD                     1536
+#define _WIN32_IE_IE60SP1               0x0601
+#define MULTIFILEOPENORD                1537
+#define _WIN32_IE_WS03                  0x0602
+#define PRINTDLGORD                     1538
+#define _WIN32_IE_IE60SP2               0x0603
+#define PRNSETUPDLGORD                  1539
+#define FINDDLGORD                      1540
+#define REPLACEDLGORD                   1541
+#define FONTDLGORD                      1542
+#define FORMATDLGORD31                  1543
+#define FORMATDLGORD30                  1544
+#define RUNDLGORD                       1545
+#define PAGESETUPDLGORD                 1546
+#define NEWFILEOPENORD                  1547
+#define PRINTDLGEXORD                   1549
+#define PAGESETUPDLGORDMOTIF            1550
+#define COLORMGMTDLGORD                 1551
+#define NEWFILEOPENV2ORD                1552
+#define NEWFILEOPENV3ORD                1553
+#define _WIN32_IE_IE70                  0x0700
+#define CS_SAVEBITS                     0x0800
+#define HDS_NOSIZING                    0x0800
+#define TBSTYLE_FLAT                    0x0800
+#define RBS_FIXEDORDER                  0x00000800
+#define SBARS_TOOLTIPS                  0x0800
+#define SBT_TOOLTIPS                    0x0800
+#define TBS_NOTIFYBEFOREMOVE            0x0800
+#define LVS_ALIGNLEFT                   0x0800
+#define TVS_INFOTIP                     0x0800
+#define TCS_RAGGEDRIGHT                 0x0800
+#define LVS_ALIGNMASK                   0x0c00
+#define CS_BYTEALIGNCLIENT              0x1000
+#define HDS_OVERFLOW                    0x1000
+#define TBSTYLE_LIST                    0x1000
+#define RBS_REGISTERDROP                0x00001000
+#define TBS_TRANSPARENTBKGND            0x1000
+#define LVS_OWNERDATA                   0x1000
+#define TVS_FULLROWSELECT               0x1000
+#define TCS_FOCUSONBUTTONDOWN           0x1000
+#define CS_BYTEALIGNWINDOW              0x2000
+#define TBSTYLE_CUSTOMERASE             0x2000
+#define RBS_AUTOSIZE                    0x00002000
+#define LVS_NOSCROLL                    0x2000
+#define TVS_NOSCROLL                    0x2000
+#define TCS_OWNERDRAWFIXED              0x2000
+#define CS_GLOBALCLASS                  0x4000
+#define TBSTYLE_REGISTERDROP            0x4000
+#define RBS_VERTICALGRIPPER             0x00004000
+#define LVS_NOCOLUMNHEADER              0x4000
+#define TVS_NONEVENHEIGHT               0x4000
+#define TCS_TOOLTIPS                    0x4000
+#define IDH_NO_HELP                     28440
+#define IDH_MISSING_CONTEXT             28441
+#define IDH_GENERIC_HELP_BUTTON         28442
+#define IDH_OK                          28443
+#define IDH_CANCEL                      28444
+#define IDH_HELP                        28445
+#define LANG_BOSNIAN_NEUTRAL            0x781a
+#define LANG_CHINESE_TRADITIONAL        0x7c04
+#define LANG_SERBIAN_NEUTRAL            0x7c1a
+#define IDTIMEOUT                       32000
+#define OCR_NORMAL                      32512
+#define OIC_SAMPLE                      32512
+#define OCR_IBEAM                       32513
+#define OIC_HAND                        32513
+#define OCR_WAIT                        32514
+#define OIC_QUES                        32514
+#define OCR_CROSS                       32515
+#define OIC_BANG                        32515
+#define OCR_UP                          32516
+#define OIC_NOTE                        32516
+#define OIC_WINLOGO                     32517
+#define OIC_SHIELD                      32518
+#define OCR_SIZE                        32640
+#define OCR_ICON                        32641
+#define OCR_SIZENWSE                    32642
+#define OCR_SIZENESW                    32643
+#define OCR_SIZEWE                      32644
+#define OCR_SIZENS                      32645
+#define OCR_SIZEALL                     32646
+#define OCR_ICOCUR                      32647
+#define OCR_NO                          32648
+#define OCR_HAND                        32649
+#define OCR_APPSTARTING                 32650
+#define OBM_LFARROWI                    32734
+#define OBM_RGARROWI                    32735
+#define OBM_DNARROWI                    32736
+#define OBM_UPARROWI                    32737
+#define OBM_COMBO                       32738
+#define OBM_MNARROW                     32739
+#define OBM_LFARROWD                    32740
+#define OBM_RGARROWD                    32741
+#define OBM_DNARROWD                    32742
+#define OBM_UPARROWD                    32743
+#define OBM_RESTORED                    32744
+#define OBM_ZOOMD                       32745
+#define OBM_REDUCED                     32746
+#define OBM_RESTORE                     32747
+#define OBM_ZOOM                        32748
+#define OBM_REDUCE                      32749
+#define OBM_LFARROW                     32750
+#define OBM_RGARROW                     32751
+#define OBM_DNARROW                     32752
+#define OBM_UPARROW                     32753
+#define OBM_CLOSE                       32754
+#define OBM_OLD_RESTORE                 32755
+#define OBM_OLD_ZOOM                    32756
+#define OBM_OLD_REDUCE                  32757
+#define OBM_BTNCORNERS                  32758
+#define OBM_CHECKBOXES                  32759
+#define OBM_CHECK                       32760
+#define OBM_BTSIZE                      32761
+#define OBM_OLD_LFARROW                 32762
+#define OBM_OLD_RGARROW                 32763
+#define OBM_OLD_DNARROW                 32764
+#define OBM_OLD_UPARROW                 32765
+#define OBM_SIZE                        32766
+#define OBM_OLD_CLOSE                   32767
+#define WM_APP                          0x8000
+#define HELP_TCARD                      0x8000
+#define TBSTYLE_TRANSPARENT             0x8000
+#define RBS_DBLCLKTOGGLE                0x00008000
+#define LVS_NOSORTHEADER                0x8000
+#define TVS_NOHSCROLL                   0x8000
+#define TCS_FOCUSNEVER                  0x8000
+#define SC_SIZE                         0xF000
+#define SC_SEPARATOR                    0xF00F
+#define SC_MOVE                         0xF010
+#define SC_MINIMIZE                     0xF020
+#define SC_MAXIMIZE                     0xF030
+#define SC_NEXTWINDOW                   0xF040
+#define SC_PREVWINDOW                   0xF050
+#define SC_CLOSE                        0xF060
+#define SC_VSCROLL                      0xF070
+#define SC_HSCROLL                      0xF080
+#define SC_MOUSEMENU                    0xF090
+#define SC_KEYMENU                      0xF100
+#define SC_ARRANGE                      0xF110
+#define SC_RESTORE                      0xF120
+#define SC_TASKLIST                     0xF130
+#define SC_SCREENSAVE                   0xF140
+#define SC_HOTKEY                       0xF150
+#define SC_DEFAULT                      0xF160
+#define SC_MONITORPOWER                 0xF170
+#define SC_CONTEXTHELP                  0xF180
+#define LVS_TYPESTYLEMASK               0xfc00
+#define SPVERSION_MASK                  0x0000FF00
+#define UNICODE_NOCHAR                  0xFFFF
+#define IDC_STATIC                      -1
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        101
+#define _APS_NEXT_COMMAND_VALUE         40001
+#define _APS_NEXT_CONTROL_VALUE         1002
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
diff --git a/PC/associator.rc b/PC/associator.rc
new file mode 100644 (file)
index 0000000..374a3b8
--- /dev/null
@@ -0,0 +1,97 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "associator.h"
+#include "winuser.h"
+/////////////////////////////////////////////////////////////////////////////
+// English (U.K.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+DLG_ICON                ICON                    "launcher.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+DLG_MAIN DIALOGEX 20, 40, 236, 183
+// Make the dialog visible after positioning at centre
+STYLE DS_SETFONT | DS_3DLOOK | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_NOPARENTNOTIFY
+CAPTION "Python File Associations Have Ceased To Be!"
+FONT 10, "Arial", 400, 0, 0x0
+BEGIN
+    LTEXT           "You've uninstalled the Python Launcher, so now there are no applications associated with Python files.",IDC_STATIC,7,7,225,18
+    LTEXT           "You may wish to associate Python files with one of the Python versions installed on your machine, listed below:",IDC_STATIC,7,27,225,18
+    CONTROL         "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,6,49,224,105
+    PUSHBUTTON      "&Associate with selected Python",IDOK,6,164,117,14,WS_DISABLED
+    PUSHBUTTON      "Do&n't associate Python files",IDCANCEL,128,164,102,14
+END
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE 
+BEGIN
+    "\0"
+END
+
+3 TEXTINCLUDE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO 
+BEGIN
+    DLG_MAIN, DIALOG
+    BEGIN
+        RIGHTMARGIN, 238
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+#endif    // English (U.K.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
diff --git a/PCbuild/associator.vcxproj b/PCbuild/associator.vcxproj
new file mode 100644 (file)
index 0000000..595b2ce
--- /dev/null
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{023B3CDA-59C8-45FD-95DC-F8973322ED34}</ProjectGuid>
+    <RootNamespace>associator</RootNamespace>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="pyproject.props" />
+    <Import Project="debug.props" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="pyproject.props" />
+    <Import Project="release.props" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup />
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalDependencies>comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClCompile Include="..\PC\associator.c" />
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="..\PC\associator.rc" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\PC\associator.h" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/PCbuild/associator.vcxproj.filters b/PCbuild/associator.vcxproj.filters
new file mode 100644 (file)
index 0000000..0846afa
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="..\PC\associator.c">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="..\PC\associator.rc">
+      <Filter>Resource Files</Filter>
+    </ResourceCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\PC\associator.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+</Project>
\ No newline at end of file
index 441c2d814381da33272d9bd6e51f25bd0ed4aa78..ed7c4448ad47c7c4303cf84bd635e3917d4cf7de 100644 (file)
@@ -72,6 +72,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pylauncher", "pylauncher.vc
 EndProject\r
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pywlauncher", "pywlauncher.vcxproj", "{1D4B18D3-7C12-4ECB-9179-8531FF876CE6}"\r
 EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "associator", "associator.vcxproj", "{023B3CDA-59C8-45FD-95DC-F8973322ED34}"\r
+EndProject\r
 Global\r
        GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
                Debug|Win32 = Debug|Win32\r
@@ -597,6 +599,18 @@ Global
                {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|Win32.Build.0 = Release|Win32\r
                {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|x64.ActiveCfg = Release|x64\r
                {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|x64.Build.0 = Release|x64\r
+               {023B3CDA-59C8-45FD-95DC-F8973322ED34}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {023B3CDA-59C8-45FD-95DC-F8973322ED34}.Debug|Win32.Build.0 = Debug|Win32\r
+               {023B3CDA-59C8-45FD-95DC-F8973322ED34}.Debug|x64.ActiveCfg = Debug|Win32\r
+               {023B3CDA-59C8-45FD-95DC-F8973322ED34}.PGInstrument|Win32.ActiveCfg = Release|Win32\r
+               {023B3CDA-59C8-45FD-95DC-F8973322ED34}.PGInstrument|Win32.Build.0 = Release|Win32\r
+               {023B3CDA-59C8-45FD-95DC-F8973322ED34}.PGInstrument|x64.ActiveCfg = Release|Win32\r
+               {023B3CDA-59C8-45FD-95DC-F8973322ED34}.PGUpdate|Win32.ActiveCfg = Release|Win32\r
+               {023B3CDA-59C8-45FD-95DC-F8973322ED34}.PGUpdate|Win32.Build.0 = Release|Win32\r
+               {023B3CDA-59C8-45FD-95DC-F8973322ED34}.PGUpdate|x64.ActiveCfg = Release|Win32\r
+               {023B3CDA-59C8-45FD-95DC-F8973322ED34}.Release|Win32.ActiveCfg = Release|Win32\r
+               {023B3CDA-59C8-45FD-95DC-F8973322ED34}.Release|Win32.Build.0 = Release|Win32\r
+               {023B3CDA-59C8-45FD-95DC-F8973322ED34}.Release|x64.ActiveCfg = Release|Win32\r
        EndGlobalSection\r
        GlobalSection(SolutionProperties) = preSolution\r
                HideSolutionNode = FALSE\r