{"id":23412,"date":"2022-11-25T21:18:18","date_gmt":"2022-11-25T15:48:18","guid":{"rendered":"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/"},"modified":"2022-11-25T21:18:18","modified_gmt":"2022-11-25T15:48:18","slug":"solved-how-to-handle-messages-from-multiple-windows","status":"publish","type":"post","link":"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/","title":{"rendered":"[Solved] How to handle messages from multiple windows"},"content":{"rendered":"<p> [ad_1]<br \/>\n<\/p>\n<div id=\"answer-55876510\" class=\"answer js-answer accepted-answer js-accepted-answer\" data-answerid=\"55876510\" data-parentid=\"55864826\" data-score=\"0\" data-position-on-page=\"1\" data-highest-scored=\"1\" data-question-has-accepted-highest-score=\"1\" itemprop=\"acceptedAnswer\" itemscope itemtype=\"https:\/\/schema.org\/Answer\">\n<div class=\"post-layout\">\n<div class=\"votecell post-layout--left\"><\/div>\n<div class=\"answercell post-layout--right\">\n<div class=\"s-prose js-post-body\" itemprop=\"text\">\n<p>There are several problems with your code:<\/p>\n<ol>\n<li>\n<p><code>ProcessThread()<\/code> is declared all wrong for <code>CreateThread()<\/code>, and the compiler would normally scream at you for that, but you are using an erroneous type-cast to quiet the compiler instead of fixing the error.  As such, <code>ProcessThread()<\/code> will not be able to receive the <code>vector<\/code> correctly at runtime.  The <code>ProcessThread()<\/code> would need to look more like this instead:<\/p>\n<pre><code>DWORD WINAPI ProcessThread(LPVOID lpParam)\n{\n    std::vector&lt;HWND&gt; *Windows = static_cast&lt;std::vector&lt;HWND&gt;*&gt;(lpParam);\n    ...\n    return 0;\n}\n\n...\n\nHANDLE hThread = CreateThread(..., &amp;ProcessThread, &amp;Windows, ...);\n<\/code><\/pre>\n<\/li>\n<li>\n<p>your thread&#8217;s message loop is all wrong.  Call <code>GetMessage()<\/code> ONCE per loop iteration, and do not specify any filtering <code>HWND<\/code> at all (see <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20050209-00\/?p=36493\">The dangers of filtering window messages<\/a>).  It will pull the next available message from the message queue, which you can then pass to <code>DispatchMessage()<\/code> to send the message along to the appropriate <code>WndProc<\/code> for further processing.<\/p>\n<pre><code>DWORD WINAPI ProcessThread(LPVOID lpParam)\n{\n    std::vector&lt;HWND&gt; *Windows = static_cast&lt;std::vector&lt;HWND&gt;*&gt;(lpParam);\n    MSG Msg;\n\n    while (GetMessageW(&amp;Msg, 0, 0, 0) &gt; 0)\n    {\n        TranslateMessage(&amp;Msg);\n        DispatchMessageW(&amp;Msg);\n    }\n\n    return 0;\n}\n<\/code><\/pre>\n<\/li>\n<li>\n<p>You are creating a worker thread just to wait for it to terminate, without doing anything else in parallel.  That makes the worker thread completely useless.  You need to get rid of that thread, especially given that&#8230;<\/p>\n<\/li>\n<li>\n<p>&#8230; you are running your message loop in a separate thread than the one that creates the windows.  You can&#8217;t do that at all!  A window has <em>thread affinity<\/em>.  <code>(Get|Peek)Message()<\/code> receives messages only for windows associated with the calling thread, so only the thread that creates a window can receive messages for that window.<\/p>\n<\/li>\n<\/ol>\n<p>You are over-thinking your code design.  You can greatly simplify it to this:<\/p>\n<pre><code>std::vector&lt;HWND&gt; Windows = { lpScreen.m_WindowHandle, lpPopup.m_WindowHandle };\nMSG Msg;\n\nwhile (GetMessageW(&amp;Msg, 0, 0, 0) &gt; 0)\n{\n    TranslateMessage(&amp;Msg);\n    DispatchMessageW(&amp;Msg);\n}\n<\/code><\/pre>\n<p>If <code>lpScreen.m_WindowHandle<\/code> and <code>lpPopup.m_WindowHandle<\/code> are the only windows available in the calling thread, then you don&#8217;t even need the <code>vector<\/code> at all!<\/p>\n<p>However, if you are interested in processing messages only for specific windows, this does present an issue.  The code above will receive messages for ALL windows in the calling thread.  If that is not what you want, then you COULD (but shouldn&#8217;t!) filter for specific windows in the <code>vector<\/code>, eg:<\/p>\n<pre><code>std::vector&lt;HWND&gt; Windows = { lpScreen.m_WindowHandle, lpPopup.m_WindowHandle };\nMSG Msg;\n\nfor(auto h : Windows)\n{\n    while (PeekMessageW(&amp;Msg, h, 0, 0, PM_REMOVE))\n    {\n        TranslateMessage(&amp;Msg);\n        DispatchMessageW(&amp;Msg);\n    }\n}\n<\/code><\/pre>\n<p>But that can lead to message starvation for other windows, if you are not careful.<\/p>\n<p>Otherwise, you would just have to use a separate thread to CREATE AND PROCESS just the windows you are interested in.<\/p>\n<\/p><\/div>\n<div class=\"mt24\"><\/div>\n<\/div>\n<p>            <span class=\"d-none\" itemprop=\"commentCount\"><\/span> <\/p><\/div>\n<\/div>\n<p>[ad_2]<\/p>\n<p>solved How to handle messages from multiple windows <\/p>\n","protected":false},"excerpt":{"rendered":"<p>[ad_1] There are several problems with your code: ProcessThread() is declared all wrong for CreateThread(), and the compiler would normally scream at you for that, but you are using an erroneous type-cast to quiet the compiler instead of fixing the error. As such, ProcessThread() will not be able to receive the vector correctly at runtime. &#8230; <a title=\"[Solved] How to handle messages from multiple windows\" class=\"read-more\" href=\"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/\" aria-label=\"More on [Solved] How to handle messages from multiple windows\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[320],"tags":[324,683],"class_list":["post-23412","post","type-post","status-publish","format-standard","hentry","category-solved","tag-c","tag-winapi"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>[Solved] How to handle messages from multiple windows - JassWeb<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[Solved] How to handle messages from multiple windows - JassWeb\" \/>\n<meta property=\"og:description\" content=\"[ad_1] There are several problems with your code: ProcessThread() is declared all wrong for CreateThread(), and the compiler would normally scream at you for that, but you are using an erroneous type-cast to quiet the compiler instead of fixing the error. As such, ProcessThread() will not be able to receive the vector correctly at runtime. ... Read more\" \/>\n<meta property=\"og:url\" content=\"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/\" \/>\n<meta property=\"og:site_name\" content=\"JassWeb\" \/>\n<meta property=\"article:published_time\" content=\"2022-11-25T15:48:18+00:00\" \/>\n<meta name=\"author\" content=\"Kirat\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kirat\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/\"},\"author\":{\"name\":\"Kirat\",\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/person\/65c9c7b7958150c0dc8371fa35dd7c31\"},\"headline\":\"[Solved] How to handle messages from multiple windows\",\"datePublished\":\"2022-11-25T15:48:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/\"},\"wordCount\":342,\"publisher\":{\"@id\":\"https:\/\/jassweb.com\/solved\/#organization\"},\"keywords\":[\"c++\",\"winapi\"],\"articleSection\":[\"Solved\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/\",\"url\":\"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/\",\"name\":\"[Solved] How to handle messages from multiple windows - JassWeb\",\"isPartOf\":{\"@id\":\"https:\/\/jassweb.com\/solved\/#website\"},\"datePublished\":\"2022-11-25T15:48:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/jassweb.com\/solved\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"[Solved] How to handle messages from multiple windows\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/jassweb.com\/solved\/#website\",\"url\":\"https:\/\/jassweb.com\/solved\/\",\"name\":\"JassWeb\",\"description\":\"Build High-quality Websites\",\"publisher\":{\"@id\":\"https:\/\/jassweb.com\/solved\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/jassweb.com\/solved\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/jassweb.com\/solved\/#organization\",\"name\":\"Jass Web\",\"url\":\"https:\/\/jassweb.com\/solved\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/jassweb.com\/wp-content\/uploads\/2021\/02\/jass-website-logo-1.png\",\"contentUrl\":\"https:\/\/jassweb.com\/wp-content\/uploads\/2021\/02\/jass-website-logo-1.png\",\"width\":693,\"height\":132,\"caption\":\"Jass Web\"},\"image\":{\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/person\/65c9c7b7958150c0dc8371fa35dd7c31\",\"name\":\"Kirat\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/jassweb.com\/solved\/wp-content\/litespeed\/avatar\/1261af3c9451399fa1336d28b98ea3bb.jpg?ver=1776403586\",\"contentUrl\":\"https:\/\/jassweb.com\/solved\/wp-content\/litespeed\/avatar\/1261af3c9451399fa1336d28b98ea3bb.jpg?ver=1776403586\",\"caption\":\"Kirat\"},\"sameAs\":[\"http:\/\/jassweb.com\"],\"url\":\"https:\/\/jassweb.com\/solved\/author\/jaspritsinghghumangmail-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[Solved] How to handle messages from multiple windows - JassWeb","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/","og_locale":"en_US","og_type":"article","og_title":"[Solved] How to handle messages from multiple windows - JassWeb","og_description":"[ad_1] There are several problems with your code: ProcessThread() is declared all wrong for CreateThread(), and the compiler would normally scream at you for that, but you are using an erroneous type-cast to quiet the compiler instead of fixing the error. As such, ProcessThread() will not be able to receive the vector correctly at runtime. ... Read more","og_url":"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/","og_site_name":"JassWeb","article_published_time":"2022-11-25T15:48:18+00:00","author":"Kirat","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Kirat","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/#article","isPartOf":{"@id":"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/"},"author":{"name":"Kirat","@id":"https:\/\/jassweb.com\/solved\/#\/schema\/person\/65c9c7b7958150c0dc8371fa35dd7c31"},"headline":"[Solved] How to handle messages from multiple windows","datePublished":"2022-11-25T15:48:18+00:00","mainEntityOfPage":{"@id":"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/"},"wordCount":342,"publisher":{"@id":"https:\/\/jassweb.com\/solved\/#organization"},"keywords":["c++","winapi"],"articleSection":["Solved"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/","url":"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/","name":"[Solved] How to handle messages from multiple windows - JassWeb","isPartOf":{"@id":"https:\/\/jassweb.com\/solved\/#website"},"datePublished":"2022-11-25T15:48:18+00:00","breadcrumb":{"@id":"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/jassweb.com\/solved\/solved-how-to-handle-messages-from-multiple-windows\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/jassweb.com\/solved\/"},{"@type":"ListItem","position":2,"name":"[Solved] How to handle messages from multiple windows"}]},{"@type":"WebSite","@id":"https:\/\/jassweb.com\/solved\/#website","url":"https:\/\/jassweb.com\/solved\/","name":"JassWeb","description":"Build High-quality Websites","publisher":{"@id":"https:\/\/jassweb.com\/solved\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/jassweb.com\/solved\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/jassweb.com\/solved\/#organization","name":"Jass Web","url":"https:\/\/jassweb.com\/solved\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jassweb.com\/solved\/#\/schema\/logo\/image\/","url":"https:\/\/jassweb.com\/wp-content\/uploads\/2021\/02\/jass-website-logo-1.png","contentUrl":"https:\/\/jassweb.com\/wp-content\/uploads\/2021\/02\/jass-website-logo-1.png","width":693,"height":132,"caption":"Jass Web"},"image":{"@id":"https:\/\/jassweb.com\/solved\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/jassweb.com\/solved\/#\/schema\/person\/65c9c7b7958150c0dc8371fa35dd7c31","name":"Kirat","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jassweb.com\/solved\/#\/schema\/person\/image\/","url":"https:\/\/jassweb.com\/solved\/wp-content\/litespeed\/avatar\/1261af3c9451399fa1336d28b98ea3bb.jpg?ver=1776403586","contentUrl":"https:\/\/jassweb.com\/solved\/wp-content\/litespeed\/avatar\/1261af3c9451399fa1336d28b98ea3bb.jpg?ver=1776403586","caption":"Kirat"},"sameAs":["http:\/\/jassweb.com"],"url":"https:\/\/jassweb.com\/solved\/author\/jaspritsinghghumangmail-com\/"}]}},"_links":{"self":[{"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/posts\/23412","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/comments?post=23412"}],"version-history":[{"count":0,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/posts\/23412\/revisions"}],"wp:attachment":[{"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/media?parent=23412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/categories?post=23412"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/tags?post=23412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}