winamp/Src/Winamp/setup/postsetup.cpp

68 lines
1.7 KiB
C++

#define APSTUDIO_READONLY_SYMBOLS
#include "main.h"
#include ".\postsetup.h"
#include "./setup_resource.h"
#include "./langutil.h"
#include "api.h"
static BOOL SleepMsg(DWORD dwTimeout)
{
DWORD dwStart = GetTickCount();
DWORD dwElapsed;
while ((dwElapsed = GetTickCount() - dwStart) < dwTimeout)
{
DWORD dwStatus = MsgWaitForMultipleObjectsEx(0, NULL, dwTimeout - dwElapsed, QS_ALLINPUT, MWMO_WAITALL | MWMO_INPUTAVAILABLE);
if (dwStatus == WAIT_OBJECT_0) while (application->app_messageLoopStep());
}
return TRUE; // timed out
}
BOOL StartWinamp(BOOL bWaitShow, HWND *phwndWA, LPCSTR pszParam)
{
HWND hwndWA;
DWORD pid;
wchar_t buf[MAX_PATH] = L"\"";
STARTUPINFOW si = {sizeof(si), };
PROCESS_INFORMATION pi;
if (phwndWA) *phwndWA = NULL;
GetModuleFileNameW(NULL, buf + 1, sizeof(buf)/sizeof(wchar_t) - 1);
StringCchCatW(buf, MAX_PATH, L"\" /NEW ");
if (*pszParam && lstrlenA(pszParam))
{
int count, len;
len = sizeof(buf)/sizeof(wchar_t) - lstrlenW(buf)- 1;
count = MultiByteToWideChar(CP_ACP, 0, pszParam, -1, NULL, 0);
if (count < len) MultiByteToWideChar(CP_ACP, 0, pszParam, -1, buf + lstrlenW(buf), len);
}
si.dwFlags = STARTF_FORCEONFEEDBACK | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNOACTIVATE;
if ( 0 ==CreateProcessW(NULL, buf, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
return FALSE;
}
hwndWA = NULL;
if (bWaitShow)
{
for (int a = 0; a < 20; a++)
{
if (!hwndWA)
{
while (NULL != (hwndWA = FindWindowExW(NULL, hwndWA, szAppName, NULL)))
{
GetWindowThreadProcessId(hwndWA, &pid);
if (pid == pi.dwProcessId) break;
}
}
SleepMsg(250);
if (hwndWA && IsWindowVisible(hwndWA))
break;
}
}
if (phwndWA) *phwndWA = hwndWA;
return TRUE;
}