亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? speechreg.cpp

?? voice command project, SAPI SDK
?? CPP
字號:
// SpeechReg.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "resource.h"

#include <objbase.h>
#include <initguid.h>
#include <objerror.h>
#include <ole2ver.h>

#include <speech.h>







HINSTANCE         ghInstance;                // instance handle
HWND              ghwndResultsDisplay = NULL;
HWND              ghwndDialog = NULL;
HWND              m_hwnd;
HWND              hWnd;
PIVOICECMD        gpIVoiceCommand = NULL;
PIVCMDDIALOGS     gpIVCmdDialogs = NULL;
PIVCMDMENU        gpIVCmdMenu = NULL;



char  gszDefaultSet[] = // default command set
   "Help\r\n"
   "Minimize window.\r\n"
   "Maximize window.\r\n"
   "What time is it?\r\n"
   "What day is it?\r\n"
   "Create a new file.\r\n"
   "Delete the current file\r\n"
   "Open a file\r\n"
   "Word\r\n"
   "Switch to Excel.\r\n"
   "Calculator.\r\n"
   "Change the background color.\r\n"
   "Go to sleep.\r\n"
   "Wake up.\r\n"
   "Print the document.\r\n"
   "Speak the text.\r\n"
   "Paste\r\n"
   "Copy\r\n";
char              *gpszCommands = NULL; // Commands
char              *gpszCurCommand = NULL;  // current command that looking at

BOOL BeginOLE();
BOOL GetCommands(char *pszMemory, PSDATA pData, DWORD *pdwNumCommands);
CHAR * NextCommand (CHAR *pszMemory, PCHAR *pBegin, DWORD *pdwSize);
HRESULT UseCommands (char *pszCommands, PIVCMDMENU pMenu);
BOOL CALLBACK ChangeProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);


// Voice Command notifications

class CIVCmdNotifySink : public IVCmdNotifySink {
    private:
    DWORD   m_dwRefCnt;
    

    public:
    CIVCmdNotifySink(void);
    ~CIVCmdNotifySink(void);

    // IUnkown members that delegate to m_punkOuter
    // Non-delegating object IUnknown
    STDMETHODIMP         QueryInterface (REFIID, LPVOID FAR *);
    STDMETHODIMP_(ULONG) AddRef(void);
    STDMETHODIMP_(ULONG) Release(void);

    // IVCmdNotifySink members
    STDMETHODIMP CommandRecognize (DWORD, PVCMDNAME, DWORD, DWORD, PVOID, DWORD, PSTR, PSTR);
    STDMETHODIMP CommandOther     (PVCMDNAME, PTSTR);
	STDMETHODIMP CommandStart     (void);
    STDMETHODIMP MenuActivate     (PVCMDNAME, BOOL);
    STDMETHODIMP UtteranceBegin   (void);
    STDMETHODIMP UtteranceEnd     (void);
    STDMETHODIMP VUMeter          (WORD);
    STDMETHODIMP AttribChanged    (DWORD);
	STDMETHODIMP Interference     (DWORD);
};
typedef CIVCmdNotifySink * PCIVCmdNotifySink;


BOOL CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch(uMsg)
	{
	case WM_INITDIALOG:
		
		ghwndDialog=hWnd;
		ghwndResultsDisplay = GetDlgItem (hWnd, IDC_EDIT2);
		SetDlgItemText(hWnd,IDC_EDIT1,gszDefaultSet);
		if (UseCommands (gpszCommands, gpIVCmdMenu))
         return 1;   // error
	
		return 0;
	case WM_COMMAND:
		 switch (LOWORD(wParam))
		 {
		 case IDOK:
			 
			   EndDialog (hWnd, IDOK);
			 
			 return 0;
		 case IDC_ADD:
			 {
				 DialogBox (ghInstance, MAKEINTRESOURCE(IDD_ADD),
                  hWnd, (DLGPROC) ChangeProc);
				 SetDlgItemText(hWnd,IDC_EDIT1,gpszCommands);
               return TRUE;
			 }

		 case IDC_TRAIN:
               gpIVCmdDialogs->TrainGeneralDlg (hWnd, NULL);
               return TRUE;

			 return 0;
		 }
	
	}


               
	return 0;
}
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 
	BeginOLE();
	// Create a menu out of the default
    gpszCommands = (char*) malloc (strlen(gszDefaultSet)+1);

	gpszCommands = (char*) malloc (strlen(gszDefaultSet)+1);
    if (!gpszCommands)
		return 1;
	strcpy (gpszCommands, gszDefaultSet);
	gpszCurCommand = gpszCommands;
	DialogBox (hInstance, MAKEINTRESOURCE(IDD_VCMD),
      NULL, (DLGPROC) DialogProc);
	
	return 0;
}


