<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://karaoke.kjams.com/w/index.php?action=history&amp;feed=atom&amp;title=Blog%2FParallels%2FSolution</id>
	<title>Blog/Parallels/Solution - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://karaoke.kjams.com/w/index.php?action=history&amp;feed=atom&amp;title=Blog%2FParallels%2FSolution"/>
	<link rel="alternate" type="text/html" href="https://karaoke.kjams.com/w/index.php?title=Blog/Parallels/Solution&amp;action=history"/>
	<updated>2026-06-09T16:34:30Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://karaoke.kjams.com/w/index.php?title=Blog/Parallels/Solution&amp;diff=9471&amp;oldid=prev</id>
		<title>Dave: Created page with &quot;&lt;pre&gt; #if OPT_WINOS &amp;&amp; defined(kDEBUG) static HWND			s_prevChainH = NULL; wchar_t				s_invisibleWindClass[] = L&quot;invisible&quot;;  namespace yaaf { 	extern HINSTANCE	_GInstance;				...&quot;</title>
		<link rel="alternate" type="text/html" href="https://karaoke.kjams.com/w/index.php?title=Blog/Parallels/Solution&amp;diff=9471&amp;oldid=prev"/>
		<updated>2014-02-24T20:06:05Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;pre&amp;gt; #if OPT_WINOS &amp;amp;&amp;amp; defined(kDEBUG) static HWND			s_prevChainH = NULL; wchar_t				s_invisibleWindClass[] = L&amp;quot;invisible&amp;quot;;  namespace yaaf { 	extern HINSTANCE	_GInstance;				...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#if OPT_WINOS &amp;amp;&amp;amp; defined(kDEBUG)&lt;br /&gt;
