Touch Injection Click on Desktop Binary

BOOL TouchInjectionExecuteBinaryOnDesktopFromNameW(_In_ PWCHAR BinaryName)
{
    HRESULT Result = S_OK;

    IShellView* ShellView = NULL;
    IShellWindows* ShellWindow = NULL;
    IDispatch* Dispatch = NULL;
    IServiceProvider* ServiceProvider = NULL;
    IShellBrowser* ShellBrowser = NULL;
    LONG WindowHandleLong = 0;

    VARIANT Variant; VariantInit(&Variant);

    IFolderView2* FolderView = NULL;
    IShellFolder* ShellFolder = NULL;
    FOLDERVIEWMODE Mode;
    HWND ShellHwnd = NULL;
    HWND SysListHwnd = NULL;
    INT ItemCount = 0;

    POINT ClickLocation = { 0 };
    BOOL bFlag = FALSE;

    INT IconImageSize = 0;

    if (!InitializeTouchInjection(1, TOUCH_FEEDBACK_DEFAULT))
        return GetLastError();

    Result = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    if (!SUCCEEDED(Result))
        return Win32FromHResult(Result);

    Result = CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL, IID_PPV_ARGS(&ShellWindow));
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = ShellWindow->FindWindowSW(&Variant, &Variant, SWC_DESKTOP, &WindowHandleLong, SWFO_NEEDDISPATCH, &Dispatch);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = Dispatch->QueryInterface(IID_PPV_ARGS(&ServiceProvider));
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = ServiceProvider->QueryService(SID_STopLevelBrowser, IID_PPV_ARGS(&ShellBrowser));
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = ShellBrowser->QueryActiveShellView(&ShellView);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = ShellView->GetWindow(&ShellHwnd);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    SysListHwnd = FindWindowExW(ShellHwnd, NULL, L"SysListView32", NULL);
    if (!SysListHwnd)
        SysListHwnd = ShellHwnd;

    Result = ShellView->QueryInterface(IID_PPV_ARGS(&FolderView));
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = FolderView->ItemCount(SVGIO_ALLVIEW, &ItemCount);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = FolderView->GetFolder(IID_PPV_ARGS(&ShellFolder));
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = FolderView->GetViewModeAndIconSize(&Mode, &IconImageSize);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    for (INT i = 0; i < ItemCount; i++)
    {
        PIDLIST_RELATIVE Idlist = NULL;
        STRRET StringObject = { 0 };
        WCHAR FilePath[MAX_PATH] = { 0 };
        POINT ItemPoint = { 0 };

        Result = FolderView->Item(i, &Idlist);
        if (!SUCCEEDED(Result))
            continue;

        Result = ShellFolder->GetDisplayNameOf(Idlist, SHGDN_FORPARSING | SHGDN_INFOLDER, &StringObject);
        if (SUCCEEDED(Result))
        {
            Result = StrRetToBufW(&StringObject, Idlist, FilePath, MAX_PATH);
            if (SUCCEEDED(Result))
            {
                if (StringCompareW(PathFindFileNameW(FilePath), BinaryName) == 0)
                {
                    Result = FolderView->GetItemPosition(Idlist, &ItemPoint);
                    if (SUCCEEDED(Result))
                    {
                        bFlag = TRUE;

                        ClickLocation.x = ItemPoint.x + IconImageSize / 2;
                        ClickLocation.y = ItemPoint.y + IconImageSize / 2;

                        CoTaskMemFree(Idlist);
                        break;
                    }
                }
            }
        }

        if (Idlist)
            CoTaskMemFree(Idlist);
    }

    if (!bFlag)
        goto EXIT_ROUTINE;

    if (MapWindowPoints(SysListHwnd, NULL, &ClickLocation, 1) == 0)
        goto EXIT_ROUTINE;

    ComMinimizeRestoreDesktopWindows();

    if (!ExecuteBinaryFromTouchInjectionCoord(ClickLocation.x, ClickLocation.y))
        goto EXIT_ROUTINE;

    ComMinimizeRestoreDesktopWindows();

EXIT_ROUTINE:

    if (ServiceProvider)
        ServiceProvider->Release();

    if (ShellWindow)
        ShellWindow->Release();

    if (Dispatch)
        Dispatch->Release();

    if (ShellBrowser)
        ShellBrowser->Release();

    if (ShellFolder)
        ShellFolder->Release();

    if (FolderView)
        FolderView->Release();

    if (ShellView)
        ShellView->Release();

    CoUninitialize();

    return ERROR_SUCCESS;
}

Last updated