BOOL BeginOLE()
{
	HRESULT  hRes;
	VCMDNAME VcmdName;
	LANGUAGE Language;
	PCIVCmdNotifySink gpVCmdNotifySink = NULL;
	PIVCMDATTRIBUTES  pIVCmdAttributes;
	SetMessageQueue(96);

	CoInitialize(NULL);
		

	// Create the voice commands object
	hRes=CoCreateInstance(CLSID_VCmd, NULL, CLSCTX_LOCAL_SERVER, IID_IVoiceCmd, (LPVOID *)&gpIVoiceCommand);
	

	// Get the dialogs interface pointer...
	hRes = gpIVoiceCommand->QueryInterface( IID_IVCmdDialogs, (LPVOID FAR *)&gpIVCmdDialogs );
	

	// Get the attributes interface pointer...
    //	hRes = gpIVoiceCommand->QueryInterface( IID_IVCmdAttributes, (LPVOID FAR *)&gpIVCmdAttr );


	// Create/Register VCmd notification sink...
	gpVCmdNotifySink = new CIVCmdNotifySink;
	

	hRes = gpIVoiceCommand->Register( "", gpVCmdNotifySink, IID_IVCmdNotifySink, VCMDRF_ALLMESSAGES, NULL );
	

	if(FAILED(hRes))
		MessageBox(m_hwnd,"Error in registering","Speech Reg",MB_OK);

	//The following code checks for a navigator app and 
    //checks the state of voice commands

    hRes = gpIVoiceCommand->QueryInterface(IID_IVCmdAttributes, (LPVOID FAR *)&pIVCmdAttributes);
	if (pIVCmdAttributes) 
	{
		pIVCmdAttributes->EnabledSet( TRUE );
  		pIVCmdAttributes->AwakeStateSet( TRUE );

		pIVCmdAttributes->Release();
	};

	// Initialize command menu set variables...
	lstrcpy(VcmdName.szApplication, "Speech Reg");
	lstrcpy(VcmdName.szState, "Main");
	Language.LanguageID = LANG_ENGLISH;
	lstrcpy (Language.szDialect, "US English");

	// Create an empty command menu set...
	hRes = gpIVoiceCommand->MenuCreate( &VcmdName, &Language, VCMDMC_CREATE_TEMP, &gpIVCmdMenu );
	if( FAILED(hRes) ) 
	    MessageBox(m_hwnd,"Failed to create a voice command set with MenuCreate()", "Speech Reg",MB_OK);

	
	return TRUE;
}

/*
 Closes up OLE and frees everything else.
*/
BOOL EndOLE()
{
	
	
	// Free up all of OLE
	CoUninitialize();

	return TRUE;
}



/**************************************************************************
 *  Voice Command notification objects
 **************************************************************************/

CIVCmdNotifySink::CIVCmdNotifySink (void)
{
    m_dwRefCnt = 0;
}

CIVCmdNotifySink::~CIVCmdNotifySink (void)
{
}

STDMETHODIMP CIVCmdNotifySink::QueryInterface (REFIID riid, LPVOID *ppv)
{
	*ppv = NULL;

    /* always return our IUnkown for IID_IUnknown */
    if (IsEqualIID (riid, IID_IUnknown) || IsEqualIID(riid,IID_IVCmdNotifySink)) {
        *ppv = (LPVOID) this;
        return NOERROR;
    }

    // otherwise, cant find
    return ResultFromScode (E_NOINTERFACE);
}

