📄 winlink.cpp
字号:
MouseButton=(dims.rgbButtons[0]>>7)|(dims.rgbButtons[1]>>6)|(dims.rgbButtons[2]>>5)|(dims.rgbButtons[3]>>4); } else return FALSE; } return TRUE;}void ExitFunction(){ // We need to clean up the debug window if it's running if (debugWindow) FreeConsole(); IsActivated = 0; CheckScreenSaver(); ReleaseDirectInput(); ReleaseDirectSound(); ReleaseDirectDraw(); FreeLibrary(hM_dsound); FreeLibrary(hM_ddraw); FreeLibrary(hM_dinput8); DestroyWindow(hMainWindow);}extern "C" { bool ctrlptr = false; }LRESULT CALLBACK Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ static bool shiftpr; bool accept; int vkeyval = 0; switch (uMsg) { case WM_KEYDOWN: // sent when user presses a key if (!((CurKeyPos+1==CurKeyReadPos) || ((CurKeyPos+1==16) && (CurKeyReadPos==0)))){ accept=false; if (wParam==16) shiftpr=true; else if (wParam==17) ctrlptr=true; if (((wParam>='A') && (wParam<='Z')) || ((wParam>='a') && (wParam<='z')) || (wParam==27) || (wParam==32) || (wParam==8) || (wParam==13) || (wParam==9)) { accept=true; vkeyval=wParam; } if ((wParam>='0') && (wParam<='9')) { accept=true; vkeyval=wParam; if (shiftpr) { switch (wParam) { case '1': vkeyval='!'; break; case '2': vkeyval='@'; break; case '3': vkeyval='#'; break; case '4': vkeyval='$'; break; case '5': vkeyval='%'; break; case '6': vkeyval='^'; break; case '7': vkeyval='&'; break; case '8': vkeyval='*'; break; case '9': vkeyval='('; break; case '0': vkeyval=')'; break; } } } if ((wParam>=VK_NUMPAD0) && (wParam<=VK_NUMPAD9)) { accept=true; vkeyval=wParam-VK_NUMPAD0+'0'; } if (!shiftpr){ switch (wParam) { case 189: vkeyval='-'; accept=true; break; case 187: vkeyval='='; accept=true; break; case 219: vkeyval='['; accept=true; break; case 221: vkeyval=']'; accept=true; break; case 186: vkeyval=';'; accept=true; break; case 222: vkeyval=39; accept=true; break; case 188: vkeyval=','; accept=true; break; case 190: vkeyval='.'; accept=true; break; case 191: vkeyval='/'; accept=true; break; case 192: vkeyval='`'; accept=true; break; case 220: vkeyval=92; accept=true; break; } } else { switch (wParam) { case 189: vkeyval='_'; accept=true; break; case 187: vkeyval='+'; accept=true; break; case 219: vkeyval='{'; accept=true; break; case 221: vkeyval='}'; accept=true; break; case 186: vkeyval=':'; accept=true; break; case 222: vkeyval='"'; accept=true; break; case 188: vkeyval='<'; accept=true; break; case 190: vkeyval='>'; accept=true; break; case 191: vkeyval='?'; accept=true; break; case 192: vkeyval='~'; accept=true; break; case 220: vkeyval='|'; accept=true; break; } } switch (wParam) { case 33: vkeyval=256+73; accept=true; break; case 38: vkeyval=256+72; accept=true; break; case 36: vkeyval=256+71; accept=true; break; case 39: vkeyval=256+77; accept=true; break; case 12: vkeyval=256+76; accept=true; break; case 37: vkeyval=256+75; accept=true; break; case 34: vkeyval=256+81; accept=true; break; case 40: vkeyval=256+80; accept=true; break; case 35: vkeyval=256+79; accept=true; break; case 107: vkeyval='+'; accept=true; break; case 109: vkeyval='-'; accept=true; break; case 106: vkeyval='*'; accept=true; break; case 111: vkeyval='/'; accept=true; break; case 110: vkeyval='.'; accept=true; break; } if (accept){ KeyBuffer[CurKeyPos]=vkeyval; CurKeyPos++; if (CurKeyPos==16) CurKeyPos=0; } } break; case WM_KEYUP: // sent when user releases a key if (wParam==16) shiftpr=false; else if (wParam==17) ctrlptr=false; break; case WM_MOUSEMOVE: if (MouseInput && GUIOn2) MouseInput->Acquire(); break; case WM_MOVE: break; case WM_PAINT: ValidateRect(hWnd,NULL); break; case WM_ACTIVATE: if (LOWORD(wParam) != WA_INACTIVE) { IsActivated = 1; if (FirstActivate == 0) initwinvideo(); if (PauseFocusChange) EMUPause = 0; InputAcquire(); if (FirstActivate == 1) FirstActivate = 0; if (FullScreen == 1) Clear2xSaIBuffer(); CheckPriority(); CheckScreenSaver(); } if (LOWORD(wParam) == WA_INACTIVE) { IsActivated = 0; if (PauseFocusChange) EMUPause = 1; InputDeAcquire(); if (GUIOn || GUIOn2 || EMUPause) SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS); CheckScreenSaver(); } break; case WM_SETFOCUS: if (FullScreen == 0) ShowWindow(hMainWindow, SW_SHOWNORMAL); CheckPriority(); CheckScreenSaver(); InputAcquire(); break; case WM_KILLFOCUS: InputDeAcquire(); IsActivated = 0; if (GUIOn || GUIOn2 || EMUPause) SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS); CheckScreenSaver(); break; case WM_DESTROY: break; case WM_CLOSE: break; } return DefWindowProc(hWnd,uMsg,wParam,lParam);;}int RegisterWinClass(void){ if (AllowMultipleInst == 0) { HWND hFindWindow; hFindWindow = FindWindow("ZSNES", NULL); if (hFindWindow != NULL) { ShowWindow(hFindWindow, SW_SHOWNORMAL); SetForegroundWindow(hFindWindow); DosExit(); } } WNDCLASS wcl; wcl.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE; wcl.cbClsExtra = 0; wcl.cbWndExtra = 0; wcl.hIcon = LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1)); wcl.hCursor = NULL; wcl.hInstance = hInst; wcl.lpfnWndProc = (WNDPROC)Main_Proc; wcl.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wcl.lpszMenuName = NULL; wcl.lpszClassName = "ZSNES"; if (RegisterClass(&wcl) == 0) return FALSE; return TRUE;}BYTE PrevStereoSound;DWORD PrevSoundQuality;BOOL InitSound(){ WAVEFORMATEX wfx; DSBCAPS dsbcaps; SoundEnabled = 0; if (soundon == 0) return FALSE; PrevSoundQuality=SoundQuality; PrevStereoSound=StereoSound; if (DS_OK == pDirectSoundCreate8(NULL, &lpDirectSound,NULL)) { lpDirectSound->Initialize(NULL); if (PrimaryBuffer) { if (DS_OK != lpDirectSound->SetCooperativeLevel(hMainWindow, DSSCL_WRITEPRIMARY)) { if (DS_OK != lpDirectSound->SetCooperativeLevel(hMainWindow, DSSCL_EXCLUSIVE)) return FALSE; } else UsePrimaryBuffer=1; } else { if (DS_OK != lpDirectSound->SetCooperativeLevel(hMainWindow, DSSCL_NORMAL)) { if (DS_OK != lpDirectSound->SetCooperativeLevel(hMainWindow, DSSCL_EXCLUSIVE)) return FALSE; } else UsePrimaryBuffer=0; } } else { return FALSE; } wfx.wFormatTag = WAVE_FORMAT_PCM; switch (SoundQuality) { case 0: wfx.nSamplesPerSec = 8000; SoundBufferSize=1024*2; break; case 1: wfx.nSamplesPerSec = 11025; SoundBufferSize=1024*2; break; case 2: wfx.nSamplesPerSec = 22050; SoundBufferSize=1024*4; break; case 3: wfx.nSamplesPerSec = 44100; SoundBufferSize=1024*8; break; case 4: wfx.nSamplesPerSec = 16000; SoundBufferSize=1024*4; break; case 5: wfx.nSamplesPerSec = 32000; SoundBufferSize=1024*8; break; case 6: wfx.nSamplesPerSec = 48000; SoundBufferSize=1024*8; break; default: wfx.nSamplesPerSec = 11025; SoundBufferSize=1024*2; } if (StereoSound==1) { wfx.nChannels = 2; wfx.nBlockAlign = 4; SoundBufferSize*=2; } else { wfx.nChannels = 1; wfx.nBlockAlign = 2; } wfx.wBitsPerSample = 16; wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; wfx.cbSize=0; memset(&dsbd, 0, sizeof(DSBUFFERDESC)); dsbd.dwSize = sizeof(DSBUFFERDESC); dsbd.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STICKYFOCUS; if(UsePrimaryBuffer) dsbd.dwFlags |= DSBCAPS_PRIMARYBUFFER; dsbd.dwBufferBytes = UsePrimaryBuffer ? 0 : SoundBufferSize; dsbd.lpwfxFormat = UsePrimaryBuffer ? NULL : &wfx; if (DS_OK == lpDirectSound->CreateSoundBuffer(&dsbd, &lpPrimaryBuffer, NULL)) { if(!UsePrimaryBuffer) { if (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer)) { if (DS_OK != lpSoundBuffer->Play(0,0,DSBPLAY_LOOPING)) { return FALSE; } } else return FALSE; } else { lpPrimaryBuffer->SetFormat(&wfx); dsbcaps.dwSize=sizeof(DSBCAPS); lpPrimaryBuffer->GetCaps(&dsbcaps); SoundBufferSize=dsbcaps.dwBufferBytes; if (DS_OK != lpPrimaryBuffer->Play(0,0,DSBPLAY_LOOPING)) { return FALSE; } } SoundEnabled=1; FirstSound=0; return TRUE; } else { return FALSE; }}BOOL ReInitSound(){ WAVEFORMATEX wfx; DSBCAPS dsbcaps; if (lpSoundBuffer) { lpSoundBuffer->Stop(); lpSoundBuffer->Release(); lpSoundBuffer = NULL; } if (lpPrimaryBuffer) { lpPrimaryBuffer->Stop(); lpPrimaryBuffer->Release(); lpPrimaryBuffer = NULL; } if (soundon == 0) { SoundEnabled = 0; ReleaseDirectSound(); return FALSE; } else if (SoundEnabled == 0) return InitSound(); SoundEnabled = 0; PrevSoundQuality=SoundQuality; PrevStereoSound=StereoSound; wfx.wFormatTag = WAVE_FORMAT_PCM; switch (SoundQuality) { case 0: wfx.nSamplesPerSec = 8000; SoundBufferSize=1024*2; break; case 1: wfx.nSamplesPerSec = 11025; SoundBufferSize=1024*2; break; case 2: wfx.nSamplesPerSec = 22050; SoundBufferSize=1024*4; break; case 3: wfx.nSamplesPerSec = 44100; SoundBufferSize=1024*8; break; case 4: wfx.nSamplesPerSec = 16000; SoundBufferSize=1024*4; break; case 5: wfx.nSamplesPerSec = 32000; SoundBufferSize=1024*8; break; case 6: wfx.nSamplesPerSec = 48000; SoundBufferSize=1024*8; break; default: wfx.nSamplesPerSec = 11025; SoundBufferSize=1024*2; } if (StereoSound==1) { wfx.nChannels = 2; wfx.nBlockAlign = 4; SoundBufferSize*=2; } else { wfx.nChannels = 1; wfx.nBlockAlign = 2; } wfx.wBitsPerSample = 16; wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; wfx.cbSize=0; memset(&dsbd, 0, sizeof(DSBUFFERDESC)); dsbd.dwSize = sizeof(DSBUFFERDESC); dsbd.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STICKYFOCUS; if(UsePrimaryBuffer) dsbd.dwFlags |= DSBCAPS_PRIMARYBUFFER; dsbd.dwBufferBytes = UsePrimaryBuffer ? 0 : SoundBufferSize; dsbd.lpwfxFormat = UsePrimaryBuffer ? NULL : &wfx; if (DS_OK == lpDirectSound->CreateSoundBuffer(&dsbd, &lpPrimaryBuffer, NULL)) { if(!UsePrimaryBuffer) { if (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer)) { if (DS_OK != lpSoundBuffer->Play(0,0,DSBPLAY_LOOPING)) { return FALSE; } } else return FALSE; } else { lpPrimaryBuffer->SetFormat(&wfx); dsbcaps.dwSize=sizeof(DSBCAPS); lpPrimaryBuffer->GetCaps(&dsbcaps); SoundBufferSize=dsbcaps.dwBufferBytes; if (DS_OK != lpPrimaryBuffer->Play(0,0,DSBPLAY_LOOPING)) { return FALSE; } } SoundEnabled=1; FirstSound=0; return TRUE; } else { return FALSE; }}BOOL FAR PASCAL InitJoystickInput(LPCDIDEVICEINSTANCE pdinst, LPVOID pvRef){ LPDIRECTINPUT8 pdi = (LPDIRECTINPUT8)pvRef; GUID DeviceGuid = pdinst->guidInstance; if (CurrentJoy>4) return DIENUM_CONTINUE; // Create the DirectInput joystick device. if (pdi->CreateDevice(DeviceGuid,&JoystickInput[CurrentJoy], NULL) != DI_OK) { return DIENUM_CONTINUE; } if (JoystickInput[CurrentJoy]->SetDataFormat(&c_dfDIJoystick) != DI_OK) { JoystickInput[CurrentJoy]->Release(); return DIENUM_CONTINUE; } if (JoystickInput[CurrentJoy]->SetCooperativeLevel(hMainWindow, DISCL_EXCLUSIVE | DISCL_BACKGROUND) != DI_OK) { JoystickInput[CurrentJoy]->Release(); return DIENUM_CONTINUE; } DIPROPRANGE diprg; diprg.diph.dwSize = sizeof(diprg); diprg.diph.dwHeaderSize = sizeof(diprg.diph); diprg.diph.dwObj = DIJOFS_X; diprg.diph.dwHow = DIPH_BYOFFSET; diprg.lMin = joy_sensitivity*-1; diprg.lMax = joy_sensitivity; if FAILED(JoystickInput[CurrentJoy]->SetProperty(DIPROP_RANGE, &diprg.diph)) { X1Disable[CurrentJoy]=1; X2Disable[CurrentJoy]=1; } diprg.diph.dwObj = DIJOFS_Y;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -