glfw/src/win32/win32_enable.c

148 lines
5.1 KiB
C
Raw Normal View History

2010-09-07 17:34:51 +02:00
//========================================================================
// GLFW - An OpenGL framework
// Platform: Win32/WGL
2010-09-07 17:41:26 +02:00
// API version: 3.0
2010-09-07 17:34:51 +02:00
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would
// be appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not
// be misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
//========================================================================
#include "internal.h"
//========================================================================
// Low level keyboard hook (system callback) function
// Used to disable system keys under Windows NT
//========================================================================
2010-09-10 22:03:36 +02:00
static LRESULT CALLBACK keyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
2010-09-07 17:34:51 +02:00
{
BOOL syskeys = FALSE;
PKBDLLHOOKSTRUCT p;
// We are only looking for keyboard events - interpret lParam as a
// pointer to a KBDLLHOOKSTRUCT
p = (PKBDLLHOOKSTRUCT) lParam;
2010-09-10 22:03:36 +02:00
if (nCode == HC_ACTION)
2010-09-07 17:34:51 +02:00
{
// We have a keyboard event
2010-09-10 22:03:36 +02:00
switch (wParam)
2010-09-07 17:34:51 +02:00
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
// Detect: ALT+TAB, ALT+ESC, ALT+F4, CTRL+ESC,
// LWIN, RWIN, APPS (mysterious menu key)
2010-09-10 22:03:36 +02:00
syskeys = (p->vkCode == VK_TAB &&
p->flags & LLKHF_ALTDOWN) ||
(p->vkCode == VK_ESCAPE &&
p->flags & LLKHF_ALTDOWN) ||
(p->vkCode == VK_F4 &&
p->flags & LLKHF_ALTDOWN) ||
(p->vkCode == VK_ESCAPE &&
(GetKeyState(VK_CONTROL) & 0x8000)) ||
2010-09-07 17:34:51 +02:00
p->vkCode == VK_LWIN ||
p->vkCode == VK_RWIN ||
p->vkCode == VK_APPS;
break;
default:
break;
}
}
// Was it a system key combination (e.g. ALT+TAB)?
2010-09-10 22:03:36 +02:00
if (syskeys)
2010-09-07 17:34:51 +02:00
{
// Pass the key event to our window message loop
2010-09-10 22:03:36 +02:00
if (_glfwWin.opened)
PostMessage(_glfwWin.window, (UINT) wParam, p->vkCode, 0);
2010-09-07 17:34:51 +02:00
// We've taken care of it - don't let the system know about this
// key event
return 1;
}
else
{
// It's a harmless key press, let the system deal with it
2010-09-10 22:03:36 +02:00
return CallNextHookEx(_glfwWin.keyboardHook, nCode, wParam, lParam);
2010-09-07 17:34:51 +02:00
}
}
2010-09-10 22:03:36 +02:00
//////////////////////////////////////////////////////////////////////////
////// GLFW platform API //////
//////////////////////////////////////////////////////////////////////////
2010-09-07 17:34:51 +02:00
//========================================================================
// Enable system keys
//========================================================================
2010-09-10 22:03:36 +02:00
void _glfwPlatformEnableSystemKeys(void)
2010-09-07 17:34:51 +02:00
{
BOOL dummy;
// Use different methods depending on operating system version
2010-09-10 22:03:36 +02:00
if (_glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4)
2010-09-07 17:34:51 +02:00
{
2010-09-10 22:03:36 +02:00
if (_glfwWin.keyboardHook != NULL)
2010-09-07 17:34:51 +02:00
{
2010-09-10 22:03:36 +02:00
UnhookWindowsHookEx(_glfwWin.keyboardHook);
2010-09-07 17:34:51 +02:00
_glfwWin.keyboardHook = NULL;
}
}
else
2010-09-10 22:03:36 +02:00
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, FALSE, &dummy, 0);
2010-09-07 17:34:51 +02:00
}
2010-09-10 22:03:36 +02:00
2010-09-07 17:34:51 +02:00
//========================================================================
// Disable system keys
//========================================================================
2010-09-10 22:03:36 +02:00
void _glfwPlatformDisableSystemKeys(void)
2010-09-07 17:34:51 +02:00
{
BOOL dummy;
// Use different methods depending on operating system version
2010-09-10 22:03:36 +02:00
if (_glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4)
2010-09-07 17:34:51 +02:00
{
// Under Windows NT, install a low level keyboard hook
2010-09-10 22:03:36 +02:00
_glfwWin.keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL,
keyboardHook,
_glfwLibrary.instance,
0);
2010-09-07 17:34:51 +02:00
}
else
{
// Under Windows 95/98/ME, fool Windows that a screensaver
// is running => prevents ALT+TAB, CTRL+ESC and CTRL+ALT+DEL
2010-09-10 22:03:36 +02:00
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, TRUE, &dummy, 0);
2010-09-07 17:34:51 +02:00
}
}