Catfood: WebCamSaver and PdfScan

Updated on Thursday, November 12, 2015

Two new Catfood releases.

Catfood WebCamSaver 3.10 adds support for simultaneous updates in 4 and 16-cam modes. The WebCam Directory has also been completely overhauled. WebCamSaver is a rather voyeuristic screensaver that lets you watch live feeds from around the world. As well as a screensaver the feed is available in my World Webcams Google Gadget.

Catfood PdfScan 1.20 follows hot on the heels of 1.10. The main update is showing a preview of each scanned page which is super handy if you always forget which way pages are supposed to go in your document feeder. Mentioning no names…

Add your comment...

Related Posts

You Might Also Like

(All Code Posts)

(Published to the Fediverse as: Catfood: WebCamSaver and PdfScan #code #webcamsaver #pdf #pdfscan Latest updates to Catfood WebCamSaver and Catfood PdfScan )

Catfood: Earth, PdfScan and Weather

Updated on Sunday, November 6, 2022

Three recent Catfood Software updates:

Catfood Earth 3.10 includes rotation to longitude / solar time, volcanoes, a screen saver, time zone updates and more. Catfood Earth uses satellite imagery and a variety of data feeds to render jaw-dropping live desktop wallpaper.

Catfood Earth 3.10

Catfood PdfScan 1.10 saves your selected paper size and feeder choices. There is also an option to keep PdfScan open after saving a scan, something that had been bugging me when slogging through large digitization projects. PdfScan is a free tool for scanning stuff into a PDF file.

Catfood PdfScan 1.10

Catfood Weather 2.00 includes weather alerts and an updated UI. Catfood Weather provides a free, taskbar based weather forecast for US locations.

Catfood Weather 2.00

Add your comment...

Related Posts

You Might Also Like

(All Code Posts)

Convert BlogML comments to WXR for Disqus

Updated on Thursday, November 12, 2015

I’ve just moved ITHCWY comments over to Disqus. BlogEngine.NET now supports Disqus out of the box, but doesn’t export comments to anything that Disqus is willing to eat. I’ve knocked up a quick converter that takes a full BlogML export from BlogEngine.NET (and at least in theory any other source of BlogML) and converts the comments to WXR. You can import the WXR file under the Generic option in Disqus.

The tool is a Windows console application that takes two parameters, the BlogML import file and the WXR output, i.e.:

BlogMLtoDisqus.exe C:\BlogML.xml C:\ForDisqus.wxr

It isn’t fancy and there is no error checking so it will either work or die horribly. If the latter, leave a comment and I’ll try to fix it for you.

Download BlogMLtoDisqus.exe. You’ll need to install .NET 4.0 as well if you don’t already have it.

Updated 2011-04-22: Added an optional third parameter that specifies the XML namespace for BlogML in case you need to override the default.

Add your comment...

Related Posts

You Might Also Like

(All Code Posts)

(Published to the Fediverse as: Convert BlogML comments to WXR for Disqus #code #blogengine.net #c# #.net #blogml #wxr #disqus A command line tool to convert BlogML comments to WXR (i.e. for Disqus). )

Merging Resource Dictionaries for fun and profit

Updated on Thursday, April 29, 2021

Merging Resource Dictionaries for fun and profit

Here are two scenarios where merged ResourceDictionary objects are the way forward.

I’m working on a WPF project that needs to be single instance. Heaven forbid that the WPF team should pollute the purity of their framework with support for this kind of thing (or NotifyIcon support but that’s another story) so I’m using the code recommended by Arik Poznanski: WPF Single Instance Application. I like this because it both enforces a single instance and provides an interface that reports the command line passed to any attempt to launch another instance.

An issue with using this code is that you need to write a Main function and so App.xaml is set to Page instead of Application Definition. Once you’ve done this the program works fine but the Visual Studio designer fails to load resources in UserControls (and in Windows containing those UserControls).

The fix is to factor all of the application level resources out into a separate ResourceDictionary (i.e. MergedResources.xaml). Once you’ve done this merge the new ResourceDictionary into App.xaml as follows:

Next, in each Window or UserControl reference the same ResourceDictionary:

The designer will now be able to find the correct resources for each UserControl and Window.

The second scenario is factoring resources and other Xaml into a DLL. To pull resources in from a referenced assembly you just need to use a Pack Uri when merging in the remote ResourceDictionary:

If you’re putting Windows and UserControls in the DLL use exactly the same approach to reference the resources using ResourceDictionary.MergedDictionaries and you’ll get designer support for these as well.

Add your comment...

Related Posts

You Might Also Like

(All Code Posts)

(Published to the Fediverse as: Merging Resource Dictionaries for fun and profit #code #.net #c# #wpf #xaml Get designer support for XAML loaded from a DLL by merging resource dictionaries in .NET WPF. )

UAC shield icon in WPF

Updated on Sunday, May 2, 2021

WPF: When it's good it’s very, very good and when it’s bad it’s like sautéing your own eyeballs.

When you’re about to launch a process that will trigger an elevation prompt it’s polite to decorate it with the little UAC shield so the user knows what to expect. Of course there’s no such capability in WPF, and WPF controls have no handles so you can’t use SendMessage / BCM_SETSHIELD as with Windows Forms.

System.Drawing.SystemIcons.Shield seems promising, but it returns the wrong icon on Windows 7 (at least in .NET 4).

SHGetStockIconInfo will allow you to get the correct icon, but isn’t supported on Windows XP. I’ve just added the necessary interop signatures for SHGetStockIconInfo to pinvoke.net so I won’t duplicate that code here. Once you have the interop you can get the correct icon as a BitmapSource using the following code:

Add your comment...

Related Posts

You Might Also Like

(All Code Posts)

(Published to the Fediverse as: UAC shield icon in WPF #code #.net #c# #wpf #uac #pinvoke How to add the correct UAC shield icon for each Windows version in .NET WPF using Win32 interop. )

Geotagging posts in BlogEngine.NET

Updated on Sunday, September 30, 2018

Geotagging posts in BlogEngine.NET

I've written an extension for BlogEngine.NET that automatically adds several different geographical tags to blog posts. I knocked this up for my Hikes blog. It might be useful for any blog where some of the posts are related to a real world location.

To get started download GeotagFromKML.zip (2.24 kb) and copy GeotagFromKML.cs to the App_Code\Extensions folder in your BlogEngine.NET instance.

The extension does two things. Firstly it looks for a link to a KML file when post is added or updated (it does this because each of my hike posts includes a Google Earth KML file for the hike). If a KML link is found then a paragraph is added to the post containing the longitude and latitude of the first coordinate in the KML file. The paragraph uses the Geo microformat. You can customize the text in settings for the extension. You can also regenerate by deleting the paragraph and saving the post. 

The second function is to add ICBM and Geo Tag META tags when serving a post that contains the geotagged coordinates. You can take advantage of this without linking to a KML file, just include a location like this in your post:

Once you have geotagging up and running you might also want to add GeoURL to the list of ping services for your site.

Add your comment...

Related Posts

You Might Also Like

(All Code Posts)

(Published to the Fediverse as: Geotagging posts in BlogEngine.NET #code #blogengine.net #.net #c# #metadata #kml #geo #icbm #geourl #geotag A customer extension that supports geotagging posts in BlogEngine.NET. )

Reboot computer in C# / .NET

Updated on Monday, May 2, 2022

Reboot computer in C# / .NET

.NET doesn’t support rebooting, logging off or shutting down your computer though a managed API. Searching for the best way to do this brings up three options: WMI, shutdown.exe and ExitWindowsEx.

I regard WMI as the last resort of the desperate. Weakly typed magic string juju.

Calling Process.Start(“shutdown.exe /r /t 0”) might work, but how would you know? And you’ve got the overheard of starting a new process just to accomplish a reboot. Lazy.

The best way to reboot is P/Invoke to ExitWindowsEx. Unfortunately there’s some really awful sample code out there which will either fail to do anything or mask any errors. I’ve included a drop-in class below that fixes these problems.

If you read all the way through the documentation for ExitWindowsEx you’ll find this:

To shut down or restart the system, the calling process must use the AdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. For more information, see Running with Special Privileges.

So just calling ExitWindowsEx won’t do anything. The sample code below adjusts the process token and then reboots (change the flags passed to ExitWindowsEx to shutdown instead, or to pass in a different reason). You’ll also get a Win32Exception if a failure occurs. Catch this, and you can tell the user that they need to reboot manually.

Add your comment...

Related Posts

You Might Also Like

(All Code Posts)

(Published to the Fediverse as: Reboot computer in C# / .NET #code #reboot #wmi #shutdown.exe #exitwindowsex #openprocesstoken #lookupprivilegevalue How to call ExitWindowsEx correctly to reboot a computer in C# / .NET including error handline in case you need to tell the user to reboot manually. )

WPF commands with nested focus scope

Updated on Sunday, September 30, 2018

Here's a frustrating WPF scenario — you use the ApplicationCommands class to add Cut, Copy and Paste commands to toolbar and then put a TextBox on another toolbar. Click in the TextBox and the commands remain disabled. WTF, WPF?

The problem is with focus scopes. Your window is a focus scope and so are any menus or toolbars. This has the desirable property of allowing commands to target the control you were in immediately before invoking the command. You want paste to target the text box you're editing, not the menu item or button you clicked to request the paste.

So far so good. The problem is that the commanding system isn't smart enough to target the control with keyboard focus if it's in a nested focus scope. Remember that the window itself is a focus scope so our TextBox in a ToolBar (also a focus scope) is nested and immune to commands from our menu or toolbar.

Here's a simple window that demonstrates the problem:

Ignore the PreviewCanExecute handler for now. If you run this window and click in the main TextBox the paste button and menu item are enabled. Click in the toolbar TextBox and pasting isn't an option. Well, Ctrl-V still works and there's a context menu but you know what I mean.

The problem can be fixed by adding a command binding for ApplicationCommands.Paste and handling the PreviewCanExecute event:

When the window loads we're making note of the focus scopes for the toolbar and menu. Then when PreviewCanExecute fires we check to see if the element with the keyboard focus is in a different focus scope (and also that the window doesn't have keyboard focus). We then set the CommandTarget for the menu item and button to the element that has keyboard focus.

A handler isn't required for CanExecute as the command will take care of this with respect to the new CommandTarget.

Run the window again and you'll see that the paste button is enabled for both of the TextBox controls. When you click the button (or menu item) our PreviewCanExecute handler ignores the new keyboard focus and the command is sent to the desired control. 

One drawback of this approach is that keyboard focus isn't returned to the TextBox after the command executes. The CommandTarget remains in place so you can keep pasting and the command remains enabled but you lose the visual cue that lets you know where the target is. I haven't figured out a clean approach to this yet. When I do, I'll update this post. Better yet, if you've figured it out leave a comment.

Add your comment...

Related Posts

You Might Also Like

(All Code Posts)

(Published to the Fediverse as: WPF commands with nested focus scope #code #wpf #.net #c# #xaml How to persuade a WPF application to paste into a selected control when the control is in a different focus scope. )

Converting Blogger ATOM export to BlogML

Updated on Thursday, December 26, 2019

I'm slowly converting a number of blogs from Blogger to BlogEngine.NET. The least fun part is dealing with the Blogger export file. For this blog I used a Powershell script but had problems with comments not exporting correctly and it was quite painful to fix everything up. Blogger allows you to export a copy of your blog using ATOM, however BlogEngine.NET (and other tools) speak BlogML.

I've just released a command line tool that takes the ATOM format Blogger export and converts it to BlogML. You can download Blogger2BlogML from GitHub. The tool uses .NET 4.0 (client profile) so you'll need to install this if you don't already have it. If you give Blogger2BlogML a try let me know how you get on. 

Add your comment...

Related Posts

You Might Also Like

(All Code Posts)

(Published to the Fediverse as: Converting Blogger ATOM export to BlogML #code #blogger #blogml #codeplex #c# #.net Tool that converts Blogger ATOM blog export files to BlogML for importing to a different blog engines. )

ESRI Shapefile Library Update

Updated on Sunday, May 23, 2021

I've just released a small update for my ESRI Shapefile Reader project on GitHub. The only change is a patch from SolutionMania that fixes a problem when the shapefile name is also a reserved name in the metadata database. The patch escapes the name preventing an exception from being thrown.

Catfood.Shapefile.dll is a .NET 2.0 forward only parser for reading an ESRI Shapefile. Download 1.20 from GitHub.

Add your comment...

Related Posts

You Might Also Like

(All Code Posts)