STDMETHODIMP_ (ULONG) CIVCmdNotifySink::AddRef (void)
{
    // normally this increases a reference count, but this object
    // is going to be freed as soon as the app is freed, so it doesn't
    // matter
    return 1;
}

STDMETHODIMP_(ULONG) CIVCmdNotifySink::Release (void)
{
	// normally this releases a reference count, but this object
    // is going to be freed when the application is freed so it doesnt
    // matter
    return 1;
}

/*
 Handle recognition notification.

 Inputs:
 dwID         - Id of this instance of Voice command object.
 pName        - 
 dwFlags      -
 dwActionSize -
 pAction      - The index of the command in the command list (1 based).
 dwNumLists   -
 pszListValue - 
 pszCommand   - 
*/



STDMETHODIMP CIVCmdNotifySink::CommandRecognize(DWORD dwID, PVCMDNAME pName,
   DWORD dwFlags, DWORD dwActionSize, PVOID pAction, DWORD dwNumLists,
   PSTR pszListValues, PSTR pszCommand)
{
// This is called when a recognition occurs for the current application

if (!lstrcmp(pszCommand, "calculator"))
        WinExec("calc.exe", SW_SHOWNORMAL);
	if (!ghwndResultsDisplay)
		return NOERROR;
	 SetWindowText (ghwndResultsDisplay,pszCommand ? pszCommand : "[Unrecognized]");

return NOERROR;
}

STDMETHODIMP CIVCmdNotifySink::CommandOther(PVCMDNAME pName, PTSTR pszCommand)
{
	 if (!lstrcmp(pszCommand, "calculator"))
        WinExec("calc.exe", SW_SHOWNORMAL);
	if (!ghwndResultsDisplay)
		return NOERROR;
	 SetWindowText (ghwndResultsDisplay,pszCommand ? pszCommand : "[Unrecognized]");
	
	return NOERROR;
}


/*
 Handle notifiaction sent when recognition begins.
*/
STDMETHODIMP CIVCmdNotifySink::CommandStart(void)
{
	return NOERROR;
}

/*
 Handle notification sent when the menu is activated/deactivated.
*/
STDMETHODIMP CIVCmdNotifySink::MenuActivate(PVCMDNAME pName, BOOL bActivate)
{
	return NOERROR;
}

/*
 Handle notification sent when the attribute is changed.
*/
STDMETHODIMP CIVCmdNotifySink::AttribChanged(DWORD dwAttribute)
{
	return NOERROR;
}

/*
 Handle notification sent when the recognizer detects the beginning of an utterance.
*/
STDMETHODIMP CIVCmdNotifySink::UtteranceBegin(void)
{
		
	return NOERROR;
}

/*
 Handle notification sent when the recognizer detects the end of an utterance.
*/
STDMETHODIMP CIVCmdNotifySink::UtteranceEnd()
{
	// if we're not in wide mode, indicate the status to the user
	// by changing the window title...
	
	return NOERROR;
}

/*
 Handle notification sent to indicate amplitude of incoming audio data.
*/
STDMETHODIMP CIVCmdNotifySink::VUMeter(WORD wLevel)
{
	// paint the view meter abse3d on data from notification...


	return NOERROR;
}

/*
 Handle notification sent when the recognizer detects interference
*/
STDMETHODIMP CIVCmdNotifySink::Interference(DWORD dwType)
{
	return NOERROR;
}

HRESULT UseCommands (char *pszCommands, PIVCMDMENU pMenu)
{
    HRESULT hRes;
    SDATA   data;
    DWORD   dwNum, dwStart;
    hRes = pMenu->Deactivate(); // deactivate the menu
    if (hRes) return hRes;
    // Retrieve the number of commands in the menu.
    hRes = pMenu->Num(&dwNum);
    if (hRes) return hRes;
    // Remove the existing commands from the menu.
    if (dwNum)
       hRes = pMenu->Remove (1, dwNum, VCMD_BY_POSITION);
    if (hRes) return hRes;
    // Call GetCommands, an application-defined function that fills an SDATA
    // structure with information about the commands to add to the menu.
    if (!GetCommands(pszCommands, &data, &dwNum))
       return ResultFromScode (E_OUTOFMEMORY);
    // Add the commands to the menu.
    hRes = pMenu->Add (dwNum, data, &dwStart);
    if (hRes) return hRes;
    // Free the command data.
    free (data.pData);
    // Reactivate the menu.
    hRes = pMenu->Activate(hWnd, 0);
    return hRes;
}

