Position Changer Add-In updated for Windows XP Media Center Edition 2005 Update Rollup 2
Today, the Media Center team released Update Rollup 2 for Windows XP Media Center Edition 2005 (you may have heard of the update referred to previously as "Emerald"). Update Rollup 2 includes a plethora of modifications to improve the stability, reliability, and functionality of Windows XP Media Center Edition 2005. A new SDK to match was also released, available at https://www.microsoft.com/downloads/details.aspx?FamilyId=1D836C29-ABD5-4FDD-90C5-5C5ABAE97DB4&displaylang=en.
One of the problems users of MCE 2005 experience is poorly written add-ins and HTML applications hosted by MCE. In MCE 2005, add-ins are hosted in-process in ehShell.exe (the main MCE application), so when something goes wrong in one of these add-ins, the entire MCE experience can be affected.
To address this reliability issue in Update Rollup 2, MCE has moved to an out-of-process hosting model. When an add-in is run, a new hosting application, ehExtHost.exe, loads the add-in rather than ehShell.exe loading it (take a look in task manager after an add-in loads and you'll see an instance of the application listed). That way, if MCE detects that the add-in is being a bad citizen, it can tear down the whole hosting process. A named pipe remoting channel is used to provide communication between ehShell and the add-in loaded in ehExtHost. Since ehShell previously loaded add-ins into a separate application domain, remoting was already necessary for add-ins to communicate with the hosting code in the primary application domain, so this change for Update Rollup 2 shouldn't affect the functionality of any existing add-ins. Or, at least not those that play by the rules...
As I mentioned in my article Time Travel with Windows XP Media Center, while developing the Position Changer Add-In, I made several assumptions about Media Center and the environment that would be hosting the add-in. Most of these assumptions are still valid for Update Rollup 2 (for example, I had assumed that, while watching a recorded video, the arrow keys served no purpose, and that remains the case in this update). However, if you recall from the article, my add-in uses a keyboard hook in order to intercept and handle certain remote control interactions. The keyboard hook requires that the add-in be running in the same process as the GUI thread handling the keyboard commands issued by the remote. But as I've just outlined, with Update Rollup 2, add-ins are no longer hosted in ehShell, and thus the version of the add-in I posted with my article no longer works once you upgrade to Update Rollup 2. It won't cause anything to crash; rather, the add-in will just fail to load, a message will be written to the event log detailing that the keyboard hook couldn't be installed, and the add-in will exit silently.
Have no fear, though. If you've come to rely on the add-in (as I have), you'll be comforted to know that I've updated the code so that it is compatible with the new version. You can download the source code and installers for both versions here. Just uninstall the version you currently have installed, install the new version, and you should be good to go.
For those of you who are just interested in getting this functionality back, you can stop reading now. For those of you who are interested in the changes I had to make to get this to work, keep reading.
First and foremost, I had to abandon the type of keyboard hook I was using in the previous version. My add-in is now running in a separate process from the thread that I want to hook, and thus I would need to use a global hook. However, if you read Knowledge Base article 318804, you'll discover that global hooks are not supported in the .NET Framework:
Except for the WH_KEYBOARD_LL low-level hook and the WH_MOUSE_LL low-level hook, you cannot implement global hooks in the Microsoft .NET Framework. To install a global hook, a hook must have a native DLL export to inject itself in another process that requires a valid, consistent function to call into. This behavior requires a DLL export. The .NET Framework does not support DLL exports. Managed code has no concept of a consistent value for a function pointer because these function pointers are proxies that are built dynamically."
Ah, but there's a glimmer of hope. The KB article mentions that WH_KEYBOARD_LL can be used to implement global hooks. What is WH_KEYBOARD_LL? From the documentation:
The LowLevelKeyboardProc hook procedure is an application-defined or library-defined callback function used with the SetWindowsHookEx function. The system calls this function every time a new keyboard input event is about to be posted into a thread input queue. The keyboard input can come from the local keyboard driver or from calls to the keybd_event function. If the input comes from a call to keybd_event, the input was "injected". However, the WH_KEYBOARD_LL hook is not injected into another process. Instead, the context switches back to the process that installed the hook and it is called in its original context. Then the context switches back to the application that generated the event."
Perfect! This means that from the hosting process, I can use a low-level keyboard hook instead of a standard keyboard hook to intercept the remote control commands routed to ehShell. Doing so required only minor modifications to my KeyboardHook class, which you can examine by downloading the source code I've made available. There is a downside to this approach, of course. This is now a global hook, which means that every keystroke to be handled by any application on the machine will cause a context switch to the hosting process so that my add-in can determine whether it wants to handle it. To minimize this impact, when the add-in starts up, it retrieves the process ID of ehShell.exe and caches it away. When the hook callback executes to process keyboard input, the handler first checks to see if the process responsible for this input is ehShell (it make an educated guess about what process is responsible by retrieving the ID of the process that owns the current foreground window). If it's not, it immediately returns in order to minimize the amount of time spent processing in the hook (of course, we also only want to handle ehShell input, so this is necessary anyway).
With that change in place, the new version of the add-in is almost fully functional. However, if you attempt to use the bookmarking functionality, you'll find that it is partially broken as it's unable to associate bookmarks with a particular DVR-MS file (if you read the article, you'll remember that this was one of my goals, to be able to set a bookmark per file). The reason for this becomes clear if you look at the event log after attempting to set or jump to a bookmark, as you'll see a message like the following in the log:
Unable to access filter graph for current show. System.Runtime.InteropServices.COMException (0x8001010D): An outgoing call cannot be made since the application is dispatching an input-synchronous call. at System.Runtime.InteropServices.UCOMIRunningObjectTable.GetObject( UCOMIMoniker pmkObjectName, Object& ppunkObject) at Toub.MediaCenter.AddIns.MceGraph.GetGraphForProcess(Int32 pid) at Toub.MediaCenter.AddIns.MceGraph.GetCurrentMediaInfo(Int32 pid)
In order to figure out the current DVR-MS file, I access the running object table (ROT) in order to get at the current playback filter graph used by MCE. This allows me to iterate through the filters in the graph looking for the source filter that will reveal to me the path to the current DVR-MS. In order to retrieve a filter graph from the ROT, I need to make a call to the ROT's GetObject method. However, this is a call on a COM component. A quick look at Knowledge Base article 131056 reveals the following:
A synchronous OLE call made by the recipient of an inter-process/ inter-thread SendMessage fails with RPC_E_CANTCALLOUT_ININPUTSYNCCALL(0x8001010D).
It explains why if you're interested in the nitty gritty. A slightly more relevant explanation is available from Knowledge Base article 198996:
COM does not allow normal outgoing COM method calls from a thread that is currently servicing a SendMessage request.
And another look at the documentation for LowLevelKeyboardProc reveals this:
This hook is called in the context of the thread that installed it. The call is made by sending a message to the thread that installed the hook. Therefore, the thread that installed the hook must have a message loop.
Aha. "The call is made by sending a message". Thus, our hook callback is the result a message being sent. Our hook then attempts to make a normal outbound COM call from the same thread. And boom: RPC_E_CANTCALLOUT_ININPUTSYNCCALL.
To get around this, I simply do the work to access the filter graph on a separate thread. And with that, Position Changer Add-In should work just like it did prior to Update Rollup 2. The only thing you might notice is a slightly sluggish response to keystrokes, as each one requires that the hosting process handle it.
I hope you enjoy it.
-Steve
Comments
Anonymous
October 15, 2005
I installed your new update for Rollup 2 after upgrading and deinstalling the old one and noticed an odd behavior.
When viewing live or recorded TV and pressing the details button, I couldn't navigate the pop-up menu, which is practical to change the zoom level. Instead, the down and up arrows on the remote would backstep and frontstep through the episode.
When I deinstalled Position Changer, the behavior went back to normal.Anonymous
October 15, 2005
Hi Jerome-
As I mention in the article, I'm doing something highly unorthodox in this add-in, hijacking the arrow keys while full-screen video is displayed. Most of the time this doesn't cause a problem, but if a pop-up menu is displayed over the video such thatup/down navigation is required, yes, it will be an issue. As far as I'm aware, there is no way I can programmatically detect whether a popup menu is currently being displayed. Thus, if this is a scenario you encounter frequently, you can disable bookmarking in the add-in but keep the rest of its functionality (rather than uninstall the whole thing). In the article I detail all of the configuration options I've built into the add-in, but in short, you can simply set the SupportBookmarking value in the HKLMSoftwareToubPositionChangerAddIn registry key to 0, and the up/down arrows will not be intercepted by the add-in (this change will not take effect until ehShell is restarted).
Of course, as I've provided the full source for the add-in, you can also tweak it to your liking, possibly utilizing other input keys for the bookmarking functionality.
-StephenAnonymous
October 16, 2005
Thanks, I'll try that.Anonymous
October 17, 2005
The comment has been removedAnonymous
October 17, 2005
Hi Oscar-
I believe the RegisterAddIn.dll I'm using from the old SDK has an issue with correctly determining the version of some non-English versions of MCE 2005. What's your locale? I'm told that the new SDK might have an updated version of this DLL that would fix the problem, but I haven't tried it yet. Regardless, it's an installation issue rather than an actual add-in issue. When I get some free time over the next week or two, I'll see if I can resolve this for you.
-StephenAnonymous
October 17, 2005
The comment has been removedAnonymous
November 09, 2005
Hi, great app, I think I discovered a bug.
It happens when there is two active instances of ehShell.exe, e.g: One in a MCX device and another in a the main desktop.
The code to get the ehShell.exe may get the wrong process.
Here is some code to fix it:
public static Process GetEhShellProcess()
{
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("ehshell");
string userName = Environment.UserDomainName + "" + Environment.UserName;
foreach(System.Diagnostics.Process process in processes)
{
WindowsIdentity processIdent=NativeMethods.GetProcessOwner(process);
if ( processIdent!=null && String.Compare(userName,processIdent.Name,true)==0)
{
return process;
}
}
throw new InvalidOperationException("Cannot find ehShell.exe process for user: " + userName);
}
public static WindowsIdentity GetProcessOwner(System.Diagnostics.Process process)
{
IntPtr token = IntPtr.Zero;
try
{
if( OpenProcessToken(process.Handle, TOKEN_ACCESS.TOKEN_QUERY, out token) == 0 )
{
return null;
}
return new WindowsIdentity(token);
}
catch
{
token = IntPtr.Zero;
}
finally
{
CloseHandle(token);
}
return null;
}Anonymous
November 16, 2005
Nice. Thanks, Oscar! I don't have an extender device at home, so it's difficult to test for those scenarios.Anonymous
December 07, 2005
The comment has been removedAnonymous
January 10, 2006
The comment has been removedAnonymous
January 31, 2006
Hello!
Is there any fix for the bug wich fixxes the issue with the position addin install?
I have rollup 2 but I get the message the app is for MCE 2005 or later... please advice...?
(MCE 2005 with swedish language pack.)
/ SteveAnonymous
February 01, 2006
I just updated the installer by compiling it against RegisterAddIn.dll from updated SDK. I don't know if it'll help at all (I don't have a non-US install to test it against), but if it does, great!Anonymous
February 01, 2006
Hi again!
It works fine to Install now, after your update.
But I do not seem to get any extra functions i MCE?
Should it not be possible to "jump" via the remote now? Does not seem to work for me.
Could you please give a short description how it is supposed to work.. or am I missing something?
Thx!
SteveAnonymous
February 02, 2006
Glad it now installs. Are you following the instructions as outlined in the article? For example, while watching a recorded show, you should be able to press the right arrow button immediately followed by the four digit time code (such as 1234 to mean 12 minutes 34 seconds) to which you want to jump, followed by the enter button (there won't be any onscreen feedback until you press enter or until the timer expires after entering the time). If that's not working, check the event log to see if there are any related messages in there.Anonymous
February 03, 2006
Aahh yes.
Got it working. Must have done something wrong the first time.
Wouldn't it be possible to actually see the time code you are entering?
That would have been nice. (like for example "06:55")
Thank you for great add-in!
/SteveAnonymous
February 04, 2006
Glad you got it working; that's great. As for on-screen feedback, I agree it would be nice to have, but there's no easy/supported way to have custom overlays on top of the video. It would require some serious hackery, at least in the current version of MCE. Regardless, I'm glad you're finding the add-in useful.Anonymous
February 17, 2006
Hi Again,
It is a very good sample.
Is there any ways to query interface from VMR filter and call its member functions from graph (got from ROT)? I tried casting but got exception.
Thx!Anonymous
February 17, 2006
Assuming the VMR filter is in the graph and you're able to find it, you should be able to access it and query for various interfaces on it. Of course, some of these filters may not have been designed for multithreading in a scenario like this, so it's hard to say whether whatever you want to do is possible.Anonymous
February 19, 2006
Hello,
I really like your plugin and I am very glad it even (partly) works with MPEG-4 encoded AVI movies (I have a lot of disney MPEG-4 encoded movies on my harddisk for my children available via My Movies). The only thing I am wondering about is why you disabled bookmarking for these type of files (while the jumping works fine). If you ever make a new version of your plugin, could you please make this configurable?
Kind regards,
Paul Vintges.Anonymous
February 20, 2006
The comment has been removedAnonymous
February 20, 2006
The comment has been removedAnonymous
February 26, 2006
The comment has been removedAnonymous
February 26, 2006
Thanks, James. Glad you like the tool and the write-up! If I do put out another version, I'll keep this in mind. If you want to modify it yourself and if you don't have Visual C#, you can always download the .NET Framework SDK, which is free and which includes the full C# 1.1 compiler.Anonymous
March 09, 2006
Ian was nice enough to have me on the show this week.  Check it out:http://mediacenter.thepodcastnetwork.com/2006/03/09/the-media-center-show-48-stephen-toub-msdn/...Anonymous
March 11, 2006
Hello
Thanks for the updated plugin! I can also confirm that its posible to install now. Its realy making MCE so mutch better! Just hoping you or somebody else some day make a releas without bookmarking on tv, because in my analog cabeltvnet I often have to change zoom ratio...... a bit anoying to every time have to go to the computer and plug in a mouse.
Best regards
OscarAnonymous
April 20, 2006
The comment has been removedAnonymous
April 24, 2006
While some of the remote buttons translate into keyboard messages, some of them translate into other messages, and my hooking code only works for keyboard messages (other techniques would provide access to other messages). I'd suggest hooking up Spy++ or something similar to see what messages those buttons trigger.Anonymous
April 24, 2006
TV bunnon
Windows Message HID (page 0xFFBC, usage 0x88) button usage 0x25
Works!
Icon Solid Color Red Button
Windows Message HID (page 0xFFBC, usage 0x88)
button usage 0x5b
Cannot be hooked but as you can see the windows message is the same!Anonymous
August 26, 2006
The code to fix the ehshell.exe discovery part on MCX devices won't compile as provided -- here's a solution that works for me (you can add all of this to the PositionChangerAddIn class):
[DllImport("Advapi32.dll", SetLastError = true)]
extern static int OpenProcessToken(IntPtr processHandle, TOKEN_ACCESS desiredAccess, out IntPtr tokenHandle);
[DllImport("kernel32.dll", SetLastError = true)]
extern static bool CloseHandle(IntPtr handle);
enum TOKEN_ACCESS : uint
{
TOKEN_ASSIGN_PRIMARY = 0x0001,
TOKEN_DUPLICATE = 0x0002,
TOKEN_IMPERSONATE = 0x0004,
TOKEN_QUERY = 0x0008,
TOKEN_QUERY_SOURCE = 0x0010,
TOKEN_ADJUST_PRIVILEGES = 0x0020,
TOKEN_ADJUST_GROUPS = 0x0040,
TOKEN_ADJUST_DEFAULT = 0x0080,
TOKEN_ADJUST_SESSIONID = 0x0100,
TOKEN_READ = 0x00020000 | TOKEN_QUERY,
TOKEN_WRITE = 0x00020000 | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_DEFAULT,
TOKEN_EXECUTE = 0x00020000,
};
public static Process GetEhShellProcess()
{
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("ehshell");
string userName = Environment.UserDomainName + "" + Environment.UserName;
Debug.WriteLine ("MCEMusicRewindAddIn - Enumerating ehshell.exe processes to find owner " + userName);
foreach(System.Diagnostics.Process process in processes)
{
WindowsIdentity processIdent=GetProcessesIdentities(process);
Debug.WriteLine ("MCEMusicRewindAddIn - ehshell owner: " + processIdent.Name);
if ( processIdent!=null && String.Compare(userName,processIdent.Name,true)==0)
{
Debug.WriteLine ("MCEMusicRewindAddIn - Found current user's ehshell.exe process (PID " + process.Id + ")");
return process;
}
}
Debug.WriteLine ("MCEMusicRewindAddIn - Cannot find ehShell.exe process for user: " + userName);
EventLog.WriteEntry("MCEMusicRewindAddIn", "Cannot find ehShell.exe process for user: " + userName, EventLogEntryType.Error);
throw new InvalidOperationException("Cannot find ehShell.exe process for user: " + userName);
}
public static WindowsIdentity GetProcessesIdentities(Process process)
{
try
{
IntPtr token = IntPtr.Zero;
if (OpenProcessToken(process.Handle, TOKEN_ACCESS.TOKEN_QUERY, out token) == 0)
{
throw new ApplicationException("Can't open process token for: " + process.ProcessName);
}
WindowsIdentity id = new WindowsIdentity(token);
CloseHandle(token);
return (id);
}
catch (Exception ex)
{
throw new ApplicationException("Open process token error", ex);
}
}
// Then, in PositionChangerAddIn::Launch replace these lines:
//
//////// Process [] procs = Process.GetProcessesByName("ehshell");
//////// if (procs.Length > 0)
//////// {
//////// // Dispose of unused processes, although there shouldn't be any as ehshell is singular
//////// for(int i=1; i<procs.Length; i++) procs[i].Dispose();
//////// // The current process will be needed in order to get its main window handle
//////// using(_thisProcess = procs[0])
//////// {
//
// ... with this:
//////// // The current process will be needed in order to get its main window handle
//////// using(_ehshellProcess = GetEhShellProcess())
//////// {Anonymous
September 09, 2006
Does this work in Vista WMC?Anonymous
October 18, 2006
I just tried to install this and the installer errors saying I have another version already installed.... but I don't !!!! Maybe it conflicts with another add-in which hooks the remote, called StopFix, which stops the background buffering of live TV when you hit the Stop button... JimAnonymous
November 06, 2006
The comment has been removedAnonymous
November 06, 2006
Most likely it's UAC that's preventing the MSI from installing correctly. However, even if it did install, there are still several things about the add-in that could prevent it from working correctly in Vista Media Center (including UAC). I may revisit it at some point in the future and attempt to create a new version, but at present I don't have plans to do so. As the code is available for the add-in, please feel free to modify it as appropriate.Anonymous
January 03, 2007
Back in early 2005, I wrote an article for MSDN on implementing add-ins for Windows XP Media Center EditionAnonymous
January 10, 2007
The comment has been removedAnonymous
January 10, 2007
Alex, it's a great request, but I fear it would be very difficult to do correctly. One's best bet would probably be to create an add-in application with its own UI that shows the currently playing video as well as a mouse-clickable slider. In Vista, you could make this UI look a lot like what you're asking for, as you can overlay controls on video, but it would still require a funky mechanism to transfer seemlessly from the video to the add-in app. In short, I'm sure there are ways to do it, but no elegant methods come to mind immediately.Anonymous
March 14, 2007
Du musst ein Fachmann sein - wirklich guter Aufstellungsort, den du hast!Anonymous
March 20, 2007
Tom, yes, the link in the original blog post here still works and still points to the version that works with Media Center 2005 Rollup Update 2 (which is what you should have if you have Media Center 2005 and have installed the relevant updates through Windows Update). http://toub.members.winisp.net/Code/PositionChangerAddIn.zipAnonymous
March 25, 2007
The comment has been removedAnonymous
March 25, 2007
The comment has been removedAnonymous
April 24, 2007
The add-in works perfectly. Still, what about OSC? Even something simple one? Is there any sample code available for OSC in MCE 2005 UR2? See, I've built my MCE, so now it is not just a matter of comp geeking if you will... It is going to seat in our family room...Anonymous
June 03, 2007
Hi, i have the same problem like Tom Rompf. I've tryed to install it manually, the RegisterMCEApp.exe write "success" but nothing apeared in "My Apps" and i still can see number as i press them, so i assume that add-on isn't instaled at all. Today i downloaded updated version for MCE 2005 UR2 (english version) and installer finished sucessfully, but still plugin doesn't work. I have all updates up-to-date and relatively fresh install, about two weeks. .Net 1.1 with all service packs etc... other plugins i've download and installed are working ok. Any idea? Thanks!Anonymous
July 25, 2007
Stephen, I can't get the add-in to install on a fresh copy of MCE 2005 Rollup 2 (on D Drive - 2nd partition). It says ' This AddIn can be only be installed on Media Center Editions of Windows XP'. Is it possible that this is caused by the fact that I have a normal copy of Windows XP on the C drive (dual-boot)? Any help would be greatly appreciated. MarkAnonymous
August 01, 2007
<a href="httpwwwkiklbjvgcnpage25html">subaruimpreza2002workshopmanualsdownloads</a> subaruimpreza2002workshopmanualsdownloads,<a href="httpwwwkiklbjvgcnpage21html">freetoonuncensoredhardcorecomixhugedick</a> freetoonuncensoredhardcorecomixhugedick,<a href="httpwwwkiklbjvgcnpage48html">northcarolinachildhoodemancipation</a> northcarolinachildhoodemancipation,<a href="httpwwwkiklbjvgcnpage27html">originalpurposeforgps</a> originalpurposeforgps,<a href="httpwwwkiklbjvgcnpage29html">specificbiometricdevices</a> specificbiometricdevices,<a href="httpwwwkiklbjvgcnpage29html">biometricsproductcostinindia</a> biometricsproductcostinindia,<a href="httpwwwkiklbjvgcnpage46html">frenchspanishsurnames</a> frenchspanishsurnames,<a href="httpwwwkiklbjvgcnpage23html">bennydrummond</a> bennydrummond,<a href="httpwwwkiklbjvgcnpage46html">wheredothemostspanishamericanscomefrom</a> wheredothemostspanishamericanscomefrom,<a href="httpwwwkiklbjvgcnpage48html">kuczmarskiandchildhoodobesityin2000</a> kuczmarskiandchildhoodobesityin2000,Anonymous
August 01, 2007
<a href="httpwwwdhcgpdiacnpage52html">bondagerubber</a> bondagerubber,<a href="httpwwwdhcgpdiacnpage58html">letmeclearmythroatbydjkool</a> letmeclearmythroatbydjkool,<a href="httpwwwdhcgpdiacnpage52html">englishpalacebondage</a> englishpalacebondage,<a href="httpwwwdhcgpdiacnpage42html">picturesofpeopleforgivingeachotherandshakinghands</a> picturesofpeopleforgivingeachotherandshakinghands,<a href="httpwwwdhcgpdiacnpage40html">publicbangbros</a> publicbangbros,<a href="httpwwwdhcgpdiacnpage41html">convincingthepeopletoallowyoutowin</a> convincingthepeopletoallowyoutowin,<a href="httpwwwdhcgpdiacnpage51html">emperatureoptimalindoors</a> emperatureoptimalindoors,<a href="httpwwwdhcgpdiacnpage66html">fentonmohotels</a> fentonmohotels,<a href="httpwwwdhcgpdiacnpage62html">bestcampsitesdeceptionpass</a> bestcampsitesdeceptionpass,<a href="httpwwwdhcgpdiacnpage52html">fistingbondagefree</a> fistingbondagefree,Anonymous
August 01, 2007
<a href="httpwwwqrqplfsbcnpage30html">vipersmk2designs</a> vipersmk2designs,<a href="httpwwwqrqplfsbcnpage46html">richarddryfussimdb</a> richarddryfussimdb,<a href="httpwwwqrqplfsbcnpage44html">atvssanddunes</a> atvssanddunes,<a href="httpwwwqrqplfsbcnpage55html">cocospabrewsternyh</a> cocospabrewsternyh,<a href="httpwwwqrqplfsbcnpage49html">retrorcatelevision</a> retrorcatelevision,<a href="httpwwwqrqplfsbcnpage32html">yeoldecolonialrestaurantmadisonga</a> yeoldecolonialrestaurantmadisonga,<a href="httpwwwqrqplfsbcnpage31html">ymcahostelsinlatinamerica</a> ymcahostelsinlatinamerica,<a href="httpwwwqrqplfsbcnpage41html">teachingwritinggenrestojuniorlevelstudents</a> teachingwritinggenrestojuniorlevelstudents,<a href="httpwwwqrqplfsbcnpage39html">caracteristicasescuelaactivajohndewey</a> caracteristicasescuelaactivajohndewey,<a href="httpwwwqrqplfsbcnpage39html">caracteristicasdelderechohebreo</a> caracteristicasdelderechohebreo,Anonymous
March 10, 2008
Stephen, Your addin worked fine for me for a long time, however, some time in the past it stopped working. Got MCE 2005 UR2 and am using your latest version. The error that i got in the Event log is the following: Unable to launch. System.ComponentModel.Win32Exception: Cannot set nonlocal hook without a module handle at Toub.MediaCenter.AddIns.KeyboardHook..ctor(KeyDownHook keyDown) at Toub.MediaCenter.AddIns.PositionChangerAddIn.Microsoft.MediaCenter.AddIn.IAddInEntryPoint.Launch(AddInHost host) Is there any chance you could help solve the problem? Thanks.Anonymous
June 12, 2008
i installed the add-in and it didn't work. it caused the forward and back buttons on the nave bar to stop working. they beep when they're are clicked but nothing happens. i've uninstalled the add-in but the buttons still do not work like they used to. anyone know how to fix this?Anonymous
August 18, 2009
bjKf9Z <a href="http://ycknonmszdbc.com/">ycknonmszdbc</a>, [url=http://zlqsbfgtlipw.com/]zlqsbfgtlipw[/url], [link=http://yqbzvxlubvur.com/]yqbzvxlubvur[/link], http://lozdvcgwiwni.com/