<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8056237070751233205</id><updated>2012-02-04T16:13:38.676+02:00</updated><category term='DwmExtendFrameIntoClientArea'/><category term='m50vc-as006'/><category term='strange'/><category term='Windows 7 overlay icon'/><category term='translate'/><category term='IShellLink'/><category term='DwmSetIconicLivePreviewBitmap'/><category term='m50'/><category term='bugs'/><category term='MINGW'/><category term='comics'/><category term='asus'/><category term='thumbnail toolbar'/><category term='joburi.md'/><category term='word'/><category term='Qt Taskbar Windows 7'/><category term='HTTP install'/><category term='DwmSetWindowAttribute'/><category term='Job'/><category term='suture'/><category term='bike'/><category term='tftp'/><category term='asus m50vc'/><category term='bad day'/><category term='Qt eventFilter'/><category term='tftpd'/><category term='WM_DWMSENDICONICLIVEPREVIEWBITMAP'/><category term='Windows 7 SDK'/><category term='windows'/><category term='live usb'/><category term='priority'/><category term='Windows 7 thumbnail toolbar'/><category term='Jump List'/><category term='lesson'/><category term='Romanian'/><category term='WM_DWMSENDICONICTHUMBNAIL'/><category term='laptop'/><category term='DwmSetIconicThumbnail'/><category term='Windows 7'/><category term='linux'/><category term='math'/><category term='thumbnailtoolbar'/><category term='ITaskbarList3'/><category term='taxi'/><category term='PXE boot'/><category term='ICustomDestinationList'/><category term='moldovajob.md'/><category term='Moldova'/><category term='Fedora 9'/><category term='accident'/><category term='thumbnail'/><category term='computers'/><category term='Google'/><category term='taskbar'/><category term='IShellItem'/><category term='popshore'/><category term='liveusb-creator'/><category term='job offers'/><category term='Qt Thumbnail toolbar Windows 7'/><category term='transparency'/><category term='imaginary number'/><category term='coding'/><category term='hr.md'/><category term='microsoft'/><category term='Qt'/><category term='gcc'/><category term='anime'/><category term='weird'/><category term='fun'/><category term='window thumbnail'/><category term='Taskbar Thumbnail Tabs'/><category term='progress bar'/><category term='Task'/><category term='ghimbovschi'/><category term='physics law'/><category term='mistery'/><category term='jobmarket.gov.md'/><title type='text'>Yet another coding blog</title><subtitle type='html'>Technology , fun , coding , interesting things</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-5503460488427948980</id><published>2011-06-02T16:29:00.000+03:00</published><updated>2011-06-02T16:29:19.857+03:00</updated><title type='text'>skype-open-source: Skype protocol reverse engineered, source availabl...</title><content type='html'>&lt;a href="http://skype-open-source.blogspot.com/2011/06/skype-protocol-reverse-engineered.html?spref=bl"&gt;skype-open-source: Skype protocol reverse engineered, source availabl...&lt;/a&gt;: "Hello, I'am Efim Bushmanov a freelance researcher and here is my project files on skype research.   While 'Wall Street Journal' makes politi..."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-5503460488427948980?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://skype-open-source.blogspot.com/2011/06/skype-protocol-reverse-engineered.html?spref=bl' title='skype-open-source: Skype protocol reverse engineered, source availabl...'/><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/5503460488427948980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=5503460488427948980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/5503460488427948980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/5503460488427948980'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2011/06/skype-open-source-skype-protocol.html' title='skype-open-source: Skype protocol reverse engineered, source availabl...'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-9020325801310631478</id><published>2011-03-31T16:51:00.002+03:00</published><updated>2011-03-31T20:55:05.600+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='DwmExtendFrameIntoClientArea'/><category scheme='http://www.blogger.com/atom/ns#' term='transparency'/><category scheme='http://www.blogger.com/atom/ns#' term='MINGW'/><title type='text'>Qt Windows 7 extend frame into client area with transparency</title><content type='html'>I wanted to have something similar to these below:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-BYTZzfbQKiA/TZSDUlkBb3I/AAAAAAAABZ8/ex8ShJAb4eM/s1600/googlechrome.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="117" src="http://2.bp.blogspot.com/-BYTZzfbQKiA/TZSDUlkBb3I/AAAAAAAABZ8/ex8ShJAb4eM/s400/googlechrome.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;Making the window transparent did not help me much. I was getting this:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-FDMDRXENyJc/TZSDsEb7VJI/AAAAAAAABaA/8p0VB0XE7Zs/s1600/withmargins.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="243" src="http://1.bp.blogspot.com/-FDMDRXENyJc/TZSDsEb7VJI/AAAAAAAABaA/8p0VB0XE7Zs/s320/withmargins.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;I could not get rid of the margins.&lt;br /&gt;&lt;br /&gt;After some research I figured out, and the result can be seen below:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="goog_212234941"&gt;&lt;/span&gt;&lt;span id="goog_212234942"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-avAhxHCkGFc/TZSBmajnBUI/AAAAAAAABZw/d4CWsccEi9E/s1600/frameintoclientarea.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-avAhxHCkGFc/TZSBmajnBUI/AAAAAAAABZw/d4CWsccEi9E/s1600/frameintoclientarea.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;To get merge the margins with the window frame it is enough to call DwmExtendFrameIntoClientArea with the margins value set to -1.&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;void ExtendFrameIntoClientArea(QWidget* widget) {&lt;br /&gt;    MARGINS margins = {-1};&lt;br /&gt;&lt;br /&gt;    DwmExtendFrameIntoClientArea(widget-&gt;winId(), &amp;margins);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The transparency part is easy, it was published long time ago:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;long EnableBlurBehindWidget(QWidget* widget, bool enable)&lt;br /&gt;{&lt;br /&gt;    HWND hwnd = widget-&gt;winId();&lt;br /&gt;    HRESULT hr = S_OK;&lt;br /&gt;&lt;br /&gt;    widget-&gt;setAttribute(Qt::WA_TranslucentBackground, enable);&lt;br /&gt;    widget-&gt;setAttribute(Qt::WA_NoSystemBackground, enable);&lt;br /&gt;&lt;br /&gt;    // Create and populate the Blur Behind structure&lt;br /&gt;    DWM_BLURBEHIND bb = {0};&lt;br /&gt;&lt;br /&gt;    bb.dwFlags = DWM_BB_ENABLE;&lt;br /&gt;    bb.fEnable = enable;&lt;br /&gt;    bb.hRgnBlur = NULL;&lt;br /&gt;&lt;br /&gt;    DwmEnableBlurBehindWindow(hwnd, &amp;bb);&lt;br /&gt;    return hr;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I have managed to compile this using MINGW. The DwmEnableBlurBehindWindow and DwmExtendFrameIntoClientArea are loaded directly from dwmapi.dll.&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define DWM_BB_ENABLE                 0x00000001  // fEnable has been specified&lt;br /&gt;&lt;br /&gt;typedef struct _DWM_BLURBEHIND&lt;br /&gt;{&lt;br /&gt;    DWORD dwFlags;&lt;br /&gt;    BOOL fEnable;&lt;br /&gt;    HRGN hRgnBlur;&lt;br /&gt;    BOOL fTransitionOnMaximized;&lt;br /&gt;} DWM_BLURBEHIND, *PDWM_BLURBEHIND;&lt;br /&gt;&lt;br /&gt;typedef struct _MARGINS&lt;br /&gt;{&lt;br /&gt;    int cxLeftWidth;      // width of left border that retains its size&lt;br /&gt;    int cxRightWidth;     // width of right border that retains its size&lt;br /&gt;    int cyTopHeight;      // height of top border that retains its size&lt;br /&gt;    int cyBottomHeight;   // height of bottom border that retains its size&lt;br /&gt;} MARGINS, *PMARGINS;&lt;br /&gt;&lt;br /&gt;extern "C"&lt;br /&gt;{&lt;br /&gt;    typedef HRESULT (WINAPI *t_DwmEnableBlurBehindWindow)(HWND hWnd, const DWM_BLURBEHIND* pBlurBehind);&lt;br /&gt;    typedef HRESULT (WINAPI *t_DwmExtendFrameIntoClientArea)(HWND hwnd, const MARGINS *pMarInset);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void DwmExtendFrameIntoClientArea(HWND hwnd, const MARGINS *pMarInset) {&lt;br /&gt;    HMODULE shell;&lt;br /&gt;&lt;br /&gt;    shell = LoadLibrary(L"dwmapi.dll");&lt;br /&gt;    if (shell) {&lt;br /&gt;        t_DwmExtendFrameIntoClientArea set_window_frame_into_client_area = reinterpret_cast&amp;lt;t_DwmExtendFrameIntoClientArea&amp;gt;(GetProcAddress (shell, "DwmExtendFrameIntoClientArea"));&lt;br /&gt;        set_window_frame_into_client_area(hwnd, pMarInset);&lt;br /&gt;&lt;br /&gt;        FreeLibrary (shell);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void DwmEnableBlurBehindWindow(HWND hwnd, const DWM_BLURBEHIND* pBlurBehind) {&lt;br /&gt;    HMODULE shell;&lt;br /&gt;&lt;br /&gt;    shell = LoadLibrary(L"dwmapi.dll");&lt;br /&gt;    if (shell) {&lt;br /&gt;        t_DwmEnableBlurBehindWindow set_window_blur = reinterpret_cast&amp;lt;t_DwmEnableBlurBehindWindow&amp;gt;(GetProcAddress (shell, "DwmEnableBlurBehindWindow"));&lt;br /&gt;        set_window_blur(hwnd, pBlurBehind);&lt;br /&gt;&lt;br /&gt;        FreeLibrary (shell);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The project can be downloaded from &lt;a href="https://github.com/xfreebird/blogstuff/tree/master/qt/qtwindow7_tweak"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-9020325801310631478?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/9020325801310631478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=9020325801310631478' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/9020325801310631478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/9020325801310631478'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2011/03/qt-windows-7-extend-frame-into-client.html' title='Qt Windows 7 extend frame into client area with transparency'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-BYTZzfbQKiA/TZSDUlkBb3I/AAAAAAAABZ8/ex8ShJAb4eM/s72-c/googlechrome.PNG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-9167310079621690688</id><published>2011-03-31T15:48:00.003+03:00</published><updated>2011-04-14T11:35:03.098+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WM_DWMSENDICONICLIVEPREVIEWBITMAP'/><category scheme='http://www.blogger.com/atom/ns#' term='WM_DWMSENDICONICTHUMBNAIL'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt eventFilter'/><category scheme='http://www.blogger.com/atom/ns#' term='DwmSetWindowAttribute'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt Taskbar Windows 7'/><category scheme='http://www.blogger.com/atom/ns#' term='ITaskbarList3'/><category scheme='http://www.blogger.com/atom/ns#' term='Taskbar Thumbnail Tabs'/><category scheme='http://www.blogger.com/atom/ns#' term='MINGW'/><title type='text'>Windows 7 Taskbar Extensions in Qt: Tab Thumbnails</title><content type='html'>In this post I'll explain how I implemented this Windows 7 feature using Qt with MINGW32.&lt;br /&gt;&lt;br /&gt;For this purpose I have created a simple browser with tabs.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-wb8hyCFz25o/TZRgMlJdjyI/AAAAAAAABZo/wz7hgRUTn2I/s1600/generalview.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="472" src="http://2.bp.blogspot.com/-wb8hyCFz25o/TZRgMlJdjyI/AAAAAAAABZo/wz7hgRUTn2I/s640/generalview.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The main blockers implementing this using Qt with MINGW32 are the missing defintions of various important Windows 7 SDK functions, interfaces, enums, constants and structures (e.g. &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ITaskbarList3&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ITaskbarList4&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;CLSID_TaskbarList&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;STPFLAG&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DWMWINDOWATTRIBUTE&lt;/span&gt;, and DWM functions (&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DwmInvalidateIconicBitmaps&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DwmSetIconicThumbnail&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DwmSetIconicLivePreviewBitmap&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DwmSetWindowAttribute&lt;/span&gt;)).&lt;br /&gt;&lt;br /&gt;In order to fix this I had to define them mingw friendly in my project. The DWM functions are loaded during runtime from dwmapi.dll.&lt;br /&gt;&lt;br /&gt;In the &lt;a href="https://github.com/xfreebird/blogstuff/blob/master/qt/thumbnailtabs_example1/win7utils.h"&gt;win7utils.h&lt;/a&gt; and &lt;a href="https://github.com/xfreebird/blogstuff/blob/master/qt/thumbnailtabs_example1/win7utils.cpp"&gt;win7utils.cpp&lt;/a&gt; you can see the final result.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Initializing&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Firstly the program has to register the TaskbarButtonCreated message. This will create a taskbar button for this application. Without this it is impossible to use the new Windows 7 features.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After having the taskbar button created the application has to initialize an &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ITaskbarList3 &lt;/span&gt;or &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ITaskbarList4 &lt;/span&gt;interface in order to be able to access the new features.&lt;br /&gt;&lt;br /&gt;In our event filter:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;bool MyClass::eventFilter(void *message_, long *result)&lt;br /&gt;{&lt;br /&gt;    static unsigned int taskBarCreatedId = WM_NULL;&lt;br /&gt;&lt;br /&gt;    MSG* message = static_cast&lt;msg*&gt;(message_);&lt;br /&gt;&lt;br /&gt;    if (taskBarCreatedId == WM_NULL) {&lt;br /&gt;        taskBarCreatedId = RegisterWindowMessage(L"TaskbarButtonCreated");&lt;br /&gt;        return false;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (message-&amp;gt;message == taskBarCreatedId &amp;amp;&amp;amp;&lt;br /&gt;        message-&amp;gt;hwnd == parent-&amp;gt;winId()) &lt;br /&gt;        //very important to check to which window this message is address&lt;br /&gt;        //since it is possible to get a dozen of them&lt;br /&gt;        //the parent can be a QMainWindow or any other QWidget which acts as a &lt;br /&gt;        //tab container&lt;br /&gt;    {&lt;br /&gt;        //init the ITaskbarList3  interface&lt;br /&gt;        //announce that the interface is ready&lt;br /&gt;        return true;&lt;br /&gt;    }&lt;br /&gt;    //...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/msg*&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Adding tabs&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The most important &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ITaskbarList3 &lt;/span&gt;functions to work with in this case are: &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;RegisterTab&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SetTabActive&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SetTabOrder &lt;/span&gt;and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;UnregisterTab&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: white; color: red;"&gt;You should not register the window or widget which contains these tabs as a tab.&lt;/div&gt;&lt;br /&gt;First thing to do is to capture all messages sent to the application. This can be achieved by substituting the current application's event filter with ours.&lt;br /&gt;This will route all messages to our own function.&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;// MyClass.h&lt;br /&gt;class MyClass {&lt;br /&gt;//..&lt;br /&gt;  static bool eventFilter(void *message_, long *result);&lt;br /&gt;  static QCoreApplication::EventFilter m_oldEventFilter;&lt;br /&gt;//..&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;//MyClass.cpp&lt;br /&gt;QCoreApplication::EventFilter TabsManager::m_oldEventFilter = NULL;&lt;br /&gt;&lt;br /&gt;MyClass::MyClass {&lt;br /&gt;//..&lt;br /&gt;   m_oldEventFilter = qApp-&amp;gt;setEventFilter(&amp;amp;MyClass::eventFilter);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Before registering a widget as a tab it is necessary to set two attributes to the window handle. This can be achieved by setting the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DWMWA_FORCE_ICONIC_REPRESENTATION &lt;/span&gt;and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DWMWA_HAS_ICONIC_BITMAP &lt;/span&gt;to true:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;void EnableWidgetIconicPreview(QWidget* widget) {&lt;br /&gt;    BOOL enable = TRUE;&lt;br /&gt;&lt;br /&gt;    DwmSetWindowAttribute(&lt;br /&gt;        widget-&amp;gt;winId(),&lt;br /&gt;        DWMWA_FORCE_ICONIC_REPRESENTATION,&lt;br /&gt;        &amp;amp;enable,&lt;br /&gt;        sizeof(enable));&lt;br /&gt;&lt;br /&gt;    DwmSetWindowAttribute(&lt;br /&gt;        widget-&amp;gt;winId(),&lt;br /&gt;        DWMWA_HAS_ICONIC_BITMAP,&lt;br /&gt;        &amp;amp;enable,&lt;br /&gt;        sizeof(enable));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This code will make the application receive &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;WM_DWMSENDICONICTHUMBNAIL &lt;/span&gt;and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;WM_DWMSENDICONICLIVEPREVIEWBITMAP &lt;/span&gt;messages when a thumbnail is requested for the registered widget.&lt;br /&gt;&lt;br /&gt;Another important thing which is related to Qt, you &lt;b style="color: red;"&gt;SHOULD NOT REGISTER AS A TAB A WIDGET WHICH IS BEING USED IN THE MAINWINDOW OR DIALOG&lt;/b&gt;.&lt;br /&gt;This will not work.&lt;br /&gt;The solution is to create a new blank widget, register it, and map the real widget to this blank widget. The thumbnails in the taskbar will be provided by the real widgets but the messages will be addressed to the blank ones.&lt;br /&gt;&lt;br /&gt;So each time when a &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;WM_DWMSENDICONICTHUMBNAIL &lt;/span&gt;or &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;WM_DWMSENDICONICLIVEPREVIEWBITMAP &lt;/span&gt;message is received, it is addressed to the blank registered widget, not the real one.&lt;br /&gt;&lt;br /&gt;The steps:&lt;br /&gt;1) Create a new QWidget*&lt;br /&gt;2) Map this created QWidget to the real QWidget is being used. This is apt to you.&lt;br /&gt;3) Set iconic preview enabled to the created QWidget&lt;br /&gt;4) Register the created QWidget as a tab&lt;br /&gt;5) Set tab order&lt;br /&gt;6) Set it as the active tab&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;//ITaskbarList3*  m_taskbarHandler;&lt;br /&gt;//QMap&amp;lt;WId, QWidget*&amp;gt; m_widgetMap;&lt;br /&gt;//QWidget* m_parent;&lt;br /&gt;&lt;br /&gt;void MyClass::addTab(QWidget* widget) {&lt;br /&gt;&lt;br /&gt;    QWidget* tab_widget = new QWidget();&lt;br /&gt;&lt;br /&gt;    //enable iconic preview&lt;br /&gt;    EnableWidgetIconicPreview(tab_widget-&amp;gt;winId(), true);&lt;br /&gt;&lt;br /&gt;    //map it&lt;br /&gt;    m_widgetMap[tab_widget-&amp;gt;winId()] = widget;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    //register it&lt;br /&gt;    m_taskbarHandler-&amp;gt;RegisterTab(tab_widget-&amp;gt;winId(), m_parent-&amp;gt;winId());&lt;br /&gt;    m_taskbarHandler-&amp;gt;SetTabOrder(tab_widget-&amp;gt;winId(), NULL);&lt;br /&gt;    m_taskbarHandler-&amp;gt;SetTabActive(NULL, tab_widget-&amp;gt;winId(), 0);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Processing the received messages&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In our own event filter we'll receive many messages, the most important ones are:&lt;br /&gt;&lt;br /&gt;The message code provided by the RegisterWindowMessage function. When the "TaskbarButtonCreated" message was registered - When this happens our tab manager will initialize the ITaskbarList3 interface.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;WM_DWMSENDICONICTHUMBNAIL &lt;/span&gt;- from MSDN: "instructs a window to provide a static bitmap to use as a thumbnail representation of that window."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;WM_DWMSENDICONICLIVEPREVIEWBITMAP &lt;/span&gt;- from MSDN: "Instructs a window to provide a static bitmap to use as a live preview (also known as a Peek preview) of that window."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;WM_ACTIVATE &lt;/span&gt;- when a thumbnail was clicked.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;WM_CLOSE &lt;/span&gt;- when a thumbnail is about to be closed.&lt;br /&gt;&lt;br /&gt;Providing the static bitmap&lt;br /&gt;&lt;br /&gt;When a &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;WM_DWMSENDICONICTHUMBNAIL &lt;/span&gt;message is received first thing it is checked if this is addressed to one of our registered widgets. This check can be done by comparing widget-&amp;gt;winId() to message-&amp;gt;hwnd. If they match we have to provide a static bitmap.&lt;br /&gt;The created bitmap is set by calling the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DwmSetIconicThumbnail &lt;/span&gt;function&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Providing the live preview&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Basically is almost the same as in the first case, except that the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DwmSetIconicLivePreviewBitmap &lt;/span&gt;function is called.&lt;br /&gt;&lt;br /&gt;An example:&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;case WM_DWMSENDICONICTHUMBNAIL:&lt;br /&gt;     //check if this is message is addressed to one of our widgets&lt;br /&gt;     if (!m_widgetMap.contains(message.hwnd)) return false;&lt;br /&gt;     &lt;br /&gt;     //get the real widget&lt;br /&gt;     widget = m_widgetMap[message.hwnd];&lt;br /&gt;&lt;br /&gt;     QPixmap thumbnail = QPixmap::grabWidget(widget).scaled(size, Qt::KeepAspectRatio);&lt;br /&gt;&lt;br /&gt;     //QPixmap::Alpha in case the image has transparent regions&lt;br /&gt;     HBITMAP hbitmap = thumbnail.toWinHBITMAP(QPixmap::Alpha);&lt;br /&gt;&lt;br /&gt;     DwmSetIconicThumbnail(id, hbitmap, 0);&lt;br /&gt;     DeleteObject(hbitmap);&lt;br /&gt;     return true;&lt;br /&gt;&lt;br /&gt;case WM_DWMSENDICONICLIVEPREVIEWBITMAP:&lt;br /&gt;     //check if this is message is addressed to one of our widgets&lt;br /&gt;     if (!m_widgetMap.contains(message.hwnd)) return false;&lt;br /&gt;     &lt;br /&gt;     //we want to grap the main window and show as a live preview&lt;br /&gt;     widget = parent;&lt;br /&gt;&lt;br /&gt;     QPixmap thumbnail = QPixmap::grabWidget(widget).scaled(size, Qt::KeepAspectRatio);&lt;br /&gt;&lt;br /&gt;     HBITMAP hbitmap = thumbnail.toWinHBITMAP(QPixmap::NoAlpha);&lt;br /&gt;&lt;br /&gt;     DwmSetIconicLivePreviewBitmap(id, hbitmap, 0);&lt;br /&gt;     DeleteObject(hbitmap);&lt;br /&gt;     return true;&lt;br /&gt;&lt;br /&gt;case WM_ACTIVATE :&lt;br /&gt;     if (LOWORD(message-&amp;gt;wParam) == WA_ACTIVE) {&lt;br /&gt;        //check if this is message is addressed to one of our widgets&lt;br /&gt;        if (!m_widgetMap.contains(message-&amp;gt;hwnd)) return false;&lt;br /&gt;   &lt;br /&gt;         //get the real widget&lt;br /&gt;         widget = m_widgetMap[message-&amp;gt;hwnd];&lt;br /&gt;         &lt;br /&gt;         //announce that widget was activated&lt;br /&gt;         //..&lt;br /&gt;     }&lt;br /&gt;     //route message further&lt;br /&gt;     return false;&lt;br /&gt;&lt;br /&gt;case WM_CLOSE :&lt;br /&gt;      //The same as for WM_ACTIVE except ..&lt;br /&gt;      //announce that widget is about to be removed&lt;br /&gt;      //..&lt;br /&gt;      &lt;br /&gt;      return false;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Updating the tab&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;When the content of the tab has changed, the thumbnail bitmap will not change by itself. That is why is needed to call &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DwmInvalidateIconicBitmaps&lt;/span&gt;. This will update the taskbar thumbnail for the specified tab.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The source code can be downloaded from &lt;a href="https://github.com/xfreebird/blogstuff/tree/master/qt/thumbnailtabs_example1"&gt;here&lt;/a&gt;.&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-9167310079621690688?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/9167310079621690688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=9167310079621690688' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/9167310079621690688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/9167310079621690688'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2011/03/windows-7-taskbar-extensions-in-qt-tab.html' title='Windows 7 Taskbar Extensions in Qt: Tab Thumbnails'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-wb8hyCFz25o/TZRgMlJdjyI/AAAAAAAABZo/wz7hgRUTn2I/s72-c/generalview.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-2820784763915379170</id><published>2011-03-31T11:17:00.000+03:00</published><updated>2011-03-31T11:17:35.372+03:00</updated><title type='text'>Strix Code Blog: Windows 7 or Vista  UAC Shield Icon in Qt</title><content type='html'>&lt;a href="http://blog.strixcode.com/2010/05/windows-7-or-vista-uac-shield-icon-in.html?spref=bl"&gt;Strix Code Blog: Windows 7 or Vista  UAC Shield Icon in Qt&lt;/a&gt;: "(For a way to embed an application manifest with QtCreator see here)  In a Qt application you cannot use the BCM_SETSHIELD message to show t..."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-2820784763915379170?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.strixcode.com/2010/05/windows-7-or-vista-uac-shield-icon-in.html?spref=bl' title='Strix Code Blog: Windows 7 or Vista  UAC Shield Icon in Qt'/><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/2820784763915379170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=2820784763915379170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/2820784763915379170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/2820784763915379170'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2011/03/strix-code-blog-windows-7-or-vista-uac.html' title='Strix Code Blog: Windows 7 or Vista  UAC Shield Icon in Qt'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-1608493028351671552</id><published>2011-03-24T16:56:00.004+02:00</published><updated>2011-03-30T10:35:09.566+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='window thumbnail'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7'/><category scheme='http://www.blogger.com/atom/ns#' term='DwmSetWindowAttribute'/><category scheme='http://www.blogger.com/atom/ns#' term='DwmSetIconicLivePreviewBitmap'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='thumbnail'/><category scheme='http://www.blogger.com/atom/ns#' term='DwmSetIconicThumbnail'/><category scheme='http://www.blogger.com/atom/ns#' term='MINGW'/><title type='text'>Windows 7 Taskbar Extensions in Qt: Window Thumbnail Image</title><content type='html'>In this tutorial I'll explain how to set a iconic bitmap on a window to use as a thumbnail representation using Qt with MINGW.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Missing definitions and declarations&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;To be able to set a custom thumbnail, the following functions are required:&lt;br /&gt;- DwmSetIconicThumbnail&lt;br /&gt;- DwmSetWindowAttribute&lt;br /&gt;- DwmSetIconicLivePreviewBitmap&lt;br /&gt;&lt;br /&gt;These functions can be found in the Dwmapi.h header file. Unfortunately this file is not present in MINGW.&lt;br /&gt;&lt;br /&gt;The solution is to call them directly from Dwmapi.dll.&lt;br /&gt;&lt;br /&gt;Firstly it is needed to typedef a function pointer type to these functions.&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;extern "C"&lt;br /&gt;{&lt;br /&gt;    typedef HRESULT (WINAPI *t_DwmSetIconicThumbnail)(HWND hwnd, HBITMAP hbmp, DWORD dwSITFlags);&lt;br /&gt;    typedef HRESULT (WINAPI *t_DwmSetWindowAttribute)(HWND hwnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute);&lt;br /&gt;    typedef HRESULT (WINAPI *t_DwmSetIconicLivePreviewBitmap)(HWND hwnd, HBITMAP hbmp, POINT *pptClient, DWORD dwSITFlags);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then, make wrappers which will call these functions directly from the dll.&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;void DwmSetIconicThumbnail(HWND hwnd, HBITMAP hbmp, DWORD dwSITFlags) {&lt;br /&gt;    HMODULE shell;&lt;br /&gt;&lt;br /&gt;    shell = LoadLibrary(L"dwmapi.dll");&lt;br /&gt;    if (shell) {&lt;br /&gt;        t_DwmSetIconicThumbnail set_iconic_thumbnail = reinterpret_cast&amp;lt;t_DwmSetIconicThumbnail&amp;gt;(GetProcAddress (shell, "DwmSetIconicThumbnail"));&lt;br /&gt;        set_iconic_thumbnail(hwnd, hbmp, dwSITFlags);&lt;br /&gt;&lt;br /&gt;        FreeLibrary (shell);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void DwmSetWindowAttribute(HWND hwnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute) {&lt;br /&gt;    HMODULE shell;&lt;br /&gt;&lt;br /&gt;    shell = LoadLibrary(L"dwmapi.dll");&lt;br /&gt;    if (shell) {&lt;br /&gt;        t_DwmSetWindowAttribute set_window_attribute = reinterpret_cast&amp;lt;t_DwmSetWindowAttribute&amp;gt;(GetProcAddress (shell, "DwmSetWindowAttribute"));&lt;br /&gt;        set_window_attribute(hwnd, dwAttribute, pvAttribute, cbAttribute);&lt;br /&gt;&lt;br /&gt;        FreeLibrary (shell);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void DwmSetIconicLivePreviewBitmap(HWND hwnd, HBITMAP hbmp, POINT *pptClient, DWORD dwSITFlags) {&lt;br /&gt;    HMODULE shell;&lt;br /&gt;&lt;br /&gt;    shell = LoadLibrary(L"dwmapi.dll");&lt;br /&gt;    if (shell) {&lt;br /&gt;        t_DwmSetIconicLivePreviewBitmap set_live_preview = reinterpret_cast&amp;lt;t_DwmSetIconicLivePreviewBitmap&amp;gt;(GetProcAddress (shell, "DwmSetIconicLivePreviewBitmap"));&lt;br /&gt;        set_live_preview(hwnd, hbmp, pptClient, dwSITFlags);&lt;br /&gt;&lt;br /&gt;        FreeLibrary (shell);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Project settings&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It is needed to add extra linkage libraries options to the linker. &lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;LIBS += libgdi32&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Setting the thumbnail&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You need to do the following:&lt;br /&gt;1) Call the DwmSetWindowAttribute function to set window attributes for non-client rendering to DWMWA_FORCE_ICONIC_REPRESENTATION and DWMWA_HAS_ICONIC_BITMAP&lt;br /&gt;2) Catch WM_DWMSENDICONICTHUMBNAIL and WM_DWMSENDICONICLIVEPREVIEWBITMAP Windows events&lt;br /&gt;3) Call DwmSetIconicThumbnail, on WM_DWMSENDICONICTHUMBNAIL event, to set thumbnail bitmap&lt;br /&gt;4) Call DwmSetIconicLivePreviewBitmap, on DWMSENDICONICLIVEPREVIEWBITMAP event, to set the window live preview bitmap&lt;br /&gt;&lt;br /&gt;Firslty, set window attributes:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;void MainWindow::EnableIconicPreview(bool enable) {&lt;br /&gt;    BOOL fForceIconic = enable ? TRUE : FALSE;&lt;br /&gt;    BOOL fHasIconicBitmap = enable ? TRUE : FALSE;&lt;br /&gt;&lt;br /&gt;    DwmSetWindowAttribute(&lt;br /&gt;        this-&amp;gt;winId(),&lt;br /&gt;        DWMWA_FORCE_ICONIC_REPRESENTATION,&lt;br /&gt;        &amp;amp;fForceIconic,&lt;br /&gt;        sizeof(fForceIconic));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    DwmSetWindowAttribute(&lt;br /&gt;        this-&amp;gt;winId(),&lt;br /&gt;        DWMWA_HAS_ICONIC_BITMAP,&lt;br /&gt;        &amp;amp;fHasIconicBitmap,&lt;br /&gt;        sizeof(fHasIconicBitmap));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Secondly, re-implement the QMainWindow winEvent protected function:&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;class MainWindow : public QMainWindow&lt;br /&gt;{&lt;br /&gt;//..&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt;    bool winEvent(MSG * message, long * result);&lt;br /&gt;&lt;br /&gt;//..&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;bool MainWindow::winEvent(MSG * message, long * result)&lt;br /&gt;{&lt;br /&gt;    switch (message-&amp;gt;message)&lt;br /&gt;    {&lt;br /&gt;    case WM_DWMSENDICONICTHUMBNAIL:&lt;br /&gt;        //call DwmSetIconicThumbnail&lt;br /&gt;        break;&lt;br /&gt;&lt;br /&gt;    case WM_DWMSENDICONICLIVEPREVIEWBITMAP:&lt;br /&gt;        //call  DwmSetIconicLivePreviewBitmap&lt;br /&gt;        break;&lt;br /&gt;    default:&lt;br /&gt;        return false;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return false;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;On WM_DWMSENDICONICTHUMBNAIL event&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Convert a QPixmap image to HBITMAP, and call DwmSetIconicThumbnail for this window:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;QPixmap image(":/qtlogo.png");&lt;br /&gt;HBITMAP hbitmap = m_image.toWinHBITMAP();&lt;br /&gt;DwmSetIconicThumbnail(this-&amp;gt;winId(), hbitmap, 0);&lt;br /&gt;DeleteObject(hbitmap);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;On WM_DWMSENDICONICLIVEPREVIEWBITMAP event&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In this case it is required to provide the taskbar with a custom image of the selected window:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;HBITMAP hbitmap = QPixmap::grabWidget(this).scaled(this-&gt;size(), Qt::KeepAspectRatio).toWinHBITMAP();&lt;br /&gt;DwmSetIconicLivePreviewBitmap(this-&amp;gt;winId(), hbitmap, 0, 0);&lt;br /&gt;&lt;br /&gt;DeleteObject(hbitmap);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The result:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-bI3xVl14Y0M/TZLcwwcQYjI/AAAAAAAABZk/ITPHDC_gfcA/s1600/thumbnail.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="324" src="http://1.bp.blogspot.com/-bI3xVl14Y0M/TZLcwwcQYjI/AAAAAAAABZk/ITPHDC_gfcA/s640/thumbnail.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;The code can be downloaded from &lt;a href="https://github.com/xfreebird/blogstuff/blob/master/qt/thumbnail_example1/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Useful &lt;a href="http://msdn.microsoft.com/en-us/library/dd389411%28v=VS.85%29.aspx"&gt;link&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-1608493028351671552?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/1608493028351671552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=1608493028351671552' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/1608493028351671552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/1608493028351671552'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2011/03/windows-7-taskbar-extensions-in-qt_24.html' title='Windows 7 Taskbar Extensions in Qt: Window Thumbnail Image'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-bI3xVl14Y0M/TZLcwwcQYjI/AAAAAAAABZk/ITPHDC_gfcA/s72-c/thumbnail.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-2906185494298289192</id><published>2011-03-24T12:26:00.001+02:00</published><updated>2011-03-24T12:29:56.081+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thumbnailtoolbar'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt Thumbnail toolbar Windows 7'/><category scheme='http://www.blogger.com/atom/ns#' term='thumbnail toolbar'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7 thumbnail toolbar'/><category scheme='http://www.blogger.com/atom/ns#' term='ITaskbarList3'/><title type='text'>Windows 7 Taskbar Extensions in Qt: Thumbnail Toolbar</title><content type='html'>In this tutorial I'll explain how to create a Windows 7 thumbnail toolbar using Qt with MINGW GCC. At the end of the post you'll find the link to the project's code.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Missing definitions and declarations&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;MINGW GCC doesn't have all needed definitions and declarations to create a windows 7 thumbnail toolbar. That is why they need to be defined. I've explained how I did it in my previous &lt;a href="http://nicug.blogspot.com/2011/01/windows-7-taskbar-extensions-in-qt.html#H11"&gt;post&lt;/a&gt;. You can browse the definitions file &lt;a href="https://github.com/xfreebird/blogstuff/blob/master/qt/toolbar_example1/win7_include.h"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Project settings&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It is needed to add extra linkage libraries options to the linker. &lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;LIBS += libcomctl32 libole32&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Creating the thumbnail toolbar&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In short you need to do the following:&lt;br /&gt;1) Create an instance to the ITaskbarList3 COM interface&lt;br /&gt;2) Create a list of images and add it to the thumbnail toolbar&lt;br /&gt;3) Create a list of thumbnail toolbar buttons and add it to the toolbar&lt;br /&gt;4) Update the buttons or the images when needed&lt;br /&gt;&lt;br /&gt;What you can do:&lt;br /&gt;1) Show/hide, disable/enable, change button details, update the image list&lt;br /&gt;2) Have a thumbnail toolbar per program's window&lt;br /&gt;&lt;br /&gt;What you can't do:&lt;br /&gt;1) Add more than 7 buttons to the toolbar&lt;br /&gt;2) Remove the toolbar (it will be destroyed when the window associated to it will be destroyed.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Initialize the ITaskbarList3 COM interface&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Firstly you need to implement your own winEvent function. This can be done by overriding the QMainWindow's winEvent protected function.&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;class MainWindow : public QMainWindow&lt;br /&gt;{&lt;br /&gt;//...&lt;br /&gt;protected:&lt;br /&gt;     bool winEvent(MSG * message, long * result);&lt;br /&gt;//...&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In order to initialize the ITaskbarList3 COM interface it is needed to register the &lt;br /&gt;"TaskbarButtonCreated" event.&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;//..&lt;br /&gt;unsigned int messageId = RegisterWindowMessage(L"TaskbarButtonCreated");&lt;br /&gt;//..&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;When the event is registered, it is possible to obtain access to ITaskbarList3.&lt;br /&gt;&lt;br /&gt;Putting all together:&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;//...&lt;br /&gt;bool MainWindow::winEvent(MSG * message, long * result)&lt;br /&gt;{&lt;br /&gt;    static UINT taskBarCreatedId = WM_NULL;&lt;br /&gt;    if (taskBarCreatedId == WM_NULL) {&lt;br /&gt;        taskBarCreatedId = RegisterWindowMessage(L"TaskbarButtonCreated");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (message-&amp;gt;message == taskBarCreatedId) {&lt;br /&gt;        //initialize the ITaskbarList3 interface&lt;br /&gt;    } &lt;br /&gt;&lt;br /&gt;    return false;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Initializing the Interface&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;//..&lt;br /&gt;void MainWindow::W7ToolbarInit() {&lt;br /&gt;    HRESULT hr = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList3,&lt;br /&gt;                                  reinterpret_cast&amp;lt;void**&amp;gt; (&amp;amp;(m_w7toolbar)));&lt;br /&gt;&lt;br /&gt;    if (SUCCEEDED(hr)){&lt;br /&gt;&lt;br /&gt;        hr = m_w7toolbar-&amp;gt;HrInit();&lt;br /&gt;&lt;br /&gt;        if (FAILED(hr)) {&lt;br /&gt;            m_w7toolbar-&amp;gt;Release();&lt;br /&gt;            m_w7toolbar = NULL;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;//..&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Create the list of images&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The images I used in the project were PNG files 20x20 pixels, 32 bit, with transparency.&lt;br /&gt;&lt;br /&gt;Create the image list to hold 4 images:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;HIMAGELIST himl = ImageList_Create(20, 20, ILC_COLOR32, 4, 0);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Add the images to the list:&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;QPixmap img;&lt;br /&gt;QBitmap mask;&lt;br /&gt;&lt;br /&gt;img = QIcon(":/back.png").pixmap(20);&lt;br /&gt;mask  = img.createMaskFromColor(Qt::transparent);&lt;br /&gt;ImageList_Add(himl, img.toWinHBITMAP(QPixmap::PremultipliedAlpha), mask.toWinHBITMAP());&lt;br /&gt;&lt;br /&gt;//repeat the same thing for the rest of the images&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Set the thumbnailtoolbar's image list to the :&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;m_w7toolbar-&amp;gt;ThumbBarSetImageList(this-&amp;gt;winId(), himl);&lt;br /&gt;&lt;/pre&gt;"this" is a pointer to a QMainWindow object, but it also can be a QWidget pointer.&lt;br /&gt;&lt;br /&gt;Free the allocated memory:&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;ImageList_Destroy(himl);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Add the buttons&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Each button structure holds information about the button. Such as image index, the index from the image list, tool tip text, state, visibility and other flags.&lt;br /&gt;&lt;br /&gt;It is important to remember, the thumbnail toolbar can't hold more than 7 buttons. &lt;br /&gt;&lt;br /&gt;Let's say we want to have three buttons:&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;class MainWindow : public QMainWindow&lt;br /&gt;{&lt;br /&gt;//..&lt;br /&gt;     THUMBBUTTON m_thbButtons[3];&lt;br /&gt;//..&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Initializing and adding the buttons:&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;#define IDTB_FIRST 3000&lt;br /&gt;&lt;br /&gt;void MainWindow::W7ToolbarButtonsInit() {&lt;br /&gt;    QString tooltips[3] = {"Prev", "Play", "Next"};&lt;br /&gt;&lt;br /&gt;    for (int index = 0; index &amp;lt; 3; index++) {&lt;br /&gt;        wcscpy(m_thbButtons[index].szTip, tooltips[index].toStdWString().c_str());&lt;br /&gt;&lt;br /&gt;        //the ID of the button&lt;br /&gt;        m_thbButtons[index].iId = IDTB_FIRST + index;&lt;br /&gt;        //the image of the button, index from the image list&lt;br /&gt;        m_thbButtons[index].iBitmap = index;&lt;br /&gt;        &lt;br /&gt;        //show tooltip and use the bitmpap index&lt;br /&gt;        m_thbButtons[index].dwMask = (THUMBBUTTONMASK)(THB_BITMAP | THB_FLAGS | THB_TOOLTIP);&lt;br /&gt;&lt;br /&gt;        //set the button enabled&lt;br /&gt;        m_thbButtons[index].dwFlags = (THUMBBUTTONFLAGS)(THBF_ENABLED);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    //set the buttons&lt;br /&gt;    m_w7toolbar-&amp;gt;ThumbBarAddButtons(this-&amp;gt;winId(), 3, m_thbButtons);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Once the buttons are added, they should be visible.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Catching the thumbnailtoolbar click events&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;When a button is pressed, an event with the button's id is generated. These events can be caught in the winEvent function.&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;//...&lt;br /&gt;bool MainWindow::winEvent(MSG * message, long * result)&lt;br /&gt;{&lt;br /&gt;    static UINT taskBarCreatedId = WM_NULL;&lt;br /&gt;    if (taskBarCreatedId == WM_NULL) {&lt;br /&gt;        taskBarCreatedId = RegisterWindowMessage(L"TaskbarButtonCreated");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (message-&amp;gt;message == taskBarCreatedId) {&lt;br /&gt;        W7ToolbarInit();&lt;br /&gt;        W7ToolbarSetImages();&lt;br /&gt;        W7ToolbarButtonsInit();&lt;br /&gt;&lt;br /&gt;    } else switch (message-&amp;gt;message){&lt;br /&gt;    case WM_COMMAND:&lt;br /&gt;        {&lt;br /&gt;            //get the button index&lt;br /&gt;            int buttonId = LOWORD(message-&amp;gt;wParam) - IDTB_FIRST;&lt;br /&gt;&lt;br /&gt;            if ((buttonId &amp;gt;= 0) &amp;amp;&amp;amp; (buttonId &amp;lt; 3)) {&lt;br /&gt;&lt;br /&gt;                qDebug() &amp;lt;&amp;lt; "Button " &amp;lt;&amp;lt; buttonId &amp;lt;&amp;lt; " was pressed";&lt;br /&gt;                if (buttonId == 1) { //if "Play|Pause" was pressed&lt;br /&gt;&lt;br /&gt;                    if (m_thbButtons[1].iBitmap == 1) {&lt;br /&gt;                        //set the Pause image index&lt;br /&gt;                        m_thbButtons[1].iBitmap = 3;&lt;br /&gt;                        wcscpy(m_thbButtons[1].szTip, L"Pause");&lt;br /&gt;                    } else {&lt;br /&gt;                        //set the Play image index&lt;br /&gt;                        m_thbButtons[1].iBitmap = 1;&lt;br /&gt;                        wcscpy(m_thbButtons[1].szTip, L"Play");&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    //update the thumbnailtoolbar&lt;br /&gt;                    m_w7toolbar-&amp;gt;ThumbBarUpdateButtons(this-&amp;gt;winId(), 3, m_thbButtons);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    default:&lt;br /&gt;        return false;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return false;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The code can be downloaded from &lt;a href="https://github.com/xfreebird/blogstuff/tree/master/qt/toolbar_example1"&gt;here&lt;/a&gt;.&lt;br /&gt;The screenshot can be seen below:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-TdDJWjJEOBI/TYsbUujjccI/AAAAAAAABZY/yuiMcsK71OA/s1600/thumbnailtoolbar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="260" src="https://lh5.googleusercontent.com/-TdDJWjJEOBI/TYsbUujjccI/AAAAAAAABZY/yuiMcsK71OA/s640/thumbnailtoolbar.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-2906185494298289192?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/2906185494298289192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=2906185494298289192' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/2906185494298289192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/2906185494298289192'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2011/03/windows-7-taskbar-extensions-in-qt.html' title='Windows 7 Taskbar Extensions in Qt: Thumbnail Toolbar'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-TdDJWjJEOBI/TYsbUujjccI/AAAAAAAABZY/yuiMcsK71OA/s72-c/thumbnailtoolbar.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-8313101625747588017</id><published>2011-01-27T11:48:00.026+02:00</published><updated>2011-03-24T11:07:42.518+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7 overlay icon'/><category scheme='http://www.blogger.com/atom/ns#' term='progress bar'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt Taskbar Windows 7'/><category scheme='http://www.blogger.com/atom/ns#' term='ITaskbarList3'/><title type='text'>Windows 7 Taskbar Extensions in Qt: Taskbar Overlay Icon and Progress bar</title><content type='html'>&lt;span style="font-size:110%;"&gt;&lt;br /&gt;Contents&lt;br /&gt;&lt;br /&gt;&lt;a href=#H11&gt;ITaskbarList3 and GCC&lt;/a&gt;&lt;br /&gt;&lt;a href=#H12&gt;Preparation&lt;/a&gt;&lt;br /&gt;&lt;a href=#H13&gt;Initializing the Interface&lt;/a&gt;&lt;br /&gt;&lt;a href=#H14&gt;Setting the Overlay Icon&lt;/a&gt;&lt;br /&gt;&lt;a href=#H15&gt;Set the Progress Bar State and Value&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="H11"&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;ITaskbarList3 and GCC&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To access the Taskbar button from Qt with MINGW it is needed to declare the ITaskbarList3 COM interface, define CLSID_TaskbarList and IID_ITaskbarList3. And to declare used structs (THUMBBUTTON) and enums (TBPFLAG, THUMBBUTTONFLAGS, THUMBBUTTONMASK). All this can be done by finding their declarations in the Windows 7 SDK header file ShObjIdl.h, and adapting them for MINGW GCC in a separate header file.&lt;br /&gt;In my previous post I have explained how this can be accomplished.&lt;br /&gt;The result can be viewed &lt;a href="https://github.com/xfreebird/blogstuff/blob/master/qt/taskbar_example1/winutils.h"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;ITaskbarList3 COM interface adapted for MINGW GCC:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;//MIDL_INTERFACE("56FDF342-FD6D-11d0-958A-006097C9A090")&lt;br /&gt;DECLARE_INTERFACE_(ITaskbarList, IUnknown)&lt;br /&gt;{&lt;br /&gt;    STDMETHOD (HrInit) (THIS) PURE;&lt;br /&gt;    STDMETHOD (AddTab) (THIS_ HWND hwnd) PURE;&lt;br /&gt;    STDMETHOD (DeleteTab) (THIS_ HWND hwnd) PURE;&lt;br /&gt;    STDMETHOD (ActivateTab) (THIS_ HWND hwnd) PURE;&lt;br /&gt;    STDMETHOD (SetActiveAlt) (THIS_ HWND hwnd) PURE;&lt;br /&gt;};&lt;br /&gt;typedef ITaskbarList *LPITaskbarList;&lt;br /&gt;&lt;br /&gt;//MIDL_INTERFACE("602D4995-B13A-429b-A66E-1935E44F4317")&lt;br /&gt;DECLARE_INTERFACE_(ITaskbarList2, ITaskbarList)&lt;br /&gt;{&lt;br /&gt;    STDMETHOD (MarkFullscreenWindow) (THIS_ HWND hwnd, int fFullscreen) PURE;&lt;br /&gt;};&lt;br /&gt;typedef ITaskbarList2 *LPITaskbarList2;&lt;br /&gt;&lt;br /&gt;//MIDL_INTERFACE("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")&lt;br /&gt;DECLARE_INTERFACE_(ITaskbarList3, ITaskbarList2)&lt;br /&gt;{&lt;br /&gt;    STDMETHOD (SetProgressValue) (THIS_ HWND hwnd, ULONGLONG ullCompleted, ULONGLONG ullTotal) PURE;&lt;br /&gt;    STDMETHOD (SetProgressState) (THIS_ HWND hwnd, TBPFLAG tbpFlags) PURE;&lt;br /&gt;    STDMETHOD (RegisterTab) (THIS_ HWND hwndTab,HWND hwndMDI) PURE;&lt;br /&gt;    STDMETHOD (UnregisterTab) (THIS_ HWND hwndTab) PURE;&lt;br /&gt;    STDMETHOD (SetTabOrder) (THIS_ HWND hwndTab, HWND hwndInsertBefore) PURE;&lt;br /&gt;    STDMETHOD (SetTabActive) (THIS_ HWND hwndTab, HWND hwndMDI, DWORD dwReserved) PURE;&lt;br /&gt;    STDMETHOD (ThumbBarAddButtons) (THIS_ HWND hwnd, UINT cButtons, LPTHUMBBUTTON pButton) PURE;&lt;br /&gt;    STDMETHOD (ThumbBarUpdateButtons) (THIS_ HWND hwnd, UINT cButtons, LPTHUMBBUTTON pButton) PURE;&lt;br /&gt;    STDMETHOD (ThumbBarSetImageList) (THIS_ HWND hwnd, HIMAGELIST himl) PURE;&lt;br /&gt;    STDMETHOD (SetOverlayIcon) (THIS_ HWND hwnd, HICON hIcon, LPCWSTR pszDescription) PURE;&lt;br /&gt;    STDMETHOD (SetThumbnailTooltip) (THIS_ HWND hwnd, LPCWSTR pszTip) PURE;&lt;br /&gt;    STDMETHOD (SetThumbnailClip) (THIS_ HWND hwnd, RECT *prcClip) PURE;&lt;br /&gt;};&lt;br /&gt;typedef ITaskbarList3 *LPITaskbarList3;&lt;br /&gt;&lt;br /&gt;//MIDL_INTERFACE("c43dc798-95d1-4bea-9030-bb99e2983a1a")&lt;br /&gt;DECLARE_INTERFACE_(ITaskbarList4, ITaskbarList3)&lt;br /&gt;{&lt;br /&gt;    STDMETHOD (SetTabProperties) (HWND hwndTab, STPFLAG stpFlags) PURE;&lt;br /&gt;};&lt;br /&gt;typedef ITaskbarList4 *LPITaskbarList4;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Also is important to add to your project settings (the .pro file) the needed libraries to link with:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;LIBS +=  libole32&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="H12"&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Preparation&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In my example I'm using an object derived from QMainWindow.&lt;br /&gt;&lt;br /&gt;First thing I did, I re-implemented the protected virtual function of the QMainWindow in my derived class:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;protected:&lt;br /&gt;bool winEvent(MSG * message, long * result);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This functions is needed in order to catch the message which says that the taskbar button is created and ready to be used.&lt;br /&gt;&lt;br /&gt;In order to make Windows to initialize the taskbar button for my application, it is needed to call the following function:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;RegisterWindowMessage(L"TaskbarButtonCreated");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This function returns the message id which I'm waiting in winEvent.&lt;br /&gt;When I get this message id, I know I can initialize and use the taskbar button.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;//...&lt;br /&gt;//some where in the constructor of the MainWindow&lt;br /&gt;messageId = RegisterWindowMessage(L"TaskbarButtonCreated");&lt;br /&gt;&lt;br /&gt;//...&lt;br /&gt;bool MainWindow::winEvent(MSG * message, long * result)&lt;br /&gt;{&lt;br /&gt;if (message-&gt;message == messageId) {&lt;br /&gt;&lt;br /&gt;//get taskbar handle interface&lt;br /&gt;//do stuff&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;//...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="H13"&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Initializing the Interface&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When the message id is received in winEvent, it is possible to initialize the interface&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;//...&lt;br /&gt;ITaskbarList3* m_taskbarInterface;&lt;br /&gt;//...&lt;br /&gt;&lt;br /&gt;HRESULT hr = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList3, reinterpret_cast&amp;lt;void**&amp;gt; (&amp;amp;(m_taskbarInterface)));&lt;br /&gt;&lt;br /&gt;if (SUCCEEDED(hr)) {&lt;br /&gt;hr = m_taskbarInterface-&gt;HrInit();&lt;br /&gt;&lt;br /&gt;if (FAILED(hr)) {&lt;br /&gt;m_taskbarInterface-&gt;Release();&lt;br /&gt;m_taskbarInterface = NULL;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="H14"&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Setting the Overlay Icon&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This operation is very simple, once we have the taskbar interface intialized.&lt;br /&gt;&lt;br /&gt;Step 1: Create a QIcon:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;QIcon icon(":/icon.png")&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Step 2: Convert QIcon to HICON:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;HICON overlay_icon = icon.isNull() ? NULL : icon.pixmap(48).toWinHICON();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Step 3: Set the HICON as overlay icon. If NULL, the previous overlay icon will be removed&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;m_taskbarInterface-&gt;SetOverlayIcon(winId(), overlay_icon, L"Icon description");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Step 4: Release HICON resources&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;DestroyIcon(overlay_icon);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;One important thing, is that overlay icons are not shown if the Taskbar is set to use small icons.&lt;br /&gt;&lt;br /&gt;&lt;a name="H15"&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Set the Progress Bar State and Value&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The progress bar has five states, they are defined in the TBPFLAG enum.&lt;br /&gt;&lt;br /&gt;Setting the desired state:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;//set no progress&lt;br /&gt;m_taskbarInterface-&gt;SetProgressState(winId(), TBPF_NOPROGRESS);&lt;br /&gt;&lt;br /&gt;//set normal&lt;br /&gt;m_taskbarInterface-&gt;SetProgressState(winId(), TBPF_NORMAL);&lt;br /&gt;&lt;br /&gt;//set indeterminate&lt;br /&gt;m_taskbarInterface-&gt;SetProgressState(winId(), TBPF_INDETERMINATE);&lt;br /&gt;&lt;br /&gt;//set paused&lt;br /&gt;m_taskbarInterface-&gt;SetProgressState(winId(), TBPF_PAUSED);&lt;br /&gt;&lt;br /&gt;//set error&lt;br /&gt;m_taskbarInterface-&gt;SetProgressState(winId(), TBPF_ERROR);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Setting the current value:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;m_taskbarInterface-&gt;SetProgressValue(winId(), current_value, max_value);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It is important to release the allocated resources, when the application is being closed:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;m_taskbarInterface-&gt;Release();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Below is a screen shot of the application:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_IPsgxrqSYz4/TUFJwsaUFeI/AAAAAAAABXs/Na6heBA4NKU/s1600/op.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 306px; height: 248px;" src="http://2.bp.blogspot.com/_IPsgxrqSYz4/TUFJwsaUFeI/AAAAAAAABXs/Na6heBA4NKU/s320/op.png" alt="" id="BLOGGER_PHOTO_ID_5566811715310720482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The Qt Project can be found &lt;a href="https://github.com/xfreebird/blogstuff/tree/master/qt/taskbar_example1"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Links:&lt;br /&gt;&lt;a href="http://www.msec.it/blog/?p=157"&gt;Link to EcWin7, from here I understood how to import COM declarations from Windows SDK headers and about RegisterWindowMessage&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-8313101625747588017?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/8313101625747588017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=8313101625747588017' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/8313101625747588017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/8313101625747588017'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2011/01/windows-7-taskbar-extensions-in-qt.html' title='Windows 7 Taskbar Extensions in Qt: Taskbar Overlay Icon and Progress bar'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_IPsgxrqSYz4/TUFJwsaUFeI/AAAAAAAABXs/Na6heBA4NKU/s72-c/op.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-1393742805636001452</id><published>2011-01-26T14:36:00.039+02:00</published><updated>2011-01-27T15:46:56.705+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jump List'/><category scheme='http://www.blogger.com/atom/ns#' term='IShellLink'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7 SDK'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='Task'/><category scheme='http://www.blogger.com/atom/ns#' term='IShellItem'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt Taskbar Windows 7'/><category scheme='http://www.blogger.com/atom/ns#' term='taskbar'/><category scheme='http://www.blogger.com/atom/ns#' term='ICustomDestinationList'/><title type='text'>Windows 7 Taskbar Extensions in Qt: Jump List</title><content type='html'>&lt;span style="font-size:110%;"&gt;&lt;br /&gt;Contents&lt;br /&gt;&lt;br /&gt;&lt;a href="#H11"&gt;Preparation&lt;/a&gt;&lt;br /&gt;&lt;a href="#H12"&gt;Working With Jump Lists&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As of Windows 7 the taskbar has become more efficient, and has a lot of new features. Such as Jump List, Thumbnails, Thumbnail toolbar, Overlay Icons, Progress bar and other things.&lt;br /&gt;&lt;br /&gt;This article focuses on how to manage/customize a Jump List using Qt with GCC.&lt;br /&gt;&lt;br /&gt;A Jump List is like a customized Start menu for your application. It can contain Destinations and Tasks. A Destination can be a link to a file, location, URL. A Task can be viewed as an action or command which the application can perform.&lt;br /&gt;&lt;br /&gt;It contains two built-in Destinations categories, Recent and Frequent. These lists are managed automatically.&lt;br /&gt;By default a Jump List contains a Recent category. Each time a file is opened with the application, or file-based applications through SHAddToRecentDocs, or the common file dialog, it will be added automatically to Recent and Frequent.&lt;br /&gt;&lt;br /&gt;&lt;a name="H11"&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Preparation&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;1) Register your application to handle a file type&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To enable the Recent category it is enough to register a file type with your application, and it is not necessary to be the default file-type handler.&lt;br /&gt;&lt;br /&gt;Below is a simple example of registry keys and values needed to register a .rgm file extension to C:\Path\to\bin\app.exe application.&lt;br /&gt;&lt;br /&gt;It is possible to copy this into a .reg file and import it.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;Windows Registry Editor Version 5.00&lt;br /&gt;&lt;br /&gt;[HKEY_CLASSES_ROOT\.rgm]&lt;br /&gt;@="rgm_auto_file"&lt;br /&gt;&lt;br /&gt;[HKEY_CLASSES_ROOT\rgm_auto_file]&lt;br /&gt;@="RGM file"&lt;br /&gt;&lt;br /&gt;[HKEY_CLASSES_ROOT\rgm_auto_file\DefaultIcon]&lt;br /&gt;@="C:\\Path\\to\\bin\\app.exe,1"&lt;br /&gt;&lt;br /&gt;[HKEY_CLASSES_ROOT\rgm_auto_file\shell]&lt;br /&gt;&lt;br /&gt;[HKEY_CLASSES_ROOT\rgm_auto_file\shell\Open]&lt;br /&gt;&lt;br /&gt;[HKEY_CLASSES_ROOT\rgm_auto_file\shell\Open\Command]&lt;br /&gt;@="C:\\Path\\to\\bin\\app.exe '%1'"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;2) Find and declare missing declarations of the needed COM interfaces, their CLSID and IID, and “friends” (enums, typedefs).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In order to be able to manage the Jump List from your application it is necessary to have access to different COM interfaces. Not all of them are accessible within MINGW with GCC.&lt;br /&gt;This can be done by finding their definitions in Windows 7 SDK header files.&lt;br /&gt;&lt;br /&gt;For instance:&lt;br /&gt;ICustomDestinationList is declared in c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\ShObjIdl.h:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;EXTERN_C const CLSID CLSID_DestinationList;&lt;br /&gt;#ifdef __cplusplus&lt;br /&gt;class DECLSPEC_UUID("77f10cf0-3db5-4966-b520-b7c54fd35ed6")&lt;br /&gt;DestinationList;&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;MIDL_INTERFACE("6332debf-87b5-4670-90c0-5e57b408a49e")&lt;br /&gt;ICustomDestinationList : public IUnknown&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;virtual HRESULT STDMETHODCALLTYPE SetAppID(&lt;br /&gt;/* [string][in] */ __RPC__in_string LPCWSTR pszAppID) = 0;&lt;br /&gt;&lt;br /&gt;virtual HRESULT STDMETHODCALLTYPE BeginList(&lt;br /&gt;/* [out] */ __RPC__out UINT *pcMinSlots,&lt;br /&gt;/* [in] */ __RPC__in REFIID riid,&lt;br /&gt;/* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0;&lt;br /&gt;&lt;br /&gt;virtual HRESULT STDMETHODCALLTYPE AppendCategory(&lt;br /&gt;/* [string][in] */ __RPC__in_string LPCWSTR pszCategory,&lt;br /&gt;/* [in] */ __RPC__in_opt IObjectArray *poa) = 0;&lt;br /&gt;&lt;br /&gt;virtual HRESULT STDMETHODCALLTYPE AppendKnownCategory(&lt;br /&gt;/* [in] */ KNOWNDESTCATEGORY category) = 0;&lt;br /&gt;&lt;br /&gt;virtual HRESULT STDMETHODCALLTYPE AddUserTasks(&lt;br /&gt;/* [in] */ __RPC__in_opt IObjectArray *poa) = 0;&lt;br /&gt;&lt;br /&gt;virtual HRESULT STDMETHODCALLTYPE CommitList( void) = 0;&lt;br /&gt;&lt;br /&gt;virtual HRESULT STDMETHODCALLTYPE GetRemovedDestinations(&lt;br /&gt;/* [in] */ __RPC__in REFIID riid,&lt;br /&gt;/* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0;&lt;br /&gt;&lt;br /&gt;virtual HRESULT STDMETHODCALLTYPE DeleteList(&lt;br /&gt;/* [string][unique][in] */ __RPC__in_opt_string LPCWSTR pszAppID) = 0;&lt;br /&gt;&lt;br /&gt;virtual HRESULT STDMETHODCALLTYPE AbortList( void) = 0;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;will become:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;DEFINE_GUID(CLSID_DestinationList,0x77f10cf0,0x3db5,0x4966,0xb5,0x20,0xb7,0xc5,0x4f,0xd3,0x5e,0xd6);&lt;br /&gt;DEFINE_GUID(IID_ICustomDestinationList,0x6332debf,0x87b5,0x4670,0x90,0xc0,0x5e,0x57,0xb4,0x08,0xa4,0x9e);&lt;br /&gt;&lt;br /&gt;DECLARE_INTERFACE_(ICustomDestinationList, IUnknown)&lt;br /&gt;{&lt;br /&gt;STDMETHOD (SetAppID) (LPCWSTR pszAppID);&lt;br /&gt;STDMETHOD (BeginList) (UINT *pcMinSlots, REFIID riid, void **ppv) PURE;&lt;br /&gt;STDMETHOD (AppendCategory) (LPCWSTR pszCategory, IObjectArray *poa) PURE;&lt;br /&gt;STDMETHOD (AppendKnownCategory) (KNOWNDESTCATEGORY category) PURE;&lt;br /&gt;STDMETHOD (AddUserTasks) (IObjectArray *poa) PURE;&lt;br /&gt;STDMETHOD (CommitList) (void) PURE;&lt;br /&gt;STDMETHOD (GetRemovedDestinations) (REFIID riid, void **ppv) PURE;&lt;br /&gt;STDMETHOD (DeleteList) (LPCWSTR pszAppID) PURE;&lt;br /&gt;STDMETHOD (AbortList)  (void) PURE;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;typedef ICustomDestinationList *LPICustomDestinationList;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="https://github.com/xfreebird/qwin7utils/blob/master/src/win7_include.h"&gt;Here you cand find more.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To perform different jobs on a Jump List you’ll need to declare more interfaces.&lt;br /&gt;&lt;br /&gt;Minimum needed to add items to Recent or/and create custom category:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;ICustomDestinationList, IObjectArray&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To create Tasks or/and to add customized items to Recent/Frequent/Custom list:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;ICustomDestinationList, IObjectArray, IShellItem, IShellLink, IPropertyStore&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;One other helpful hint, each time you encounter the following macro in Windows 7 SDK examples:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;IID_PPV_ARGS(&amp;amp;pItem)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;you can substitute it with&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;IID_Of_The_Item’s_Class, reinterpret_cast&amp;lt;void**&amp;gt;(&amp;amp;(pItem))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;3) Add to your Qt project file the needed libraries to link with&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;LIBS +=  libole32&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="H12"&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Working With Jump Lists&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;How to Add Items to Recent/Frequent list&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The simplest way to do this is to call&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;QString filePath("c:\\file.rgm");&lt;br /&gt;SHAddToRecentDocs(0x00000003, filePath.toStdWString().c_str());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If the file extension of the filePath is not registered to this application, this call will have no effect.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Show/hide Recent or/and Frequent list&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-style: italic;"&gt;Create the custom jump list object&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;ICustomDestinationList* destinationList;&lt;br /&gt;CoCreateInstance(CLSID_DestinationList, NULL, CLSCTX_INPROC_SERVER, IID_ICustomDestinationList, reinterpret_cast&amp;lt;void**&amp;gt; (&amp;amp;(destinationList)));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- &lt;span style="font-style: italic;"&gt;Initialize the list&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;UINT max_count;&lt;br /&gt;IObjectArray* objectArray;&lt;br /&gt;destinationList-&gt;BeginList(&amp;amp;max_count, IID_IObjectArray, reinterpret_cast&amp;lt;void**&amp;gt; (&amp;amp;(objectArray)));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This function will start a “transaction”.&lt;br /&gt;&lt;br /&gt;Returned values through max_count represents the max allowed recent items to display in Jump List, and objectArray holds the items which have been removed by the user.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-style: italic;"&gt;Enable the Frequent list&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;destinationList-&gt;AppendKnownCategory(KDC_FREQUENT);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- &lt;span style="font-style: italic;"&gt;Enable the Recent list&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;destinationList-&gt;AppendKnownCategory(KDC_RECENT);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-style: italic;"&gt;Commit the menu “transaction”&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;destinationList-&gt;CommitList();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The whole example can be found here :&lt;br /&gt;&lt;a href="https://github.com/xfreebird/blogstuff/tree/master/qt/jumplist_example1"&gt;https://github.com/xfreebird/blogstuff/tree/master/qt/jumplist_example1&lt;/a&gt;&lt;br /&gt;For simplicity there are no checks for valid pointers or initialization results.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Creating a Custom Jump List Cateogry&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- The first step is to declare the COM interfaces, enums and typedefs for:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;ICustomDestinationList, IObjectCollection, IObjectArray, IShellItem, IShellLink, IPropertyStore&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;All the details can be found &lt;a href="https://github.com/xfreebird/blogstuff/blob/master/qt/jumplist_example2/winutils.h"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;- It is needed to find a way to initialize a IShellItem, providing just a valid file path.&lt;br /&gt;I chose to call SHCreateItemFromParsingName. But since it is declared in Shobjidl.h, I can’t include this file with GCC. So I have to load this function from the shell32.dll itself.&lt;br /&gt;&lt;br /&gt;Typedef a function pointer type:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;extern "C"&lt;br /&gt;{&lt;br /&gt;typedef HRESULT (WINAPI *t_SHCreateItemFromParsingName)(PCWSTR pszPath, IBindCtx *pbc, REFIID riid, void **ppv);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;then use it:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;  IShellItem* FilePath2ShellItem(QString path) {&lt;br /&gt;  HMODULE shell;&lt;br /&gt;  IShellItem *shell_item = NULL;&lt;br /&gt;  t_SHCreateItemFromParsingName SHCreateItemFromParsingName = NULL;&lt;br /&gt;&lt;br /&gt;  shell = LoadLibrary(L"shell32.dll");&lt;br /&gt;&lt;br /&gt;  if (shell) {&lt;br /&gt;         SHCreateItemFromParsingName = reinterpret_cast&amp;lt;t_SHCreateItemFromParsingName&amp;gt;(GetProcAddress (shell, "SHCreateItemFromParsingName"));&lt;br /&gt;&lt;br /&gt;         if (SHCreateItemFromParsingName != NULL) {&lt;br /&gt;             SHCreateItemFromParsingName(path.toStdWString().c_str(), NULL, IID_IShellItem, reinterpret_cast&amp;lt;void**&amp;gt; (&amp;amp;(shell_item)));&lt;br /&gt;         }&lt;br /&gt;&lt;br /&gt;         FreeLibrary (shell);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return shell_item;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- Init a ICustomDestinationList:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;UINT max_count = 0;&lt;br /&gt;IObjectArray* objectArray;&lt;br /&gt;ICustomDestinationList* destinationList;&lt;br /&gt;&lt;br /&gt;//create the custom jump list object&lt;br /&gt;CoCreateInstance(CLSID_DestinationList, NULL, CLSCTX_INPROC_SERVER, IID_ICustomDestinationList, reinterpret_cast&amp;lt;void**&amp;gt; (&amp;amp;(destinationList)));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- Start the “transaction” :&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;destinationList-&gt;BeginList(&amp;amp;max_count, IID_IObjectArray, reinterpret_cast&amp;lt;void**&amp;gt; (&amp;amp;(objectArray)));&lt;br /&gt;&lt;br /&gt;IObjectCollection* obj_collection;&lt;br /&gt;CoCreateInstance(CLSID_EnumerableObjectCollection, NULL,&lt;br /&gt;    CLSCTX_INPROC, IID_IObjectCollection, reinterpret_cast&amp;lt;void**&amp;gt; (&amp;amp;(obj_collection)));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- Init an object array from obj_collection:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;IObjectArray* object_array;&lt;br /&gt;&lt;br /&gt;obj_collection-&gt;QueryInterface(IID_IObjectArray, reinterpret_cast&amp;lt;void**&amp;gt; (&amp;amp;(object_array)));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- Create and add shell items to this object_array. It is important to know, if the file path is not valid, or the file extension is not registered to this application, SHCreateItemFromParsingName will fail to create a valid IShellItem.&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;obj_collection-&gt;AddObject(FilePath2ShellItem("C:\\file1.rgm"));&lt;br /&gt;obj_collection-&gt;AddObject(FilePath2ShellItem("C:\\file2.rgm"));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- Add the object array as a new category in the Jump List:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;destinationList-&gt;AppendCategory(L“Custom entry”, object_array);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- Commit the changes:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;destinationList-&gt;CommitList();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- Release the resources:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;object_array-&gt;Release();&lt;br /&gt;obj_collection-&gt;Release();&lt;br /&gt;objectArray-&gt;Release();&lt;br /&gt;destinationList-&gt;Release();&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_IPsgxrqSYz4/TUAfFn-qB-I/AAAAAAAABXU/4jRj5dSl-nk/s1600/custom_entry.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 232px; height: 183px;" src="http://3.bp.blogspot.com/_IPsgxrqSYz4/TUAfFn-qB-I/AAAAAAAABXU/4jRj5dSl-nk/s320/custom_entry.png" alt="" id="BLOGGER_PHOTO_ID_5566483320921524194" border="0" /&gt;&lt;/a&gt;The Result&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The code can be found here &lt;a href="https://github.com/xfreebird/blogstuff/tree/master/qt/jumplist_example2"&gt;https://github.com/xfreebird/blogstuff/tree/master/qt/jumplist_example2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Adding Tasks&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;To populate the Tasks list it is needed to create a collection of IShellLinks and call &lt;/span&gt;&lt;/span&gt;ICustomDestinationList::AddUserTasks.&lt;br /&gt;&lt;br /&gt;As previously this must be done after calling ICustomDestinationList::BeginList,&lt;br /&gt;and applying it by calling ICustomDestinationList::CommiList after.&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:100%;"&gt;A task is a shortcut.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To create a task item can be used the code below:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;IShellLink* shell_link = NULL;&lt;br /&gt;CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, reinterpret_cast&amp;lt;void**&amp;gt; (&amp;amp;(shell_link)));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Set the values:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;shell_link-&gt;SetPath(L"C:\\path\\to\\app.exe");&lt;br /&gt;shell_link-&gt;SetArguments(L"Some args");&lt;br /&gt;shell_link-&gt;SetIconLocation(L"C:\\path\\to\\app.exe", app_index);&lt;br /&gt;shell_link-&gt;SetDescription(L"Description");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To set the title we need to use a IPropertyStore object.&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;PROPVARIANT pv;&lt;br /&gt;IPropertyStore* prop_store = NULL;&lt;br /&gt;shell_link-&gt;QueryInterface(IID_IPropertyStore, reinterpret_cast&amp;lt;void**&amp;gt; (&amp;amp;(prop_store)));&lt;br /&gt;&lt;br /&gt;InitPropVariantFromString(L"Title", &amp;amp;pv);&lt;br /&gt;prop_store-&gt;SetValue(PKEY_Title, pv);&lt;br /&gt;prop_store-&gt;Commit();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If we want this item to be a separator:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;PROPVARIANT pv;&lt;br /&gt;IPropertyStore* prop_store = NULL;&lt;br /&gt;shell_link-&gt;QueryInterface(IID_IPropertyStore, reinterpret_cast&amp;lt;void**&amp;gt; (&amp;amp;(prop_store)));&lt;br /&gt;&lt;br /&gt;InitPropVariantFromBoolean(TRUE, &amp;amp;pv);&lt;br /&gt;prop_store-&gt;SetValue(PKEY_AppUserModel_IsDestListSeparator, pv);&lt;br /&gt;prop_store-&gt;Commit();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The rest is almost similar to the example of creating a custom category.&lt;br /&gt;&lt;br /&gt;Instead of:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;obj_collection-&gt;AddObject(FilePath2ShellItem("C:\\file1.rgm"));&lt;br /&gt;obj_collection-&gt;AddObject(FilePath2ShellItem("C:\\file2.rgm"));&lt;br /&gt;destinationList-&gt;AppendCategory(L“Custom entry”, object_array);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;will be&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;obj_collection-&gt;AddObject(CreateShellLink("Task 1", "Task Description", "C:\\path\\to\\app.exe", "app args", "c:\\path\\to\\ico\\resources", 0));&lt;br /&gt;&lt;br /&gt;destinationList-&gt;AddUserTasks(object_array);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_IPsgxrqSYz4/TUA3Au9SM-I/AAAAAAAABXk/QChRvtaxIW4/s1600/tasks.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 228px; height: 199px;" src="http://3.bp.blogspot.com/_IPsgxrqSYz4/TUA3Au9SM-I/AAAAAAAABXk/QChRvtaxIW4/s320/tasks.png" alt="" id="BLOGGER_PHOTO_ID_5566509625174537186" border="0" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_IPsgxrqSYz4/TUArNOT5ZAI/AAAAAAAABXc/wPdq1QljDfM/s1600/tasks.png"&gt;&lt;br /&gt;&lt;/a&gt;The created tasks from the example3&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The sources for the example 3 can be found here &lt;a href="https://github.com/xfreebird/blogstuff/tree/master/qt/jumplist_example3"&gt;https://github.com/xfreebird/blogstuff/tree/master/qt/jumplist_example3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Useful links:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd378460%28v=VS.85%29.aspx"&gt;Taskbar Extensions &lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff708696.aspx"&gt;Hilo: Developing C++ Applications for Windows 7&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/gg281362.aspx"&gt;Chapter 14: Adding Support for Windows 7 Jump Lists &amp;amp; Taskbar Tabs&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/b/yochay/archive/2009/01/06/windows-7-taskbar-part-1-the-basics.aspx"&gt;Windows 7 Taskbar – Part 1, The Basics&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.msdn.microsoft.com/shellintegration"&gt;Windows 7 SDK Examples&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeproject.com/KB/vista/SevenGoodiesJumpLists.aspx"&gt;CodeProject article on JumpLists&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeproject.com/KB/vista/SevenGoodiesJumpListTasks.aspx"&gt;CodeProject article on JumpLists Tasks&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.msec.it/blog/?p=157"&gt;Link to EcWin7, from here I understood how to import COM declarations from Windows SDK headers&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-1393742805636001452?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/1393742805636001452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=1393742805636001452' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/1393742805636001452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/1393742805636001452'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2011/01/windows-7-taskbar-extensions-in-qt-jump.html' title='Windows 7 Taskbar Extensions in Qt: Jump List'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_IPsgxrqSYz4/TUAfFn-qB-I/AAAAAAAABXU/4jRj5dSl-nk/s72-c/custom_entry.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-2105437647796023948</id><published>2008-11-08T21:00:00.026+02:00</published><updated>2011-07-04T17:08:55.998+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asus m50vc'/><category scheme='http://www.blogger.com/atom/ns#' term='m50vc-as006'/><category scheme='http://www.blogger.com/atom/ns#' term='laptop'/><category scheme='http://www.blogger.com/atom/ns#' term='asus'/><category scheme='http://www.blogger.com/atom/ns#' term='m50'/><title type='text'>A new laptop !!!</title><content type='html'>After I've been analyzing the notebook market since august, last week I made my final choice.&lt;br /&gt;My next laptop will be an &lt;a href="http://www.emag.ro/notebook_laptop/notebook-asus-m50vc-as006-intel-core2-duo-p7350-20ghz-4gb-320gb--pM50VC-AS006"&gt;ASUS M50VC-AS006&lt;/a&gt;. I am very excited about this laptop. It has almost everything I need and it meets all my minimal requirements.&lt;br /&gt;The HDD is the only part which I'll change with a &lt;a href="http://www.pcgarage.ro/hdd-notebook/fujitsu/320-gb-sata-7200-rpm-16-mb-mhz2-bj-series/"&gt;7200RPM HDD&lt;/a&gt; of the same capacity.&lt;br /&gt;My only compromise was on the brand of the CPU and video card. I wanted an AMD/ATI, but this laptop has Intel/nVIDIA. Anyway it was not a bad choice.&lt;br /&gt;In december my brother will bring me this laptop. Then I'll test it :D.&lt;br /&gt;I'll try Fedora 10 x64 &amp;amp; x32, MacOSX Leopard, Vista x64 &amp;amp; x32 and XP.&lt;br /&gt;My experience with all these OS's I'll post in this blog.&lt;br /&gt;&lt;br /&gt;I think I have to wait about 25 days until I'll be holding it in my hands. But till then work, work and work.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;UPDATE&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;It has passed  a very long time since I wrote this post.&lt;br /&gt;A short update :)&lt;br /&gt;&lt;br /&gt;I managed to install Fedora 15 64bit, Windows 7 64bit and Mac OS X (Snow Leopard 10.6.8 64bit) on this laptop. Although Fedora is my preferred default target.&lt;br /&gt;&lt;br /&gt;Now I have triple-boot. I'm using grub and chameleon bootloaders (for loading OSX kernel).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-2105437647796023948?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/2105437647796023948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=2105437647796023948' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/2105437647796023948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/2105437647796023948'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2008/11/new-laptop.html' title='A new laptop !!!'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-2419500114594792816</id><published>2008-11-08T20:41:00.004+02:00</published><updated>2008-11-08T21:19:49.256+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='popshore'/><category scheme='http://www.blogger.com/atom/ns#' term='Job'/><category scheme='http://www.blogger.com/atom/ns#' term='ghimbovschi'/><title type='text'>I have a new job</title><content type='html'>I have to admit, this year is the worst from the perspective of planned/realized ratio.&lt;br /&gt;&lt;br /&gt;My biggest failures are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;trying to work in Romania as a software developer (my previous employer could not pay me anymore)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;finishing my thesis (is rescheduled for the next year)&lt;/li&gt;&lt;li&gt;trying to sleep less&lt;/li&gt;&lt;/ul&gt;Since it is almost impossible to retry this year to get a job in Romania (because of the process, it takes a lot of time). I began to search a job in Moldova. Finally I found one.&lt;br /&gt;&lt;br /&gt;I'll be working at &lt;a href="http://www.popshore.com/"&gt;Popshore&lt;/a&gt; as a C++ developer from Monday.&lt;br /&gt;&lt;br /&gt;The advantages working at this company are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Coding C++&lt;/li&gt;&lt;li&gt;Working in Linux environment&lt;/li&gt;&lt;li&gt;...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Disadvantages:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Small salaries&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;/ul&gt;Hope I'll have fun working there :). Otherwise it will be a psychological a suicide.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-2419500114594792816?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/2419500114594792816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=2419500114594792816' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/2419500114594792816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/2419500114594792816'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2008/11/i-have-new-job.html' title='I have a new job'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-303710022619099905</id><published>2008-06-30T22:57:00.011+03:00</published><updated>2008-07-01T02:26:33.562+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Moldova'/><category scheme='http://www.blogger.com/atom/ns#' term='moldovajob.md'/><category scheme='http://www.blogger.com/atom/ns#' term='jobmarket.gov.md'/><category scheme='http://www.blogger.com/atom/ns#' term='Job'/><category scheme='http://www.blogger.com/atom/ns#' term='hr.md'/><category scheme='http://www.blogger.com/atom/ns#' term='joburi.md'/><category scheme='http://www.blogger.com/atom/ns#' term='job offers'/><title type='text'>Searching for an IT job in Moldova ?</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_IPsgxrqSYz4/SGlSASemQoI/AAAAAAAAA2E/PHkl5OOfN8s/s1600-h/JobSearchNewspaper.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 196px; height: 146px;" src="http://3.bp.blogspot.com/_IPsgxrqSYz4/SGlSASemQoI/AAAAAAAAA2E/PHkl5OOfN8s/s400/JobSearchNewspaper.jpg" alt="" id="BLOGGER_PHOTO_ID_5217791808199082626" border="0" /&gt;&lt;/a&gt;I don't want to work in Moldova.&lt;br /&gt;&lt;/div&gt;Why ?&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_IPsgxrqSYz4/SGlSASemQoI/AAAAAAAAA2E/PHkl5OOfN8s/s1600-h/JobSearchNewspaper.jpg"&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;I'm searching for a new place where I can see a different society.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The offers are not diverse ( Is like in a shop from the soviet era. Where you buy what they have, not what you want. And the offer is limited.)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Employees are greedy&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Small salaries&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Bla bla bla ...&lt;/li&gt;&lt;/ul&gt;I'm going to work in Romania !!!&lt;br /&gt;Romania is not heaven. The Romanian IT job offers compared to those from Moldova are much better.&lt;br /&gt;&lt;br /&gt;In Moldova are few online job resources:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;http://www.joburi.md/&lt;/li&gt;&lt;li&gt;http://moldovajob.md/&lt;/li&gt;&lt;li&gt;http://www.hr.md/&lt;/li&gt;&lt;li&gt;http://www.jobmarket.gov.md/&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;http://joburi.md/ &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A good resource, it has Romanian and Russian web interface. You can place your CV, or if you are an employer , job offers.&lt;br /&gt;I like their searching system, a very intuitive one and easy to use.&lt;br /&gt;But it lacks new offers. The latest IT offer was placed on 23rd of June.&lt;br /&gt;Hence, not very useful.&lt;br /&gt;&lt;br /&gt;On a scale of 0 to 5 points, this site gets from me for:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;User interface experience - 5 points&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;The flow of new IT job offers - 3 points&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_IPsgxrqSYz4/SGlOtspv35I/AAAAAAAAA1k/r7j8_FCk5bE/s1600-h/joburi.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_IPsgxrqSYz4/SGlOtspv35I/AAAAAAAAA1k/r7j8_FCk5bE/s320/joburi.JPG" alt="" id="BLOGGER_PHOTO_ID_5217788190272774034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;http://moldovajob.md/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It is very rich in new IT offers, this is very cool. But the web interface is very poor designed.&lt;br /&gt;No search engine !!! The offers are like a bunch of Google adds on a web site.&lt;br /&gt;If you ever entered a Chinese or a Japanese  web site, then you now what I'm talking about.&lt;br /&gt;The page layout has two columns, and on both sides thronged with job offers.&lt;br /&gt;I think they don't understand that a web page is not a printed paper where such information is placed.&lt;br /&gt;Yes, you can place your CV. But I think that this is useless, since it has no search engine deployed. Available only in Russian.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;User interface experience  - 1 point&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;The flow of new IT job offers - 5 points&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_IPsgxrqSYz4/SGlO5r8mSwI/AAAAAAAAA1s/ayQLPhm28RM/s1600-h/moldovajob.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_IPsgxrqSYz4/SGlO5r8mSwI/AAAAAAAAA1s/ayQLPhm28RM/s320/moldovajob.JPG" alt="" id="BLOGGER_PHOTO_ID_5217788396241832706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;http://www.hr.md/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As joburi.md it has a very good user interface, available in three languages Romanian, English and Russian. But it does not have the flow of new IT job offers as moldovajob.md.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;User interface experience&lt;/span&gt;   - 5 points&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;The flow of new IT job offers - 3 points&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_IPsgxrqSYz4/SGlPBw-eFvI/AAAAAAAAA10/g1ZKfabc6cU/s1600-h/hr.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_IPsgxrqSYz4/SGlPBw-eFvI/AAAAAAAAA10/g1ZKfabc6cU/s320/hr.JPG" alt="" id="BLOGGER_PHOTO_ID_5217788535030814450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;http://www.jobmarket.gov.md&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The web site is very well done. It has an intuitive search engine. It is available in Romanian and Russian language. It gives the ability to place your CV. But ... it has no IT job offers.&lt;br /&gt;The funny experience was when I selected the IT category http://jobmarket.gov.md/ro/searchwork/jobs/search/?Category=ittehnology , when I pressed "Cauta" search, it said&lt;br /&gt;"Selectati professia!" select you profession. Huh !? Excuse me, which one ?! :)) Did I miss something&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;User interface experience&lt;/span&gt;   - 5 points&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;The flow of new IT job offers - 0 points&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_IPsgxrqSYz4/SGlPMA80kkI/AAAAAAAAA18/zjFJA16Mi_w/s1600-h/anofm.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_IPsgxrqSYz4/SGlPMA80kkI/AAAAAAAAA18/zjFJA16Mi_w/s320/anofm.JPG" alt="" id="BLOGGER_PHOTO_ID_5217788711117558338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;In Romania such kind of web sites are much better. For example eJobs.ro or MyJob.ro.&lt;br /&gt;There is a very big leap between Moldova and Romania.&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;br /&gt;First image original source http://www.biojobblog.com/JobSearchNewspaper.jpg&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-303710022619099905?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/303710022619099905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=303710022619099905' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/303710022619099905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/303710022619099905'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2008/06/searching-for-it-job-in-moldova.html' title='Searching for an IT job in Moldova ?'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_IPsgxrqSYz4/SGlSASemQoI/AAAAAAAAA2E/PHkl5OOfN8s/s72-c/JobSearchNewspaper.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-364290300926749750</id><published>2008-06-27T23:32:00.005+03:00</published><updated>2008-06-28T00:14:52.606+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bike'/><category scheme='http://www.blogger.com/atom/ns#' term='accident'/><category scheme='http://www.blogger.com/atom/ns#' term='taxi'/><category scheme='http://www.blogger.com/atom/ns#' term='priority'/><category scheme='http://www.blogger.com/atom/ns#' term='bad day'/><category scheme='http://www.blogger.com/atom/ns#' term='lesson'/><category scheme='http://www.blogger.com/atom/ns#' term='suture'/><title type='text'>If I feel lazy about doing something that means I'd better not do it</title><content type='html'>What a day...&lt;br /&gt;&lt;br /&gt;Today I learnt a lesson , If I feel lazy about doing something that means I'd better not do it. :)&lt;br /&gt;&lt;br /&gt;I had to send the malfunctioning stereo to Bucharest. It was bought from there, and its guarantee&lt;br /&gt;license is still good.&lt;br /&gt;My task was to go to the railway station to ask a conductor to take that stereo, and give it&lt;br /&gt;to my brother.&lt;br /&gt;I put the stereo into my rucksack, took my bike and went to the railway station.&lt;br /&gt;&lt;br /&gt;At a crossroads with no semaphores ,I had the priority, a taxi decided to cut my way,&lt;br /&gt;although it had to wait for me to pass the crossroads. I had a high velocity. When I saw&lt;br /&gt;the situation, the only good action which I was thinking, in that fraction of a second, was to&lt;br /&gt;make a full stop...&lt;br /&gt;&lt;br /&gt;Well , it was a good solution, but my fault was that I did a full stop on both wheels.&lt;br /&gt;Bigggg mistake. As a result for a second I was superman with a lot of kryptonite in his pockets :)) .&lt;br /&gt;To my luck , I had protection gloves and a helmet. But my chin was not protected :( .&lt;br /&gt;So, I've got a skin cut under my chin, and a few scratches on my arms and legs.&lt;br /&gt;The stereo had just a little shock , nothing more.&lt;br /&gt;&lt;br /&gt;At that moment I did not feel the skin cut, the taxi even did not stop to ask me how I feel.&lt;br /&gt;So, I decided continue to bike to the railway station.&lt;br /&gt;&lt;br /&gt;While being on the road I noticed that the cut was bleeding.&lt;br /&gt;&lt;br /&gt;When I've arrived at the station, no conductor wanted to accept to take the stereo. Shit,&lt;br /&gt;,what for  did I do all that ?!&lt;br /&gt;&lt;br /&gt;Then I went home. There I saw how serious my cut was , but I decided to lay down and wait.&lt;br /&gt;When my mother came home, she alerted my father. Then me with my father went to the&lt;br /&gt;emergency  hospital. There the doctors sutured my cut.&lt;br /&gt;&lt;br /&gt;After seven days , they will cut the sutures.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-364290300926749750?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/364290300926749750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=364290300926749750' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/364290300926749750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/364290300926749750'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2008/06/if-i-feel-lazy-about-doing-something.html' title='If I feel lazy about doing something that means I&apos;d better not do it'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-127646067252934795</id><published>2008-05-19T12:56:00.001+03:00</published><updated>2008-05-19T12:57:31.845+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comics'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='imaginary number'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>Imaginary numbers ...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://nfccomic.com/comics/205.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://nfccomic.com/comics/205.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-127646067252934795?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/127646067252934795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=127646067252934795' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/127646067252934795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/127646067252934795'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2008/05/imaginary-numbers.html' title='Imaginary numbers ...'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-9015711885012010379</id><published>2008-05-19T12:31:00.004+03:00</published><updated>2008-05-19T21:13:55.040+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='Romanian'/><category scheme='http://www.blogger.com/atom/ns#' term='translate'/><title type='text'>Google translate adds Romanian language</title><content type='html'>&lt;a href="http://www.google.com/translate_t"&gt;Googe translate&lt;/a&gt; finally added support for the Romanian language. I'm very happy about this :D .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_IPsgxrqSYz4/SDFKMjSFqeI/AAAAAAAAAz8/iO-oEW8kKMU/s1600-h/googlero.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_IPsgxrqSYz4/SDFKMjSFqeI/AAAAAAAAAz8/iO-oEW8kKMU/s400/googlero.PNG" alt="" id="BLOGGER_PHOTO_ID_5202020624079628770" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-9015711885012010379?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/9015711885012010379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=9015711885012010379' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/9015711885012010379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/9015711885012010379'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2008/05/google-translate-adds-romanian-language.html' title='Google translate adds Romanian language'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_IPsgxrqSYz4/SDFKMjSFqeI/AAAAAAAAAz8/iO-oEW8kKMU/s72-c/googlero.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-3234264458318666643</id><published>2008-05-17T20:16:00.000+03:00</published><updated>2008-05-17T20:17:43.321+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comics'/><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>While compiling ...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://imgs.xkcd.com/comics/compiling.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://imgs.xkcd.com/comics/compiling.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-3234264458318666643?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/3234264458318666643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=3234264458318666643' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/3234264458318666643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/3234264458318666643'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2008/05/while-compiling.html' title='While compiling ...'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-3905991038703042999</id><published>2008-05-17T14:20:00.004+03:00</published><updated>2008-05-17T14:33:42.133+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='physics law'/><category scheme='http://www.blogger.com/atom/ns#' term='anime'/><title type='text'>The Anime Laws of Physics</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_IPsgxrqSYz4/SC7CTzSFqcI/AAAAAAAAAzQ/xTVtmL115Gk/s1600-h/banner+bleach.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_IPsgxrqSYz4/SC7CTzSFqcI/AAAAAAAAAzQ/xTVtmL115Gk/s400/banner+bleach.jpg" alt="" id="BLOGGER_PHOTO_ID_5201308265098881474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Today I found out that beside Laws of Physics exists and the Anime Laws of Physics ... wha.. !?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;#1 - Law of Metaphysical Irregularity&lt;/b&gt; &lt;ul&gt;The normal laws of physics do not apply.&lt;/ul&gt; &lt;b&gt;#2 - Law of Differentiated Gravitation&lt;/b&gt; &lt;ul&gt;Whenever someone or something jumps, is thrown, or otherwise is rendered airborne, gravity is reduced by a factor of 4.&lt;/ul&gt; &lt;b&gt;#3 - Law of Sonic Amplification, First Law of Anime Acoustics&lt;/b&gt; &lt;ul&gt;In space, loud sounds, like explosions, are even louder because there is no air to get in the way.&lt;/ul&gt; &lt;b&gt;#4 - Law of Constant Thrust, First Law of Anime Motion&lt;/b&gt; &lt;ul&gt;In space, constant thrust equals constant velocity.&lt;/ul&gt; &lt;b&gt;#5 - Law of Mechanical Mobility, Second Law of Anime Motion&lt;/b&gt; &lt;ul&gt;The larger a mechanical device is, the faster it moves. Armored Mecha are the fastest objects known to human science.&lt;/ul&gt; &lt;b&gt;#6 - Law of Temporal Variability&lt;/b&gt; &lt;ul&gt;Time is not a constant. Time stops for the hero whenever he does something 'cool' or 'impressive'. Time slows down when friends and lovers are being killed and speeds up whenever there is a fight.&lt;/ul&gt;......&lt;br /&gt;&lt;br /&gt;Read more &lt;a href="http://everything2.com/index.pl?node_id=1394377"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-3905991038703042999?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/3905991038703042999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=3905991038703042999' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/3905991038703042999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/3905991038703042999'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2008/05/anime-laws-of-physics.html' title='The Anime Laws of Physics'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_IPsgxrqSYz4/SC7CTzSFqcI/AAAAAAAAAzQ/xTVtmL115Gk/s72-c/banner+bleach.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-6787932251863883801</id><published>2008-05-17T01:39:00.005+03:00</published><updated>2008-05-17T02:08:34.755+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='liveusb-creator'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Fedora 9'/><category scheme='http://www.blogger.com/atom/ns#' term='live usb'/><title type='text'>Create your own live usb</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://fedorahosted.org/liveusb-creator/attachment/wiki/img/fedorausb.png?format=raw"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="https://fedorahosted.org/liveusb-creator/attachment/wiki/img/fedorausb.png?format=raw" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;W&lt;/span&gt;ith the new release of the Fedora, comes and a tool for installing the LiveCD on a usb stick.&lt;br /&gt;After installing it, you will get a fully functional operating system that boots from your usb stick.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Prerequisites&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;at least 1G flash stick&lt;/li&gt;&lt;li&gt;for windows users this tool &lt;a href="https://fedorahosted.org/releases/l/i/liveusb-creator/liveusb-creator-2.3.zip"&gt;https://fedorahosted.org/releases/l/i/liveusb-creator/liveusb-creator-2.3.zip&lt;/a&gt;&lt;/li&gt;&lt;li&gt;for linux users ( $ su -c 'yum install livecd-tools' )&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;For windows users &lt;/span&gt;&lt;ul&gt;&lt;li&gt;Unpack the archive you have downloaded&lt;/li&gt;&lt;li&gt;Launch liveusb-creator.exe&lt;/li&gt;&lt;li&gt;Choose which version of Fedora you want&lt;/li&gt;&lt;li&gt;Choose the usb stick on which you want to install Fedora&lt;/li&gt;&lt;li&gt;Set Persistent Overlay size, is the space which will be preserved for saving files, settings etc.&lt;/li&gt;&lt;li&gt;Press Create Live USB button&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://fedorahosted.org/liveusb-creator/attachment/wiki/img/liveusb-creator.png?format=raw"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="https://fedorahosted.org/liveusb-creator/attachment/wiki/img/liveusb-creator.png?format=raw" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;For linux users&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;# livecd-iso-to-disk Fedora-&lt;release&gt;-Live-i686.iso /dev/sdb1&lt;/release&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;where &lt;release&gt; is the release number (i.e. 8 or 9 )&lt;/release&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;References:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://fedorahosted.org/liveusb-creator"&gt;https://fedorahosted.org/liveusb-creator&lt;/a&gt;&lt;br /&gt;&lt;a href="http://fedoraproject.org/wiki/FedoraLiveCD/USBHowTo"&gt;http://fedoraproject.org/wiki/FedoraLiveCD/USBHowTo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-6787932251863883801?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/6787932251863883801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=6787932251863883801' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/6787932251863883801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/6787932251863883801'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2008/05/create-your-own-live-usb.html' title='Create your own live usb'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-4207988808283859365</id><published>2008-05-16T21:27:00.001+03:00</published><updated>2008-05-16T21:29:17.298+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comics'/><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Coding Secure</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://imgs.xkcd.com/comics/goto.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://imgs.xkcd.com/comics/goto.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-4207988808283859365?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/4207988808283859365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=4207988808283859365' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/4207988808283859365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/4207988808283859365'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2008/05/coding-secure.html' title='Coding Secure'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-1055914161046195764</id><published>2008-05-16T16:05:00.007+03:00</published><updated>2008-05-17T15:59:55.015+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='word'/><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='mistery'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='weird'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='strange'/><title type='text'>Get the facts : Microsoft strangehood</title><content type='html'>&lt;ol&gt;&lt;li&gt;You can't create a folder named CON,&lt;br /&gt;also for  PRN, AUX, CLOCK$, NUL,COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9,LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Try to create a new file with notepad and write the following sentence "Bush hid the facts",  without ". Save the file. Now, re-open it. Did you notice something strange ? Well, I did :). &lt;br /&gt;&lt;br /&gt;The bug can be triggered by many sentences, including those that follow a particular structure: one word with 4 letters, two or more words with 3 letters, one word with 5 letters.&lt;br /&gt;Some phrases that will trigger this oddity are:&lt;br /&gt;"Bill can not dance", "John has the parts", "This app can break", "This pad has bugzs", "Feel the new power", "Matrix can not lie", and even long phrases like&lt;br /&gt;"Einstein's thought regarding mathematics motivated Dhilung Kirat thinkin mathematics wonderfully amazing languagez".&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Open microsoft Word, and type =rand(200,99) and press Enter.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Resource &lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="HcCDpe"&gt;&lt;span style="font-style: italic;"&gt;romania  ]at[ macadamian  [dot]  com&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-1055914161046195764?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/1055914161046195764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=1055914161046195764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/1055914161046195764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/1055914161046195764'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2008/05/get-facts-windows.html' title='Get the facts : Microsoft strangehood'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-775436270171586901</id><published>2008-05-16T03:46:00.006+03:00</published><updated>2008-05-16T16:21:38.111+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comics'/><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>What is like for a computer ...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://imgs.xkcd.com/comics/compiler_complaint.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://imgs.xkcd.com/comics/compiler_complaint.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-775436270171586901?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/775436270171586901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=775436270171586901' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/775436270171586901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/775436270171586901'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2008/05/what-is-like-for-compiler.html' title='What is like for a computer ...'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8056237070751233205.post-4972005605981400564</id><published>2008-05-15T23:47:00.033+03:00</published><updated>2008-05-18T16:30:31.822+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tftpd'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Fedora 9'/><category scheme='http://www.blogger.com/atom/ns#' term='tftp'/><category scheme='http://www.blogger.com/atom/ns#' term='PXE boot'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='HTTP install'/><title type='text'>Fedora 9 PXE boot + HTTP install using Linux and Windows as host</title><content type='html'>&lt;span style=";font-family:arial;font-size:100%;"  &gt;Being a Fedora user since version 1, and a Red Hat 9 user, I did many installs.&lt;br /&gt;My first experience was installing RedHat 9, I used 3 CD's.&lt;br /&gt;In that era I had poor dial-up connection and zero knowledge about linux.&lt;br /&gt;&lt;br /&gt;Ok , so far , I tried :&lt;br /&gt;&lt;/span&gt;&lt;ol  style="font-family:arial;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;CD install ( RedHat 9, FC 2,3 )&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;DVD install ( FC 6, FC 7, FC 8 )&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Hard disk install ( FC 2,3,4,5 )&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;NFS install ( FC 5,6,7,8 )&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;PXE boot + HTTP, NFS install ( FC 9 )&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;Since PXE boot install was the most challenging, I'll talk about this one.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:130%;" &gt;Software prerequisites:&lt;/span&gt;&lt;/span&gt;&lt;ol  style="font-family:arial;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;a tftp daemon&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;a dhcp daemon&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;linux PXE boot images and bootloader&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;a Linux or Windows OS&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;The Linux Way&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In my case I have on my laptop Fedora 9, and I want to install on my PC the same OS.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:130%;" &gt;Step 1:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Install the tftp-server , dhcp , and syslinux packages (there is the PXE boot loader)&lt;br /&gt;as root&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# yum install tftp-server dhcp syslinux&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:130%;" &gt;Step 2:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Setup the dhcp server&lt;br /&gt;as root&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# nano /etc/dhcpd.conf &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The following example is a minimal configuration for a network that uses the following configuration:&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;192.168.0.0/24 addressing&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;Dynamic addresses provided between 192.168.0.3 and 192.168.0.200&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;DHCP/PXE server at IP address 192.168.0.2&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;span style="font-family:courier new;"&gt;ddns-update-style interim;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;ignore client-updates;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;allow bootp;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;allow booting;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;subnet 192.168.0.0 netmask 255.255.255.0 {  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     range 192.168.0.3 192.168.0.200;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;     option subnet-mask 255.255.255.0;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;             next-server 192.168.0.2;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;             default-lease-time 21600; &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;    max-lease-time 43200;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;             option root-path "/tftpboot/"; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;             filename "pxelinux.0";&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:130%;" &gt;Step 3:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Setup the tftp server&lt;br /&gt;as root&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# nano /etc/xinetd.d/tftp&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;service tftp &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;{ &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    disable = no &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    socket_type             = dgram &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    protocol                = udp&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;    wait                    = yes&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;    user                    = root&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;    server                  = /usr/sbin/in.tftpd&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;    server_args             = -s /tftpboot&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;    per_source              = 11&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;    cps                     = 100 2 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    flags                   = IPv4 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;make a dir, tftpboot, in the root directory&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# mkdir /tftpboot &lt;/span&gt; &lt;span style="font-family:courier new;"&gt;# cd /tftpboot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;copy the needed boot loader file in the created folder&lt;br /&gt;this file will be loaded in the memory of the remote host&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# cp /usr/lib/syslinux/pxelinux.0 .&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;alternatively, the latest pxelinux.0 , it can be downloaded from &lt;a href="http://www.kernel.org/pub/linux/utils/boot/syslinux/"&gt;here &lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;copy the linux kernel files for PXE booting&lt;br /&gt;&lt;br /&gt;# wget &lt;a href="http://download.fedora.redhat.com/pub/fedora/linux/releases/9/Fedora/i386/os/images/pxeboot/initrd.img"&gt;&lt;span style="text-decoration: underline;"&gt;http://download.fedora.redhat.com/pub/fedora/linux/releases/9/Fedora/i386/os/images/pxeboot/initrd.img&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;# wget &lt;a href="http://download.fedora.redhat.com/pub/fedora/linux/releases/9/Fedora/i386/os/images/pxeboot/vmlinuz"&gt;http://download.fedora.redhat.com/pub/fedora/linux/releases/9/Fedora/i386/os/images/pxeboot/vmlinuz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;create a pxelinux configuration file, named “default”, this file must be located in&lt;br /&gt;/tftpboot/pxelinux.cfg/ folder&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# mkdir /tftpboot/pxelinux.cfg&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# cd /tftpboot/pxelinux.cfg&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;# nano default&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and add the following configuration&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;DEFAULT pxeboot&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;TIMEOUT 50&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;LABEL pxeboot&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;KERNEL vmlinuz&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;APPEND initrd=initrd.img&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ONERROR LOCALBOOT 0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now, we have everything set up.&lt;br /&gt;&lt;br /&gt;It remains only to start the daemons  and shutdown the firewall&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# iptables -F&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# service dhcpd start&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# service xinetd start&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The last setup is to set the BIOS of the remote PC to boot from PXE.&lt;br /&gt;Further, when you get to the point when installers asks install source, you can&lt;br /&gt;choose what you want. But I have chosen the HTTP install, the only thing needed&lt;br /&gt;is a repository.&lt;br /&gt;&lt;br /&gt;The list of complete Fedora 9 repositories can be found &lt;a href="http://mirrors.fedoraproject.org/publiclist/Fedora/9/"&gt;here &lt;/a&gt;.&lt;br /&gt;I used this one &lt;a href="http://repo.fedoramd.org/fedora/linux/releases/9/Fedora/i386/os/"&gt;http://repo.fedoramd.org/fedora/linux/releases/9/Fedora/i386/os/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;&lt;br /&gt;The Windows Way&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you don't have a Linux desktop , but want to try this, follow the steps below:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;Download the tftp server for windows  &lt;a href="http://tftpd32.jounin.net/"&gt;http://tftpd32.jounin.net/&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;Install it&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;Get the pxelinux.0 boot loader image from this package &lt;a href="http://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-3.63.tar.bz2"&gt;http://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-3.63.tar.bz2&lt;/a&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;Create folder C:\PXE&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;Copy pxelinux.0 in C:\PXE&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;Copy tftpd32.exe in C:\PXE , this file is located in C:\Program Files\Tftpd32&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;Create folder C:\PXE\pxelinux.cfg&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;Create file C:\PXE\pxelinux.cfg\default&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;In the file &lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;C:\PXE\pxelinux.cfg\default add the following configuration &lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;DEFAULT pxeboot&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;TIMEOUT 50&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;LABEL pxeboot&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;KERNEL vmlinuz&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;APPEND initrd=initrd.img&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ONERROR LOCALBOOT 0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-family:arial;"&gt;Download&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt; the linux kernel files for PXE booting, this &lt;/span&gt;&lt;a href="http://download.fedora.redhat.com/pub/fedora/linux/releases/9/Fedora/i386/os/images/pxeboot/initrd.img"&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;span style="text-decoration: underline;"&gt;initrd.img&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt; and &lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://download.fedora.redhat.com/pub/fedora/linux/releases/9/Fedora/i386/os/images/pxeboot/vmlinuz"&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;vmlinuz&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;Copy them in C:\PXE&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;Launch tftpd32.exe, from C:\PXE&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;Setup the DHCP server :&lt;br /&gt;IP pool starting address : 192.168.0.2&lt;br /&gt;Size of pool : 30&lt;br /&gt;Boot file : pxelinux.0&lt;br /&gt;WINS/DNS server : 192.168.0.1&lt;br /&gt;Default router : 192.168.0.1&lt;br /&gt;Mask : 255.255.255.0&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_IPsgxrqSYz4/SC3GcTSFqaI/AAAAAAAAAzA/Kc2GdWYCukU/s1600-h/tftpd32.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_IPsgxrqSYz4/SC3GcTSFqaI/AAAAAAAAAzA/Kc2GdWYCukU/s400/tftpd32.JPG" alt="" id="BLOGGER_PHOTO_ID_5201031334197569954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;And press the save button.&lt;br /&gt;&lt;br /&gt;This configuration is for a 192.168.0.0/24 addressing network (e.g. your computer must have an IP ranging from 192.168.0.1 - 192.168.0.32 .&lt;br /&gt;&lt;br /&gt;It is very important to launch the tftpd server from the C:\PXE folder !!!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;In any case stop the windows firewall or any other kind of network protection, it might cause a boot fail on the remote host, due to possible restrictions imposed.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;So, here is what the C:\PXE folder must contain :&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;C:\PXE\tftpd32.exe&lt;/li&gt;&lt;li&gt;C:\PXE\pxelinux.0&lt;/li&gt;&lt;li&gt;C:\PXE\vmlinuz&lt;/li&gt;&lt;li&gt;C:\PXE\intird.img&lt;/li&gt;&lt;li&gt;C:\PXE\pxelinux.cfg\default&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;To test, you can by using a virtual machine or a real machine.&lt;br /&gt;&lt;br /&gt;Free virtual machines for windows:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/windows/downloads/virtualpc/default.mspx"&gt;Virtual PC&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.vmware.com/products/server/"&gt;Vmware Server&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;The cool thing about this way of installation is that I don't need to by a DVD or CD's.&lt;br /&gt;What is needed, is a broadband internet connection and desire to do it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Below I made video snapshots, the remote host is a vmware virtual machine,&lt;br /&gt;but I made the same thing on a real PC.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/1bhIKz_le1s&amp;amp;hl=en"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/1bhIKz_le1s&amp;amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/2ZbRUDQ_JCI&amp;amp;hl=en"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/2ZbRUDQ_JCI&amp;amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Resources:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.opensourcehowto.org/how-to/tftp/tftp--pxe--syslinux--fedora-install.html"&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;http://www.opensourcehowto.org/how-to/tftp/tftp--pxe--syslinux--fedora-install.html&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.fedoraproject.org/install-guide/f7/en_US/ap-pxe-server.html"&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;http://docs.fedoraproject.org/install-guide/f7/en_US/ap-pxe-server.html&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8056237070751233205-4972005605981400564?l=nicug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nicug.blogspot.com/feeds/4972005605981400564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8056237070751233205&amp;postID=4972005605981400564' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/4972005605981400564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8056237070751233205/posts/default/4972005605981400564'/><link rel='alternate' type='text/html' href='http://nicug.blogspot.com/2008/05/being-fedora-user-since-version-1-and.html' title='Fedora 9 PXE boot + HTTP install using Linux and Windows as host'/><author><name>Nicolae Ghimbovschi</name><uri>https://profiles.google.com/112083699986372532233</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-zkGjab3bs28/AAAAAAAAAAI/AAAAAAAACTM/KeCEzip8Vfg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_IPsgxrqSYz4/SC3GcTSFqaI/AAAAAAAAAzA/Kc2GdWYCukU/s72-c/tftpd32.JPG' height='72' width='72'/><thr:total>1</thr:total></entry></feed>
