clean:remove win32 mouse over function.

this function only work on windows and text .

can be replace with ocr(with the help of Capture2Text etc.).
This commit is contained in:
xiaoyifang 2022-02-25 07:55:32 +08:00
parent d341a64569
commit b7b347ec0e
6 changed files with 4 additions and 402 deletions

View file

@ -268,7 +268,6 @@ HEADERS += folding.hh \
wordfinder.hh \ wordfinder.hh \
groupcombobox.hh \ groupcombobox.hh \
keyboardstate.hh \ keyboardstate.hh \
mouseover.hh \
preferences.hh \ preferences.hh \
mutex.hh \ mutex.hh \
mediawiki.hh \ mediawiki.hh \
@ -404,7 +403,6 @@ SOURCES += folding.cc \
wordfinder.cc \ wordfinder.cc \
groupcombobox.cc \ groupcombobox.cc \
keyboardstate.cc \ keyboardstate.cc \
mouseover.cc \
preferences.cc \ preferences.cc \
mutex.cc \ mutex.cc \
mediawiki.cc \ mediawiki.cc \
@ -483,13 +481,11 @@ win32 {
FORMS += texttospeechsource.ui FORMS += texttospeechsource.ui
SOURCES += wordbyauto.cc \ SOURCES += wordbyauto.cc \
guids.c \ guids.c \
x64.cc \
speechclient_win.cc \ speechclient_win.cc \
texttospeechsource.cc \ texttospeechsource.cc \
speechhlp.cc speechhlp.cc
HEADERS += wordbyauto.hh \ HEADERS += wordbyauto.hh \
uiauto.hh \ uiauto.hh \
x64.hh \
texttospeechsource.hh \ texttospeechsource.hh \
sapi.hh \ sapi.hh \
sphelper.hh \ sphelper.hh \

View file

@ -1,239 +0,0 @@
#include "mouseover.hh"
#include "utf8.hh"
#include <QCoreApplication>
#include <QDir>
#include <algorithm>
#ifdef Q_OS_WIN32
#undef WINVER
#define WINVER 0x0500
#include <sddl.h>
#include <accctrl.h>
#include <aclapi.h>
#include "wordbyauto.hh"
#include "x64.hh"
#endif
MouseOver & MouseOver::instance()
{
static MouseOver m;
return m;
}
#ifdef Q_OS_WIN32
const UINT WM_MY_SHOW_TRANSLATION = WM_USER + 301;
static wchar_t className[] = L"GoldenDictMouseover";
typedef BOOL ( WINAPI *ChangeWindowMessageFilterFunc )( UINT, DWORD );
#ifndef _MSC_VER
typedef struct tagCHANGEFILTERSTRUCT {
DWORD cbSize;
DWORD ExtStatus;
} CHANGEFILTERSTRUCT, *PCHANGEFILTERSTRUCT;
#endif
typedef BOOL ( WINAPI *ChangeWindowMessageFilterExFunc )( HWND, UINT, DWORD, PCHANGEFILTERSTRUCT );
#endif // Q_OS_WIN32
#ifdef Q_OS_WIN32
#ifndef ConvertStringSecurityDescriptorToSecurityDescriptor
extern "C" BOOL WINAPI ConvertStringSecurityDescriptorToSecurityDescriptorW(
LPCWSTR StringSecurityDescriptor,
DWORD StringSDRevision,
PSECURITY_DESCRIPTOR *SecurityDescriptor,
PULONG SecurityDescriptorSize );
#endif
static void SetLowLabelToGDSynchroObjects()
{
// The LABEL_SECURITY_INFORMATION SDDL SACL to be set for low integrity
#define LOW_INTEGRITY_SDDL_SACL_W L"S:(ML;;NW;;;LW)"
// DWORD dwErr = ERROR_SUCCESS;
PSECURITY_DESCRIPTOR pSD = NULL;
PACL pSacl = NULL; // not allocated
BOOL fSaclPresent = FALSE;
BOOL fSaclDefaulted = FALSE;
#ifdef Q_OS_WIN64
LPCWSTR pwszMapFileName64 = L"GoldenDictTextOutHookSharedMem64";
#endif
LPCWSTR pwszMapFileName = L"GoldenDictTextOutHookSharedMem";
LPCWSTR pwszSpyMutexName = L"GoldenDictTextOutSpyMutex";
if( ConvertStringSecurityDescriptorToSecurityDescriptorW( LOW_INTEGRITY_SDDL_SACL_W, 1 /* SDDL_REVISION_1 */, &pSD, NULL ) )
{
if( GetSecurityDescriptorSacl(pSD, &fSaclPresent, &pSacl, &fSaclDefaulted))
{
// Note that psidOwner, psidGroup, and pDacl are
// all NULL and set the new LABEL_SECURITY_INFORMATION
#ifdef Q_OS_WIN64
/* dwErr = */ SetNamedSecurityInfoW( (LPWSTR)pwszMapFileName64,
SE_KERNEL_OBJECT, LABEL_SECURITY_INFORMATION, NULL, NULL, NULL, pSacl);
#endif
/* dwErr = */ SetNamedSecurityInfoW( (LPWSTR)pwszMapFileName,
SE_KERNEL_OBJECT, LABEL_SECURITY_INFORMATION, NULL, NULL, NULL, pSacl);
/* dwErr = */ SetNamedSecurityInfoW( (LPWSTR)pwszSpyMutexName,
SE_KERNEL_OBJECT, LABEL_SECURITY_INFORMATION, NULL, NULL, NULL, pSacl);
}
LocalFree(pSD);
}
}
#endif // Q_OS_WIN32
MouseOver::MouseOver() :
pPref(NULL)
{
}
void MouseOver::enableMouseOver()
{
#ifdef Q_OS_WIN32
if ( !mouseOverEnabled && activateSpyFn )
{
activateSpyFn( true );
installx64Hooks();
mouseOverEnabled = true;
}
#endif
}
void MouseOver::disableMouseOver()
{
#ifdef Q_OS_WIN32
if ( mouseOverEnabled && activateSpyFn )
{
activateSpyFn( false );
removex64Hooks();
mouseOverEnabled = false;
}
#endif
}
#ifdef Q_OS_WIN32
LRESULT MouseOver::makeScanBitMask()
{
LRESULT res = 0;
if( pPref == NULL )
return 0;
return res;
}
LRESULT CALLBACK MouseOver::eventHandler( HWND hwnd_, UINT msg,
WPARAM wparam, LPARAM lparam )
{
if ( msg == WM_MY_SHOW_TRANSLATION )
{
LRESULT res = instance().makeScanBitMask();
if( res == 0 )
return 0; // Don't handle word without necessity
if( wparam != 0) //Ask for methods of word retrieving
return res;
int wordSeqPos = 0;
QString wordSeq;
// Now locate the word inside the sequence
QString word;
if ( wordSeq[ wordSeqPos ].isSpace() )
{
// Currently we ignore such cases
return 0;
}
else
if ( !wordSeq[ wordSeqPos ].isLetterOrNumber() )
{
// Special case: the cursor points to something which doesn't look like a
// middle of the word -- assume that it's something that joins two words
// together.
int begin = wordSeqPos;
for( ; begin; --begin )
if ( !wordSeq[ begin - 1 ].isLetterOrNumber() )
break;
int end = wordSeqPos;
while( ++end < wordSeq.size() )
if ( !wordSeq[ end ].isLetterOrNumber() )
break;
if ( end - begin == 1 )
{
// Well, turns out it was just a single non-letter char, discard it
return 0;
}
word = wordSeq.mid( begin, end - begin );
}
else
{
// Cursor points to a letter -- cut the word it points to
int begin = wordSeqPos;
for( ; begin; --begin )
if ( !wordSeq[ begin - 1 ].isLetterOrNumber() )
break;
int end = wordSeqPos;
while( ++end < wordSeq.size() )
{
if ( !wordSeq[ end ].isLetterOrNumber() )
break;
}
word = wordSeq.mid( begin, end - begin );
}
// See if we have an RTL char. Reverse the whole string if we do.
if( lparam == 0 )
{
for( int x = 0; x < word.size(); ++x )
{
QChar::Direction d = word[ x ].direction();
if ( d == QChar::DirR || d == QChar::DirAL ||
d == QChar::DirRLE || d == QChar::DirRLO )
{
std::reverse( word.begin(), word.end() );
break;
}
}
}
bool forcePopup = false;
emit instance().hovered( word, forcePopup );
return 0;
}
return DefWindowProc( hwnd_, msg, wparam, lparam );
}
#endif
MouseOver::~MouseOver()
{
#ifdef Q_OS_WIN32
#endif
}

View file

@ -1,71 +0,0 @@
#ifndef __MOUSEOVER_HH_INCLUDED__
#define __MOUSEOVER_HH_INCLUDED__
#include <QObject>
#include "config.hh"
#include "keyboardstate.hh"
#ifdef Q_OS_WIN32
#include <windows.h>
#endif
/// This is a mouseover feature interface, where you can point your mouse at
/// any word in any window and wait a little, and it would provide that word
/// for the translation.
/// This interface always exists, even on platforms that don't support that
/// feature -- it just remains dormant on them.
///
/// The Windows platform is the only one supported; it works with the help of
/// two external .dll files,
class MouseOver: public QObject, public KeyboardState
{
Q_OBJECT
public:
/// The class is a singleton.
static MouseOver & instance();
/// Enables mouseover. The mouseover is initially disabled.
void enableMouseOver();
/// Disables mouseover.
void disableMouseOver();
/// Set pointer to program configuration
void setPreferencesPtr( Config::Preferences const *ppref ) { pPref = ppref; };
signals:
/// Emitted when there was some text under cursor which was hovered over.
void hovered( QString const &, bool forcePopup );
#ifdef Q_OS_WIN32
/// Ask for source window is GoldenDict window
bool isGoldenDictWindow( HWND hwnd );
#endif
private:
MouseOver();
~MouseOver();
Config::Preferences const *pPref;
#ifdef Q_OS_WIN32
static LRESULT CALLBACK eventHandler( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam );
typedef void ( *ActivateSpyFn )( bool );
ActivateSpyFn activateSpyFn;
HINSTANCE spyDll;
bool mouseOverEnabled;
/// Create mask for scan methods
LRESULT makeScanBitMask();
#endif
};
#endif

View file

@ -15,8 +15,6 @@
#ifdef Q_OS_MAC #ifdef Q_OS_MAC
#include "macmouseover.hh" #include "macmouseover.hh"
#define MouseOver MacMouseOver #define MouseOver MacMouseOver
#else
#include "mouseover.hh"
#endif #endif
using std::wstring; using std::wstring;
@ -279,9 +277,10 @@ ScanPopup::ScanPopup( QWidget * parent,
this, SLOT( clipboardChanged( QClipboard::Mode ) ) ); this, SLOT( clipboardChanged( QClipboard::Mode ) ) );
#endif #endif
#ifdef Q_OS_MAC
connect( &MouseOver::instance(), SIGNAL( hovered( QString const &, bool ) ), connect( &MouseOver::instance(), SIGNAL( hovered( QString const &, bool ) ),
this, SLOT( mouseHovered( QString const &, bool ) ) ); this, SLOT( mouseHovered( QString const &, bool ) ) );
#endif
hideTimer.setSingleShot( true ); hideTimer.setSingleShot( true );
hideTimer.setInterval( 400 ); hideTimer.setInterval( 400 );
@ -305,9 +304,9 @@ ScanPopup::ScanPopup( QWidget * parent,
mouseGrabPollTimer.setInterval( 10 ); mouseGrabPollTimer.setInterval( 10 );
connect( &mouseGrabPollTimer, SIGNAL( timeout() ), connect( &mouseGrabPollTimer, SIGNAL( timeout() ),
this, SLOT(mouseGrabPoll()) ); this, SLOT(mouseGrabPoll()) );
#ifdef Q_OS_MAC
MouseOver::instance().setPreferencesPtr( &( cfg.preferences ) ); MouseOver::instance().setPreferencesPtr( &( cfg.preferences ) );
#endif
ui.goBackButton->setEnabled( false ); ui.goBackButton->setEnabled( false );
ui.goForwardButton->setEnabled( false ); ui.goForwardButton->setEnabled( false );
@ -361,7 +360,6 @@ void ScanPopup::enableScanning()
if ( !isScanningEnabled ) if ( !isScanningEnabled )
{ {
isScanningEnabled = true; isScanningEnabled = true;
MouseOver::instance().enableMouseOver();
} }
} }
@ -369,7 +367,6 @@ void ScanPopup::disableScanning()
{ {
if ( isScanningEnabled ) if ( isScanningEnabled )
{ {
MouseOver::instance().disableMouseOver();
isScanningEnabled = false; isScanningEnabled = false;
} }
} }