static HWND			s_prevChainH = NULL;&lt;br /&gt;
wchar_t				s_invisibleWindClass[] = L&amp;quot;invisible&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
namespace yaaf {&lt;br /&gt;
	extern HINSTANCE	_GInstance;				// instance pointer&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
static LRESULT CALLBACK InvisibleWindowProc(HWND w, UINT msg, WPARAM wp, LPARAM lp)&lt;br /&gt;
{&lt;br /&gt;
	return ::DefWindowProc(w,msg,wp,lp);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void	RegisterInvisibleWindow()&lt;br /&gt;
{&lt;br /&gt;
	WNDCLASSW wc;&lt;br /&gt;
&lt;br /&gt;
	wc.style = 0;&lt;br /&gt;
	wc.lpfnWndProc = InvisibleWindowProc;&lt;br /&gt;
	wc.cbClsExtra = 0;&lt;br /&gt;
	wc.cbWndExtra = 0;&lt;br /&gt;
	wc.hInstance = yaaf::_GInstance;&lt;br /&gt;
	wc.hIcon = NULL;&lt;br /&gt;
	wc.hCursor = NULL;&lt;br /&gt;
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);&lt;br /&gt;
	wc.lpszMenuName = NULL;&lt;br /&gt;
	wc.lpszClassName = s_invisibleWindClass;&lt;br /&gt;
&lt;br /&gt;
	ATOM		resultI = RegisterClassW(&amp;amp;wc);&lt;br /&gt;
&lt;br /&gt;
	CF_ASSERT(resultI);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static HWND		CreateInvisibleWindow()&lt;br /&gt;
{&lt;br /&gt;
	RegisterInvisibleWindow();&lt;br /&gt;
&lt;br /&gt;
	HWND	wndH = ::CreateWindowExW(&lt;br /&gt;
		WS_EX_DLGMODALFRAME,&lt;br /&gt;
		s_invisibleWindClass,&lt;br /&gt;
		_T(&amp;quot;temp&amp;quot;),&lt;br /&gt;
		WS_POPUP,&lt;br /&gt;
		0, 0,&lt;br /&gt;
		1, 1,&lt;br /&gt;
		NULL,&lt;br /&gt;
		NULL,&lt;br /&gt;
		yaaf::_GInstance,&lt;br /&gt;
		NULL);&lt;br /&gt;
	&lt;br /&gt;
	if (wndH == NULL) {&lt;br /&gt;
		HRESULT		lastErr = GetLastError();&lt;br /&gt;
&lt;br /&gt;
		CF_ASSERT(0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return wndH;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CALLBACK	EnumWindowsProc(HWND hWnd, LPARAM lParam)&lt;br /&gt;
{&lt;br /&gt;
	WCharVec		classCharVec(256);&lt;br /&gt;
	&lt;br /&gt;
	if (::GetClassName(hWnd, &amp;amp;classCharVec[0], classCharVec.size())) {&lt;br /&gt;
		SStringSet&amp;amp;		stringSet(*reinterpret_cast&amp;lt;SStringSet *&amp;gt;(lParam));&lt;br /&gt;
		SuperString		classStr(classCharVec);&lt;br /&gt;
		&lt;br /&gt;
		stringSet.insert(classStr);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#define		kLogClassNames		0&lt;br /&gt;
&lt;br /&gt;
SuperString		Get_QTIdle_ClassName()&lt;br /&gt;
{&lt;br /&gt;
	SuperString		className;&lt;br /&gt;
	SStringSet		classSet;&lt;br /&gt;
	&lt;br /&gt;
	::EnumWindows(&lt;br /&gt;
		EnumWindowsProc,&lt;br /&gt;
		reinterpret_cast&amp;lt;LPARAM&amp;gt;(&amp;amp;classSet));&lt;br /&gt;
	&lt;br /&gt;
	#if kLogClassNames&lt;br /&gt;
		::OutputDebugString(SuperString(&amp;quot;Classes BEGIN ------------&amp;quot;).w_str());&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	BOOST_FOREACH(SuperString&amp;amp; str, classSet) {&lt;br /&gt;
		if (str.StartsWith(&amp;quot;QTIdle&amp;quot;)) {&lt;br /&gt;
			className = str;&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		#if kLogClassNames&lt;br /&gt;
			str.append(&amp;#039;\r&amp;#039;);&lt;br /&gt;
			::OutputDebugString(str.w_str());&lt;br /&gt;
		#endif&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	#if kLogClassNames&lt;br /&gt;
		::OutputDebugString(SuperString(&amp;quot;Classes END --------------&amp;quot;).w_str());&lt;br /&gt;
	#endif&lt;br /&gt;
	&lt;br /&gt;
	return className;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
void		QuickTime_SavePreviousCliboardChain()&lt;br /&gt;
{&lt;br /&gt;
	#if OPT_WINOS &amp;amp;&amp;amp; defined(kDEBUG)&lt;br /&gt;
	HWND		wndH = CreateInvisibleWindow();&lt;br /&gt;
&lt;br /&gt;
	if (wndH) {&lt;br /&gt;
		s_prevChainH = ::SetClipboardViewer(wndH);&lt;br /&gt;
		&lt;br /&gt;
		CF_ASSERT(s_prevChainH);&lt;br /&gt;
		CF_ASSERT(ChangeClipboardChain(wndH, s_prevChainH));&lt;br /&gt;
		::DestroyWindow(wndH);&lt;br /&gt;
	}&lt;br /&gt;
	#endif&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
void		QuickTime_RestorePreviousCliboardChain()&lt;br /&gt;
{&lt;br /&gt;
	#if OPT_WINOS &amp;amp;&amp;amp; defined(kDEBUG)&lt;br /&gt;
	if (s_prevChainH) {&lt;br /&gt;
		SuperString		idleClassStr(Get_QTIdle_ClassName());&lt;br /&gt;
		&lt;br /&gt;
		if (!idleClassStr.empty()) {&lt;br /&gt;
			HWND			qtIdleWindowH = ::FindWindow(idleClassStr.w_str(), NULL);&lt;br /&gt;
			&lt;br /&gt;
			CF_ASSERT(qtIdleWindowH);&lt;br /&gt;
&lt;br /&gt;
			if (qtIdleWindowH) {&lt;br /&gt;
				CF_ASSERT(ChangeClipboardChain(qtIdleWindowH, s_prevChainH));&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void			QuickTime_Unload()&lt;br /&gt;
{&lt;br /&gt;
	TerminateQTML();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool			QuickTime_Load(OSErr *errP0)&lt;br /&gt;
{&lt;br /&gt;
	static bool		s_availB = true;&lt;br /&gt;
&lt;br /&gt;
	#if OPT_WINOS&lt;br /&gt;
		static OSErr	s_qtErr = noErr;&lt;br /&gt;
		static bool		s_askedB = false;&lt;br /&gt;
&lt;br /&gt;
		if (!s_askedB) {&lt;br /&gt;
			QuickTime_SavePreviousCliboardChain();&lt;br /&gt;
		&lt;br /&gt;
			if (QTLoadLibrary(&amp;quot;QTCF.dll&amp;quot;) == NULL) {&lt;br /&gt;
				s_qtErr = qtmlDllLoadErr;&lt;br /&gt;
			} else {&lt;br /&gt;
				s_qtErr = InitializeQTML(0);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			QuickTime_RestorePreviousCliboardChain();&lt;br /&gt;
&lt;br /&gt;
			s_askedB = true;&lt;br /&gt;
			if (s_qtErr) {&lt;br /&gt;
				LogErr(&amp;quot;$$$ Loading Quicktime Failed&amp;quot;, s_qtErr);&lt;br /&gt;
				s_availB = false;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (errP0) {&lt;br /&gt;
			*errP0 = s_qtErr;&lt;br /&gt;
		}&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	return s_availB;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
	</entry>
</feed>