BOOL GetCommands(char *pszMemory, PSDATA pData, DWORD *pdwNumCommands)
{
    PSTR pTemp;
    DWORD dwTotal, dwSize, dwSizeDesc, dwSizeCat;
    DWORD dwSizeCmd;
    PVCMDCOMMAND pCmd, pCmdNew;
    CHAR    *pszBegin;
    DWORD   dwCmdSize;
    DWORD   dwCmds = 0;  // Current count
    DWORD   dwCount = 1; // Command number
    char    szCat[] = "Main";

    dwTotal = dwSize = 0;

    pTemp = (PSTR)malloc(0);
    if (!pTemp)
        return FALSE;

    pCmd = (PVCMDCOMMAND)pTemp;
    for( ;; ) {
        pszMemory = NextCommand (pszMemory, &pszBegin, &dwCmdSize);
        if (!pszMemory)
            break;   // no more

        // size of header
        dwSize = sizeof(VCMDCOMMAND);

        // get command length
        dwSizeCmd = (dwCmdSize + 1);

        // doubleword align
        dwSizeCmd += 3;
        dwSizeCmd &= (~3);
        dwSize += dwSizeCmd;

        // get description length
        dwSizeDesc = (dwCmdSize + 1);

        // doubleword align
        dwSizeDesc += 3;
        dwSizeDesc &= (~3);
        dwSize += dwSizeDesc;

        // get category length
        dwSizeCat = lstrlen(szCat) + 1;

        // doubleword align
        dwSizeCat += 3;
        dwSizeCat &= (~3);
        dwSize += dwSizeCat;

        // action indicator
        dwSize += sizeof(DWORD);

        // accumulate total size
        dwTotal += dwSize;

        // reallocate enough memory to hold this command
        pTemp = (PSTR)realloc((PVOID)pCmd, dwTotal);

        // fill in the new command
        pCmd = (PVCMDCOMMAND)pTemp;
        pTemp += (dwTotal-dwSize);
        pCmdNew = (PVCMDCOMMAND)pTemp;
        memset (pCmdNew, 0, dwSize);

        pCmdNew->dwSize = dwSize;
        pCmdNew->dwFlags = 0;
        pCmdNew->dwAction = (DWORD)(pCmdNew->abData-(PBYTE)pTemp);
        pCmdNew->dwActionSize = sizeof(DWORD);
        pCmdNew->dwCommandText = NULL;

        // point past header to begin of data
        pTemp += (pCmdNew->abData-(PBYTE)pTemp);

        // action index
        *(DWORD *)pTemp = dwCount++;
        pTemp += sizeof(DWORD);

        // command
        pCmdNew->dwCommand = (DWORD)((PBYTE)pTemp - (PBYTE)pCmdNew);
        strncpy(pTemp, pszBegin, dwCmdSize);
        pTemp += dwSizeCmd;

        // description
        pCmdNew->dwDescription = (DWORD)((PBYTE)pTemp - (PBYTE)pCmdNew);
        strncpy(pTemp, pszBegin, dwCmdSize);
        pTemp += dwSizeDesc;

        // category
        pCmdNew->dwCategory = (DWORD)((PBYTE)pTemp - (PBYTE)pCmdNew);
        strcpy(pTemp, szCat);

        // we just added another command
        dwCmds++;
    }

    pData->pData = (PVOID)pCmd;
    pData->dwSize = dwTotal;
    *pdwNumCommands = dwCmds;
    return TRUE;
}