73
x64.cc
View file

@ -1,73 +0,0 @@
#include <QCoreApplication>
#include <QDir>
#ifndef _UNICODE
#define _UNICODE
#endif
#include "x64.hh"
#include <windows.h>
#include <tchar.h>
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
PROCESS_INFORMATION pInfo;
#ifndef Q_OS_WIN64
bool isWow64()
{
static LPFN_ISWOW64PROCESS fnIsWow64Process;
BOOL bIsWow64 = FALSE;
if( NULL == fnIsWow64Process )
fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle( _T("kernel32") ), "IsWow64Process" );
if( NULL != fnIsWow64Process )
{
if ( !fnIsWow64Process( GetCurrentProcess(), &bIsWow64 ) )
return false;
}
return bIsWow64;
}
#endif
bool installx64Hooks()
{
STARTUPINFO startup;
#ifndef Q_OS_WIN64
if( !isWow64() )
return false;
#endif
if( pInfo.hProcess != NULL )
removex64Hooks();
QDir dir = QCoreApplication::applicationDirPath();
#ifdef Q_OS_WIN64
if( !dir.cd("x86") )
return false;
QString starterProc = QDir::toNativeSeparators( dir.filePath( "x86helper.exe" ) );
#else
if( !dir.cd("x64") )
return false;
QString starterProc = QDir::toNativeSeparators( dir.filePath( "x64helper.exe" ) );
#endif
memset( &startup, 0, sizeof(startup) );
startup.cb = sizeof(startup);
BOOL b = CreateProcess( starterProc.toStdWString().c_str(), NULL, NULL, NULL, FALSE, CREATE_NO_WINDOW | DETACHED_PROCESS, NULL, NULL, &startup, &pInfo );
if( !b )
pInfo.hProcess = NULL;
return b;
}
void removex64Hooks()
{
if( pInfo.hProcess == NULL )
return;
PostThreadMessage( pInfo.dwThreadId, WM_QUIT, 0, 0 );
DWORD res = WaitForSingleObject( pInfo.hProcess, 3000 );
if( res == WAIT_TIMEOUT )
TerminateProcess( pInfo.hProcess, 1 );
CloseHandle( pInfo.hProcess );
CloseHandle( pInfo.hThread );
pInfo.hProcess = NULL;
}

8
x64.hh
View file

@ -1,8 +0,0 @@
#ifndef __X64_HH_INCLUDED__
#define __X64_HH_INCLUDED__
bool isWow64();
bool installx64Hooks();
void removex64Hooks();
#endif // __X64_HH_INCLUDED__