home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
OLS
/
Winnt
/
HCAPS32
/
HCAPS32.LZH
/
HCAPS32S.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-07-06
|
12KB
|
401 lines
#include <windows.h>
#include <ime.h>
#include <winnls.h>
#include <winnls32.h>
#include "hcaps32.h"
#include "hcaps32s.h"
static UINT afConfig;
static UINT timeDelay;
static UINT timeInterval;
static HWND hwndClient;
static HWND hwndKeyRepeat;
static BYTE ab[256];
#ifndef VK_KANA
#define VK_KANA 0x15
#define VK_KANJI 0x19
#endif
static HHOOK hhook;
static WPARAM wParamRepeat;
static LPARAM lParamRepeat;
static BOOL fRepeating;
static HINSTANCE hInstDLL;
static DWORD idThread;
static HANDLE hThread;
static UINT idTimer;
static UINT idTimerKeyUp;
void SetConfig( UINT afConfigNew, UINT timeDelayNew, UINT timeIntervalNew ) {
afConfig = afConfigNew;
timeDelay = timeDelayNew;
timeInterval = timeIntervalNew;
if( timeInterval < 5 ) timeInterval = 5;
if( hhook != NULL ) {
ReleaseHook();
SetHook( hwndClient );
}
}
BOOL WINAPI DllMain( HINSTANCE hInstDLLIn, DWORD fdwReason, LPVOID lpvReserved ) {
hInstDLL = hInstDLLIn;
return TRUE;
}
static HWND GetFocus2( void ) {
HWND hwnd = GetFocus();
if( hwnd == NULL ) hwnd = GetDesktopWindow();
return hwnd;
}
static void near ImeConnectToKana( BYTE bKana ) {
if( WINNLSGetEnableStatus( NULL ) ) {
BOOL fOpen;
IMESTRUCT FAR* pime;
HANDLE hmem;
WORD mode;
HWND hwndFocus = GetFocus2();
hmem = GlobalAlloc( GMEM_SHARE | GMEM_MOVEABLE, sizeof(IMESTRUCT) );
pime = (IMESTRUCT FAR*)GlobalLock( hmem );
pime->fnc = IME_GETOPEN;
fOpen = (BOOL)SendIMEMessageEx( hwndFocus, (LPARAM)hmem );
if( fOpen ) {
pime->fnc = IME_GETCONVERSIONMODE;
mode = (WORD)SendIMEMessageEx( hwndFocus, (LPARAM)hmem );
if( (mode & IME_MODE_ALPHANUMERIC) != 0 && (bKana & 0x80) != 0 ) {
pime->fnc = IME_SETCONVERSIONMODE;
pime->wParam = IME_MODE_HIRAGANA;
SendIMEMessageEx( hwndFocus, (LPARAM)hmem );
} else if( (mode & (IME_MODE_HIRAGANA | IME_MODE_KATAKANA)) != 0 && (bKana & 0x80) == 0 ) {
pime->fnc = IME_SETCONVERSIONMODE;
pime->wParam = IME_MODE_ALPHANUMERIC;
SendIMEMessageEx( hwndFocus, (LPARAM)hmem );
}
}
GlobalUnlock( hmem );
GlobalFree( hmem );
}
}
static BYTE bKana;
static void near SwitchKanaMode( HWND hwndFocus, int action ) {
// action == 0 ... 切り替え
// action == 1 ... on
// action == 2 ... off
GetKeyboardState( (BYTE FAR*)ab );
bKana = ab[VK_KANA];
if( action == 2
|| (action == 0 && (ab[VK_KANA] & 0x80)) ) {
if( (bKana & 0x80) == 0 ) {
return;
}
bKana &= 0x7F;
} else {
if( bKana == 0 ) {
bKana = 0x81;
} else if( bKana == 1 ) {
bKana = 0x80;
} else {
return;
}
}
ab[VK_KANA] = bKana;
SetKeyboardState( (BYTE FAR*)ab );
if( bKana & 0x80 ) {
PostMessage( hwndFocus, WM_KEYDOWN, VK_KANA, 0x80700001L );
} else {
PostMessage( hwndFocus, WM_KEYUP, VK_KANA, 0x00700001L );
}
}
static void near KanaConnectToIme( void ) {
GetKeyboardState( (BYTE FAR*)ab );
if( WINNLSGetEnableStatus( NULL ) ) {
BOOL fOpen;
IMESTRUCT FAR* pime;
HANDLE hmem;
WORD mode;
HWND hwndFocus = GetFocus2();
hmem = GlobalAlloc( GMEM_SHARE | GMEM_MOVEABLE, sizeof(IMESTRUCT) );
pime = (IMESTRUCT FAR*)GlobalLock( hmem );
pime->fnc = IME_GETOPEN;
fOpen = (BOOL)SendIMEMessageEx( hwndFocus, (LPARAM)hmem );
if( fOpen ) {
pime->fnc = IME_GETCONVERSIONMODE;
mode = (WORD)SendIMEMessageEx( hwndFocus, (LPARAM)hmem );
if( (mode & IME_MODE_ALPHANUMERIC) != 0 && (ab[VK_KANA] & 0x80) != 0 ) {
SwitchKanaMode( hwndFocus, 2 );
} else if( (mode & (IME_MODE_HIRAGANA | IME_MODE_KATAKANA)) != 0 && (ab[VK_KANA] & 0x80) == 0 ) {
SwitchKanaMode( hwndFocus, 1 );
}
}
GlobalUnlock( hmem );
GlobalFree( hmem );
}
}
static void near SwitchIME( void ) {
if( WINNLSGetEnableStatus( NULL ) ) {
BOOL fOpen;
IMESTRUCT FAR* pime;
HANDLE hmem;
HWND hwndFocus = GetFocus2();
hmem = GlobalAlloc( GMEM_SHARE | GMEM_MOVEABLE, sizeof(IMESTRUCT) );
pime = (IMESTRUCT FAR*)GlobalLock( hmem );
pime->fnc = IME_GETOPEN;
fOpen = (BOOL)SendIMEMessageEx( hwndFocus, (LPARAM)hmem );
if( fOpen ) {
if( pime->wCount != 0 ) {
pime->fnc = IME_SENDVKEY;
pime->wParam = VK_DBE_DETERMINESTRING;
SendIMEMessageEx( hwndFocus, (LPARAM)hmem );
}
}
pime->fnc = IME_SETOPEN;
pime->wParam = !fOpen;
SendIMEMessageEx( hwndFocus, (LPARAM)hmem );
if( afConfig & FLAG_KANA_SWITCH ) {
SwitchKanaMode( hwndFocus, fOpen + 1 );
}
GlobalUnlock( hmem );
GlobalFree( hmem );
}
}
static BOOL fDelay;
void CALLBACK KeyUpTimerProc( HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime ) {
KillTimer( NULL, idTimerKeyUp );
idTimerKeyUp = 0;
PostMessage( hwndKeyRepeat, WM_KEYUP, wParamRepeat, 0xC0000001L );
}
void CALLBACK TimerProc( HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime ) {
if( fDelay ) {
fDelay = FALSE;
KillTimer( NULL, idTimer );
idTimer = SetTimer( NULL, 0, timeInterval, (TIMERPROC)TimerProc );
} else {
if( fRepeating ) {
if( IsWindow( hwndKeyRepeat )
&& (GetKeyState( wParamRepeat ) & 0x8000) != 0 ) {
PostMessage( hwndKeyRepeat, WM_KEYDOWN, wParamRepeat, lParamRepeat );
}
}
}
}
LRESULT CALLBACK JournalRecordProc( int nCode, WPARAM wParam, LPARAM lParam ) {
IMESTRUCT FAR* pime;
HANDLE hmem;
HWND hwndFocus;
static BYTE bKanaPrev;
if( nCode == HC_ACTION ) {
if( ((EVENTMSG*)lParam)->message == WM_KEYDOWN ) {
UINT param1 = ((EVENTMSG*)lParam)->paramL & 0xFF;
UINT param2 = ((EVENTMSG*)lParam)->paramH;
if( (afConfig & FLAG_REPEAT_HOOK) != 0 ) {
if( param1 >= 0x25 && param1 <= 0x28 ) {
if( !fRepeating ) {
hwndKeyRepeat = GetFocus();
if( hwndKeyRepeat != NULL ) {
fRepeating = TRUE;
wParamRepeat = param1;
lParamRepeat = 0x40000001L;
fDelay = TRUE;
idTimer = SetTimer( NULL, 0, timeDelay - timeInterval, (TIMERPROC)TimerProc );
// hThread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)KeyRepeatThread
// , NULL, 0, &idThread );
}
}
} else {
if( fRepeating ) {
KillTimer( NULL, idTimer );
if( idTimerKeyUp == 0 ) {
idTimerKeyUp = SetTimer( NULL, 0, 100, (TIMERPROC)KeyUpTimerProc );
}
// TerminateThread( hThread, 0 );
fRepeating = FALSE;
}
}
}
if( param1 == 0x11 && param2 == 0x8000 ) {
// 右Ctrlキー
if( (afConfig & FLAG_RIGHTCTRL_HOOK) != 0 ) {
SwitchKanaMode( GetFocus2(), 0 );
}
} else if( param1 == 0xF1 || param1 == 0xF2 ) {
// ひらがな/カタカナキー
if( (afConfig & FLAG_HIRAGANA_HOOK) != 0 ) {
SwitchIME();
}
} else if( param1 == 0xF3 || param1 == 0xF4 ) {
// 半角/全角
if( (afConfig & FLAG_HANKAKU_HOOK) != 0 ) {
if( (GetKeyState( VK_CONTROL ) & 0x8000) != 0 ) {
PostMessage( GetActiveWindow(), WM_SYSCOMMAND, SC_TASKLIST, 0L );
} else {
hwndFocus = GetFocus2();
hmem = GlobalAlloc( GMEM_SHARE | GMEM_MOVEABLE, sizeof(IMESTRUCT) );
pime = (IMESTRUCT FAR*)GlobalLock( hmem );
pime->fnc = IME_GETOPEN;
if( SendIMEMessageEx( hwndFocus, (LPARAM)hmem ) == 0
|| pime->wCount == 0 ) {
PostMessage( hwndFocus, WM_KEYDOWN, VK_ESCAPE, 0x00010001L );
PostMessage( hwndFocus, WM_KEYUP, VK_ESCAPE, 0x80010001L );
} else {
pime->fnc = IME_SENDVKEY;
pime->wParam = VK_DBE_FLUSHSTRING;
SendIMEMessageEx( hwndFocus, (LPARAM)hmem );
}
GlobalUnlock( hmem );
GlobalFree( hmem );
}
}
} else if( param1 == 0x1C ) {
if( (afConfig & FLAG_HENKAN_HOOK) != 0 ) {
BOOL fOpen;
hwndFocus = GetFocus2();
if( GetKeyState( VK_MENU ) & 0x8000 ) {
PostMessage( hwndFocus, WM_SYSCHAR, ' ', 0x20390001L );
} else {
WORD wCount;
hmem = GlobalAlloc( GMEM_SHARE | GMEM_MOVEABLE, sizeof(IMESTRUCT) );
pime = (IMESTRUCT FAR*)GlobalLock( hmem );
pime->fnc = IME_GETOPEN;
fOpen = (BOOL)SendIMEMessageEx( hwndFocus, (LPARAM)hmem );
wCount = pime->wCount;
GlobalUnlock( hmem );
GlobalFree( hmem );
if( fOpen ) {
IMEPRO imepro;
if( wCount != 0 ) {
return CallNextHookEx( hhook, nCode, wParam, lParam);
}
IMPGetIME( NULL, &imepro );
SendMessage( imepro.hWnd, WM_CHAR, ' ', 1L );
} else {
PostMessage( hwndFocus, WM_KEYDOWN, VK_SPACE, 0x00390001L );
PostMessage( hwndFocus, WM_KEYUP, VK_SPACE, 0x80390001L );
}
}
}
} else if( param1 == 0x1D ) {
// 無変換キー
if( (afConfig & FLAG_MUHENKAN_HOOK) != 0 ) {
SwitchKanaMode( GetFocus2(), 0 );
}
} else if( param1 == 0xF0 ) {
// 英数キー
if( (afConfig & FLAG_EISUU_KANAOFF) != 0 ) {
SwitchKanaMode( GetFocus2(), 2 );
}
if( (afConfig & FLAG_EISUU_HOOK) != 0 ) {
hwndFocus = GetFocus2();
GetKeyboardState( ab );
ab[ VK_CAPITAL ] ^= 1;
SetKeyboardState( ab );
if( hwndFocus != NULL ) {
PostMessage( hwndFocus, WM_KEYDOWN, VK_CAPITAL, 0x803A0001L );
PostMessage( hwndFocus, WM_KEYUP, VK_CAPITAL, 0x003A0001L );
}
}
}
} else if( ((EVENTMSG*)lParam)->message == WM_KEYUP
&& (afConfig & FLAG_REPEAT_HOOK) != 0 ) {
if( fRepeating ) {
KillTimer( NULL, idTimer );
if( idTimerKeyUp == 0 ) {
idTimerKeyUp = SetTimer( NULL, 0, 100, (TIMERPROC)KeyUpTimerProc );
}
// TerminateThread( hThread, 0 );
fRepeating = FALSE;
}
}
}
return CallNextHookEx( hhook, nCode, wParam, lParam);
}
LRESULT GetMsgProc( int nCode, WPARAM param1, LPARAM param2 ) {
HWND hwndFocus;
static BYTE bKanaPrev;
if( nCode == HC_ACTION ) {
WPARAM wParam = ((MSG*)param2)->wParam;
LPARAM lParam = ((MSG*)param2)->lParam;
if( ((MSG*)param2)->message == WM_KEYDOWN
|| ((MSG*)param2)->message == WM_SYSKEYDOWN ) {
if( (afConfig & FLAG_REPEAT_HOOK) != 0 ) {
if( wParam >= 0x25 && wParam <= 0x28 ) {
if( !fRepeating ) {
hwndKeyRepeat = GetFocus();
if( hwndKeyRepeat != NULL ) {
fRepeating = TRUE;
wParamRepeat = wParam;
lParamRepeat = 0x40000001L;
fDelay = TRUE;
idTimer = SetTimer( NULL, 0, timeDelay - timeInterval, (TIMERPROC)TimerProc );
}
}
} else {
if( fRepeating ) {
KillTimer( NULL, idTimer );
if( idTimerKeyUp == 0 ) {
idTimerKeyUp = SetTimer( NULL, 0, 100, (TIMERPROC)KeyUpTimerProc );
}
fRepeating = FALSE;
}
}
}
if( wParam == 0xF0 ) {
// 英数キー
if( (afConfig & FLAG_EISUU_KANAOFF) != 0 ) {
SwitchKanaMode( GetFocus2(), 2 );
}
if( (afConfig & FLAG_EISUU_HOOK) != 0 ) {
hwndFocus = GetFocus2();
GetKeyboardState( ab );
ab[ VK_CAPITAL ] ^= 1;
SetKeyboardState( ab );
if( hwndFocus != NULL ) {
PostMessage( hwndFocus, WM_KEYDOWN, VK_CAPITAL, 0x803A0001L );
PostMessage( hwndFocus, WM_KEYUP, VK_CAPITAL, 0x003A0001L );
}
}
}
} else if( ( ((MSG*)param2)->message == WM_KEYUP || ((MSG*)param2)->message == WM_SYSKEYUP)
&& (afConfig & FLAG_REPEAT_HOOK) != 0 ) {
if( fRepeating ) {
KillTimer( NULL, idTimer );
if( idTimerKeyUp == 0 ) {
idTimerKeyUp = SetTimer( NULL, 0, 100, (TIMERPROC)KeyUpTimerProc );
}
fRepeating = FALSE;
}
}
}
return CallNextHookEx( hhook, nCode, param1, param2 );
}
void SetHook( HWND hwnd ) {
hwndClient = hwnd;
GetKeyboardState( (BYTE FAR*)ab );
bKana = ab[VK_KANA];
if( afConfig & FLAG_JOURNAL_HOOK ) {
hhook = SetWindowsHookEx( WH_JOURNALRECORD, (HOOKPROC)JournalRecordProc, hInstDLL, 0L );
} else {
hhook = SetWindowsHookEx( WH_GETMESSAGE, (HOOKPROC)GetMsgProc, hInstDLL, 0L );
}
}
void ReleaseHook( void ) {
UnhookWindowsHookEx( hhook );
}