CHAR * NextCommand (CHAR *pszMemory, PCHAR *pBegin, DWORD *pdwSize)
{
    DWORD i;
    for( ;; ) {
        // Try to find a non-newline character.
        while ((*pszMemory == '\n') || (*pszMemory == '\r')) {
            if (*pszMemory == '\0')
                return NULL;
            pszMemory++;
        };
    // Try to find a newline character.
    for (i = 0;
        (pszMemory[i] != '\n') && (pszMemory[i] != '\r') &&
            (pszMemory[i] != '\0'); i++);
    if (!i) {
        if (!pszMemory[i])
            return NULL; // end
        pszMemory++;
        continue;        // try again
      };
    // A string was found. Return it.
    *pBegin = pszMemory;
    *pdwSize = i;
    return pszMemory + i;
    };
}

BOOL CALLBACK ChangeProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch(uMsg)
	{
	case WM_INITDIALOG:
		SetDlgItemText (hWnd, IDC_ADDEDIT, gpszCommands);
        return 0;
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDOK:
		       char     *pszNew;
               DWORD    dwSize;
               // Throw out the old buffer & copy the
               // new one in. The set us to use it
               pszNew = (char*) malloc (dwSize =
                  GetWindowTextLength(GetDlgItem(hWnd, IDC_ADDEDIT)) + 1);
               if (pszNew) 
			   {
                  GetDlgItemText (hWnd, IDC_ADDEDIT, pszNew, dwSize);
                  free (gpszCommands);
                  gpszCommands = pszNew;
                  gpszCurCommand = pszNew;
                  if (UseCommands (gpszCommands, gpIVCmdMenu))
                     return 1;   // error

               }
			 EndDialog (hWnd, IDOK);
		case IDCANCEL:
			EndDialog(hWnd,IDCANCEL);
		}
	}
	
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
伦理电影国产精品| 91精品欧美一区二区三区综合在| 欧美一区二区在线免费观看| 亚洲网友自拍偷拍| 欧美精品乱码久久久久久按摩| 亚洲国产va精品久久久不卡综合| 欧美日韩国产综合一区二区三区| 亚洲超碰精品一区二区| 日韩一区二区麻豆国产| 久久不见久久见免费视频7| 国产偷国产偷精品高清尤物| 成人黄色网址在线观看| 亚洲精品高清在线| 在线成人av网站| 狠狠狠色丁香婷婷综合久久五月| 中文字幕av免费专区久久| 日本韩国一区二区三区视频| 亚洲成人免费在线| 久久久亚洲精品石原莉奈| a美女胸又www黄视频久久| 亚洲一区中文在线| 欧美精品一区男女天堂| 色综合久久久网| 久久成人精品无人区| 国产精品白丝在线| 欧美一级二级在线观看| 成人久久18免费网站麻豆| 亚洲第四色夜色| 欧美激情综合在线| 欧美日韩一区成人| 成人性视频网站| 日韩高清国产一区在线| 国产精品第一页第二页第三页| 欧美人妖巨大在线| eeuss鲁片一区二区三区 | 日韩成人伦理电影在线观看| 久久夜色精品国产欧美乱极品| 色偷偷88欧美精品久久久| 久久国产福利国产秒拍| 亚洲无线码一区二区三区| 国产三级精品三级| 日韩亚洲电影在线| 欧美体内she精高潮| 成人美女视频在线观看| 久久疯狂做爰流白浆xx| 亚洲丶国产丶欧美一区二区三区| 亚洲国产成人在线| 精品久久久久99| 91精品蜜臀在线一区尤物| 91亚洲男人天堂| 国产大陆精品国产| 久久精品久久精品| 日韩高清欧美激情| 午夜视频在线观看一区| 亚洲人成影院在线观看| 欧美激情一区二区三区不卡| 欧美xxxxx裸体时装秀| 欧美午夜精品免费| 色婷婷久久久综合中文字幕| 成人sese在线| 成人午夜免费视频| 成人亚洲精品久久久久软件| 黑人巨大精品欧美黑白配亚洲| 日韩国产欧美三级| 日韩av电影天堂| 午夜精品久久久久久久久久久| 洋洋成人永久网站入口| 亚洲三级久久久| 国产精品护士白丝一区av| 国产欧美日韩另类一区| 国产亚洲欧美中文| 国产日韩欧美电影| 国产日产精品1区| 国产亲近乱来精品视频| 欧美激情在线一区二区三区| 久久综合五月天婷婷伊人| 日韩午夜在线影院| 欧美成人精品福利| 久久婷婷国产综合精品青草| 精品国产乱码91久久久久久网站| 日韩欧美你懂的| 久久蜜桃一区二区| 欧美激情一区三区| 综合久久久久久| 亚洲综合成人网| 日韩av午夜在线观看| 毛片不卡一区二区| 国产精一品亚洲二区在线视频| 国产精选一区二区三区| 成人av资源网站| 欧美影院一区二区三区| 欧美日韩一二三区| 精品久久人人做人人爱| 国产精品视频在线看| 亚洲男女一区二区三区| 天天做天天摸天天爽国产一区 | 日本人妖一区二区| 久久99国内精品| www.日本不卡| 欧美日韩dvd在线观看| 欧美一二三区精品| 中文字幕av一区 二区| 亚洲一级二级在线| 精品一区二区三区免费视频| 不卡欧美aaaaa| 777奇米四色成人影色区| 久久综合狠狠综合| 亚洲影院在线观看| 国产一区二区三区在线看麻豆 | 色先锋久久av资源部| 欧美日韩一区中文字幕| 久久亚洲综合av| 一区二区欧美在线观看| 日韩国产精品久久久| 成人在线视频首页| 欧美性欧美巨大黑白大战| 精品国产伦一区二区三区观看体验 | 97成人超碰视| 日韩精品一区二区在线| 亚洲精品久久久蜜桃| 蜜桃视频第一区免费观看| 不卡av电影在线播放| 欧美一级久久久久久久大片| 1区2区3区精品视频| 久草在线在线精品观看| 在线视频观看一区| 国产午夜精品一区二区三区嫩草| 亚洲一区二区三区免费视频| 国产精品乡下勾搭老头1| 欧美日韩精品久久久| 亚洲国产成人午夜在线一区 | 国产精品电影一区二区三区| 欧美aⅴ一区二区三区视频| aaa欧美大片| 久久婷婷国产综合国色天香| 午夜电影久久久| 91美女在线看| 欧美国产日产图区| 国产在线精品一区二区三区不卡 | 91伊人久久大香线蕉| 日韩欧美在线影院| 亚洲国产精品久久人人爱蜜臀| 成人av小说网| 国产偷国产偷亚洲高清人白洁| 奇米影视在线99精品| 欧美日韩免费视频| 亚洲精品国产无天堂网2021 | 欧美日本不卡视频| 一区二区三区精品视频| 成人激情校园春色| 久久久久综合网| 狠狠v欧美v日韩v亚洲ⅴ| 91精品国产综合久久精品| 亚洲永久精品大片| 色成人在线视频| 亚洲九九爱视频| 97超碰欧美中文字幕| 国产精品无人区| 成人精品gif动图一区| 国产亚洲成av人在线观看导航| 久久99精品国产.久久久久| 日韩欧美自拍偷拍| 欧美bbbbb| 91精选在线观看| 免费观看在线色综合| 日韩欧美在线网站| 久久99国产精品尤物| 精品盗摄一区二区三区| 精品在线你懂的| 国产日韩一级二级三级| 成人久久18免费网站麻豆| 欧美国产日韩一二三区| 99久久精品免费看| 亚洲色图欧美偷拍| 欧美天天综合网| 免费看黄色91| 久久一区二区三区国产精品| 国产精品一二三区在线| 五月激情综合网| 欧美一级在线免费| 国产精品综合久久| 中文字幕av资源一区| 成人av在线资源网| 一区二区不卡在线播放| 欧美一区二区三区四区在线观看| 蜜臀91精品一区二区三区| 国产亚洲欧美激情| 色综合中文字幕国产 | 欧美老年两性高潮| 麻豆精品在线视频| 日本一区二区三区四区| 99视频在线精品| 亚洲国产一区二区三区| 在线观看91av| 国产成人综合在线观看| 亚洲精品国产一区二区三区四区在线 | 欧美日韩国产一级二级| 精品一区二区久久| 亚洲精品一二三四区| 日韩亚洲欧美在线观看|