|
@@ -10,6 +10,10 @@ typedef struct AsyncOp{
|
|
int asyncInfo;
|
|
int asyncInfo;
|
|
}AsyncOp;
|
|
}AsyncOp;
|
|
|
|
|
|
|
|
+// track shift key state because Windows doesn't report events when the two shift
|
|
|
|
+// keys are being pressed at the same time, and then one released.
|
|
|
|
+static int shiftKeyState[2];
|
|
|
|
+
|
|
static int _usew;
|
|
static int _usew;
|
|
|
|
|
|
static HHOOK msghook;
|
|
static HHOOK msghook;
|
|
@@ -129,11 +133,31 @@ void bbSystemEmitOSEvent( HWND hwnd,UINT msg,WPARAM wp,LPARAM lp,BBObject *sourc
|
|
if( wp<1 || wp>255 ) return;
|
|
if( wp<1 || wp>255 ) return;
|
|
id=( lp & 0x40000000 ) ? BBEVENT_KEYREPEAT : BBEVENT_KEYDOWN;
|
|
id=( lp & 0x40000000 ) ? BBEVENT_KEYREPEAT : BBEVENT_KEYDOWN;
|
|
data=keyCode( wp,lp );
|
|
data=keyCode( wp,lp );
|
|
|
|
+
|
|
|
|
+ switch(data) {
|
|
|
|
+ case VK_LSHIFT:
|
|
|
|
+ shiftKeyState[0] = 1;
|
|
|
|
+ break;
|
|
|
|
+ case VK_RSHIFT:
|
|
|
|
+ shiftKeyState[1] = 1;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
break;
|
|
break;
|
|
case WM_KEYUP:case WM_SYSKEYUP:
|
|
case WM_KEYUP:case WM_SYSKEYUP:
|
|
if( wp<1 || wp>255 ) return;
|
|
if( wp<1 || wp>255 ) return;
|
|
id=BBEVENT_KEYUP;
|
|
id=BBEVENT_KEYUP;
|
|
data=keyCode( wp,lp );
|
|
data=keyCode( wp,lp );
|
|
|
|
+
|
|
|
|
+ switch(data) {
|
|
|
|
+ case VK_LSHIFT:
|
|
|
|
+ shiftKeyState[0] = 0;
|
|
|
|
+ break;
|
|
|
|
+ case VK_RSHIFT:
|
|
|
|
+ shiftKeyState[1] = 0;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
break;
|
|
break;
|
|
case WM_CHAR:case WM_SYSCHAR:
|
|
case WM_CHAR:case WM_SYSCHAR:
|
|
id=BBEVENT_KEYCHAR;
|
|
id=BBEVENT_KEYCHAR;
|
|
@@ -256,6 +280,17 @@ void bbSystemPoll(){
|
|
TranslateMessage( &msg );
|
|
TranslateMessage( &msg );
|
|
DispatchMessage( &msg );
|
|
DispatchMessage( &msg );
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ // test shift keys current state
|
|
|
|
+ if (shiftKeyState[0] && !(GetKeyState(VK_LSHIFT) & 0x8000)) {
|
|
|
|
+ shiftKeyState[0] = 0;
|
|
|
|
+ bbSystemEmitEvent( BBEVENT_KEYUP,&bbNullObject,VK_LSHIFT,mods,0,0,&bbNullObject );
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (shiftKeyState[1] && !(GetKeyState(VK_RSHIFT) & 0x8000)) {
|
|
|
|
+ shiftKeyState[1] = 0;
|
|
|
|
+ bbSystemEmitEvent( BBEVENT_KEYUP,&bbNullObject,VK_RSHIFT,mods,0,0,&bbNullObject );
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
void bbSystemWait(){
|
|
void bbSystemWait(){
|