Răsfoiți Sursa

check if key is up before sending key up command. This was causing problems if an app is listening to global key up commands

git-svn-id: svn://svn.code.sf.net/p/ditto-cp/code/trunk@443 595ec19a-5cb4-439b-94a8-42fb3063c22c
sabrogden 17 ani în urmă
părinte
comite
a767b2129c
2 a modificat fișierele cu 16 adăugiri și 53 ștergeri
  1. 14 53
      CP_Main.cpp
  2. 2 0
      CP_Main.h

+ 14 - 53
CP_Main.cpp

@@ -436,22 +436,7 @@ bool CCP_MainApp::ReleaseFocus()
 // sends Ctrl-V to the TargetWnd
 void CCP_MainApp::SendPaste(bool bActivateTarget)
 {
-	char ch;
-
-	//Make sure all the keys are up
-	for(ch = '0'; ch <= '9'; ch++)
-	{
-		keybd_event(ch, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
-	}
-
-	for(ch = 'A'; ch <= 'Z'; ch++)
-	{
-		keybd_event(ch, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
-	}
-	keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
-	keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
-	keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
-	keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
+	AllKeysUp();
 
 	Sleep(50);
 
@@ -471,30 +456,25 @@ void CCP_MainApp::SendPaste(bool bActivateTarget)
 	Log(csMessage);
 
 	CSendKeys send;
-	//CString cs("^v");
-	//CString cs("%e{DELAY=50}p");
 	send.SendKeys(csPasteString);
 }
 
-// sends Ctrl-V to the TargetWnd
-void CCP_MainApp::SendCopy()
+void CCP_MainApp::AllKeysUp()
 {
-	char ch;
-
-	//Make sure all the keys are up
-	for(ch = '0'; ch <= '9'; ch++)
+	for(int key = 0; key < 256; key++)
 	{
-		keybd_event(ch, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
+		//If the key is pressed, send a key up, having other keys down interferes with sending ctrl-v, -c and -x
+		if(GetKeyState(key) & 0x8000)
+		{
+			keybd_event(key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
+		}
 	}
+}
 
-	for(ch = 'A'; ch <= 'Z'; ch++)
-	{
-		keybd_event(ch, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
-	}
-	keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
-	keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
-	keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
-	keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
+// sends Ctrl-V to the TargetWnd
+void CCP_MainApp::SendCopy()
+{
+	AllKeysUp();
 
 	Sleep(50);
 
@@ -508,29 +488,13 @@ void CCP_MainApp::SendCopy()
 	Log(csMessage);
 
 	CSendKeys send;
-	//CString cs("^c");
 	send.SendKeys(csString);
 }
 
 // sends Ctrl-X to the TargetWnd
 void CCP_MainApp::SendCut()
 {
-	char ch;
-
-	//Make sure all the keys are up
-	for(ch = '0'; ch <= '9'; ch++)
-	{
-		keybd_event(ch, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
-	}
-
-	for(ch = 'A'; ch <= 'Z'; ch++)
-	{
-		keybd_event(ch, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
-	}
-	keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
-	keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
-	keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
-	keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
+	AllKeysUp();
 
 	Sleep(50);
 
@@ -544,12 +508,9 @@ void CCP_MainApp::SendCut()
 	Log(csMessage);
 
 	CSendKeys send;
-	//CString cs("^x");
 	send.SendKeys(csString);
 }
 
-// CopyThread
-
 void CCP_MainApp::StartCopyThread()
 {
 	ASSERT( m_MainhWnd );

+ 2 - 0
CP_Main.h

@@ -132,6 +132,8 @@ public:
 	void IC_Copy(ARRAY* pIDs = NULL); // if NULL, this uses the current QPaste selection
 	void IC_Paste();
 
+	void AllKeysUp();
+
 // Groups
 	long		m_GroupDefaultID; // new clips are saved to this group
 	long		m_GroupID;        // current group