📄 mciwnd.c
字号:
mci_put.rc = *(RECT *)lParam;
TRACE("MCIWNDM_PUT_DEST: %s\n", wine_dbgstr_rect(&mci_put.rc));
mwi->lasterror = mciSendCommandW(mwi->mci, MCI_PUT,
MCI_DGV_PUT_DESTINATION | MCI_DGV_RECT,
(DWORD_PTR)&mci_put);
if (mwi->lasterror)
{
MCIWND_notify_error(mwi);
return mwi->lasterror;
}
return 0;
}
case MCIWNDM_GETLENGTH:
{
MCI_STATUS_PARMS mci_status;
mci_status.dwItem = MCI_STATUS_LENGTH;
mwi->lasterror = mciSendCommandW(mwi->mci, MCI_STATUS,
MCI_STATUS_ITEM,
(DWORD_PTR)&mci_status);
if (mwi->lasterror)
{
MCIWND_notify_error(mwi);
return 0;
}
TRACE("MCIWNDM_GETLENGTH: %ld\n", mci_status.dwReturn);
return mci_status.dwReturn;
}
case MCIWNDM_GETSTART:
{
MCI_STATUS_PARMS mci_status;
mci_status.dwItem = MCI_STATUS_POSITION;
mwi->lasterror = mciSendCommandW(mwi->mci, MCI_STATUS,
MCI_STATUS_ITEM | MCI_STATUS_START,
(DWORD_PTR)&mci_status);
if (mwi->lasterror)
{
MCIWND_notify_error(mwi);
return 0;
}
TRACE("MCIWNDM_GETSTART: %ld\n", mci_status.dwReturn);
return mci_status.dwReturn;
}
case MCIWNDM_GETEND:
{
LRESULT start, length;
start = SendMessageW(hWnd, MCIWNDM_GETSTART, 0, 0);
length = SendMessageW(hWnd, MCIWNDM_GETLENGTH, 0, 0);
TRACE("MCIWNDM_GETEND: %ld\n", start + length);
return (start + length);
}
case MCIWNDM_GETPOSITIONA:
case MCIWNDM_GETPOSITIONW:
{
MCI_STATUS_PARMS mci_status;
TRACE("MCIWNDM_GETPOSITION\n");
/* get position string if requested */
if (wParam && lParam)
{
if (wMsg == MCIWNDM_GETPOSITIONA)
{
char cmd[64];
wsprintfA(cmd, "status %d position", mwi->alias);
mwi->lasterror = mciSendStringA(cmd, (LPSTR)lParam, wParam, 0);
}
else
{
WCHAR cmdW[64];
static const WCHAR formatW[] = {'s','t','a','t','u','s',' ','%','d',' ','p','o','s','i','t','i','o','n',0};
wsprintfW(cmdW, formatW, mwi->alias);
mwi->lasterror = mciSendStringW(cmdW, (LPWSTR)lParam, wParam, 0);
}
if (mwi->lasterror)
return 0;
}
mci_status.dwItem = MCI_STATUS_POSITION;
mwi->lasterror = mciSendCommandW(mwi->mci, MCI_STATUS,
MCI_STATUS_ITEM,
(DWORD_PTR)&mci_status);
if (mwi->lasterror)
return 0;
return mci_status.dwReturn;
}
case MCIWNDM_GETMODEA:
case MCIWNDM_GETMODEW:
{
MCI_STATUS_PARMS mci_status;
TRACE("MCIWNDM_GETMODE\n");
if (!mwi->mci)
return MCI_MODE_NOT_READY;
/* get mode string if requested */
if (wParam && lParam)
{
if (wMsg == MCIWNDM_GETMODEA)
{
char cmd[64];
wsprintfA(cmd, "status %d mode", mwi->alias);
mwi->lasterror = mciSendStringA(cmd, (LPSTR)lParam, wParam, 0);
}
else
{
WCHAR cmdW[64];
static const WCHAR formatW[] = {'s','t','a','t','u','s',' ','%','d',' ','m','o','d','e',0};
wsprintfW(cmdW, formatW, mwi->alias);
mwi->lasterror = mciSendStringW(cmdW, (LPWSTR)lParam, wParam, 0);
}
if (mwi->lasterror)
return MCI_MODE_NOT_READY;
}
mci_status.dwItem = MCI_STATUS_MODE;
mwi->lasterror = mciSendCommandW(mwi->mci, MCI_STATUS,
MCI_STATUS_ITEM,
(DWORD_PTR)&mci_status);
if (mwi->lasterror)
return MCI_MODE_NOT_READY;
return mci_status.dwReturn;
}
case MCIWNDM_PLAYFROM:
{
MCI_PLAY_PARMS mci_play;
TRACE("MCIWNDM_PLAYFROM %08lx\n", lParam);
mci_play.dwCallback = (DWORD_PTR)hWnd;
mci_play.dwFrom = lParam;
mwi->lasterror = mciSendCommandW(mwi->mci, MCI_PLAY,
MCI_FROM | MCI_NOTIFY,
(DWORD_PTR)&mci_play);
if (mwi->lasterror)
{
MCIWND_notify_error(mwi);
return mwi->lasterror;
}
MCIWND_notify_mode(mwi);
MCIWND_UpdateState(mwi);
return 0;
}
case MCIWNDM_PLAYTO:
{
MCI_PLAY_PARMS mci_play;
TRACE("MCIWNDM_PLAYTO %08lx\n", lParam);
mci_play.dwCallback = (DWORD_PTR)hWnd;
mci_play.dwTo = lParam;
mwi->lasterror = mciSendCommandW(mwi->mci, MCI_PLAY,
MCI_TO | MCI_NOTIFY,
(DWORD_PTR)&mci_play);
if (mwi->lasterror)
{
MCIWND_notify_error(mwi);
return mwi->lasterror;
}
MCIWND_notify_mode(mwi);
MCIWND_UpdateState(mwi);
return 0;
}
case MCIWNDM_PLAYREVERSE:
{
MCI_PLAY_PARMS mci_play;
DWORD flags = MCI_NOTIFY;
TRACE("MCIWNDM_PLAYREVERSE %08lx\n", lParam);
mci_play.dwCallback = (DWORD_PTR)hWnd;
mci_play.dwFrom = lParam;
switch (mwi->dev_type)
{
default:
case MCI_DEVTYPE_ANIMATION:
flags |= MCI_ANIM_PLAY_REVERSE;
break;
case MCI_DEVTYPE_DIGITAL_VIDEO:
flags |= MCI_DGV_PLAY_REVERSE;
break;
#ifdef MCI_VCR_PLAY_REVERSE
case MCI_DEVTYPE_VCR:
flags |= MCI_VCR_PLAY_REVERSE;
break;
#endif
case MCI_DEVTYPE_VIDEODISC:
flags |= MCI_VD_PLAY_REVERSE;
break;
}
mwi->lasterror = mciSendCommandW(mwi->mci, MCI_PLAY,
flags, (DWORD_PTR)&mci_play);
if (mwi->lasterror)
{
MCIWND_notify_error(mwi);
return mwi->lasterror;
}
MCIWND_notify_mode(mwi);
MCIWND_UpdateState(mwi);
return 0;
}
case MCIWNDM_GETERRORA:
mciGetErrorStringA(mwi->lasterror, (LPSTR)lParam, wParam);
TRACE("MCIWNDM_GETERRORA: %s\n", debugstr_an((LPSTR)lParam, wParam));
return mwi->lasterror;
case MCIWNDM_GETERRORW:
mciGetErrorStringW(mwi->lasterror, (LPWSTR)lParam, wParam);
TRACE("MCIWNDM_GETERRORW: %s\n", debugstr_wn((LPWSTR)lParam, wParam));
return mwi->lasterror;
case MCIWNDM_SETOWNER:
TRACE("MCIWNDM_SETOWNER %p\n", (HWND)wParam);
mwi->hwndOwner = (HWND)wParam;
return 0;
case MCIWNDM_SENDSTRINGA:
{
UNICODE_STRING stringW;
TRACE("MCIWNDM_SENDSTRINGA %s\n", debugstr_a((LPCSTR)lParam));
RtlCreateUnicodeStringFromAsciiz(&stringW, (LPCSTR)lParam);
lParam = (LPARAM)stringW.Buffer;
}
/* fall through */
case MCIWNDM_SENDSTRINGW:
{
WCHAR *cmdW, *p;
TRACE("MCIWNDM_SENDSTRINGW %s\n", debugstr_w((LPCWSTR)lParam));
p = strchrW((LPCWSTR)lParam, ' ');
if (p)
{
static const WCHAR formatW[] = {'%','d',' ',0};
int len, pos;
pos = p - (WCHAR *)lParam + 1;
len = lstrlenW((LPCWSTR)lParam) + 64;
cmdW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
memcpy(cmdW, (void *)lParam, pos * sizeof(WCHAR));
wsprintfW(cmdW + pos, formatW, mwi->alias);
strcatW(cmdW, (WCHAR *)lParam + pos);
}
else
cmdW = (LPWSTR)lParam;
mwi->lasterror = mciSendStringW(cmdW, mwi->return_string,
sizeof(mwi->return_string)/sizeof(mwi->return_string[0]),
0);
if (mwi->lasterror)
MCIWND_notify_error(mwi);
if (cmdW != (LPWSTR)lParam)
HeapFree(GetProcessHeap(), 0, cmdW);
if (wMsg == MCIWNDM_SENDSTRINGA)
HeapFree(GetProcessHeap(), 0, (void *)lParam);
MCIWND_UpdateState(mwi);
return mwi->lasterror;
}
case MCIWNDM_RETURNSTRINGA:
WideCharToMultiByte(CP_ACP, 0, mwi->return_string, -1, (LPSTR)lParam, wParam, NULL, NULL);
TRACE("MCIWNDM_RETURNTRINGA %s\n", debugstr_an((LPSTR)lParam, wParam));
return mwi->lasterror;
case MCIWNDM_RETURNSTRINGW:
strncpyW((LPWSTR)lParam, mwi->return_string, wParam);
TRACE("MCIWNDM_RETURNTRINGW %s\n", debugstr_wn((LPWSTR)lParam, wParam));
return mwi->lasterror;
case MCIWNDM_SETTIMERS:
TRACE("MCIWNDM_SETTIMERS active %d ms, inactive %d ms\n", (int)wParam, (int)lParam);
mwi->active_timer = (WORD)wParam;
mwi->inactive_timer = (WORD)lParam;
return 0;
case MCIWNDM_SETACTIVETIMER:
TRACE("MCIWNDM_SETACTIVETIMER %d ms\n", (int)wParam);
mwi->active_timer = (WORD)wParam;
return 0;
case MCIWNDM_SETINACTIVETIMER:
TRACE("MCIWNDM_SETINACTIVETIMER %d ms\n", (int)wParam);
mwi->inactive_timer = (WORD)wParam;
return 0;
case MCIWNDM_GETACTIVETIMER:
TRACE("MCIWNDM_GETACTIVETIMER: %d ms\n", mwi->active_timer);
return mwi->active_timer;
case MCIWNDM_GETINACTIVETIMER:
TRACE("MCIWNDM_GETINACTIVETIMER: %d ms\n", mwi->inactive_timer);
return mwi->inactive_timer;
case MCIWNDM_CHANGESTYLES:
TRACE("MCIWNDM_CHANGESTYLES mask %08x, set %08lx\n", wParam, lParam);
/* FIXME: update the visual window state as well:
* add/remove trackbar, autosize, etc.
*/
mwi->dwStyle &= ~wParam;
mwi->dwStyle |= lParam & wParam;
return 0;
case MCIWNDM_GETSTYLES:
TRACE("MCIWNDM_GETSTYLES: %08lx\n", mwi->dwStyle & 0xffff);
return mwi->dwStyle & 0xffff;
case MCIWNDM_GETDEVICEA:
{
MCI_SYSINFO_PARMSA mci_sysinfo;
mci_sysinfo.lpstrReturn = (LPSTR)lParam;
mci_sysinfo.dwRetSize = wParam;
mwi->lasterror = mciSendCommandA(mwi->mci, MCI_SYSINFO,
MCI_SYSINFO_INSTALLNAME,
(DWORD_PTR)&mci_sysinfo);
TRACE("MCIWNDM_GETDEVICEA: %s\n", debugstr_an((LPSTR)lParam, wParam));
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -