diff --git a/Directory.Build.props b/Directory.Build.props index 8f62e6686..82cd9b810 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -72,6 +72,8 @@ mkdir "$(SolutionDir)$(SolutionName)\$(OutDir)Languages" ) xcopy /q /y /d "$(TargetDir)Languages\*.xml" "$(SolutionDir)$(SolutionName)\$(OutDir)Languages" + del "$(SolutionDir)$(SolutionName)\$(OutDir)Languages\language-installer*.xml"; + del "$(SolutionDir)$(SolutionName)\$(OutDir)Languages\language-website*.xml"; )" /> diff --git a/Greenshot/Greenshot.csproj b/Greenshot/Greenshot.csproj index f1187d7ce..04f49c8f7 100644 --- a/Greenshot/Greenshot.csproj +++ b/Greenshot/Greenshot.csproj @@ -72,4 +72,9 @@ + + + copy "$(SolutionDir)Greenshot\log4net-debug.xml" "$(SolutionDir)Greenshot\bin\$(Configuration)\net471\log4net.xml" + + diff --git a/Greenshot/Languages/language-installer-de-DE.xml b/Greenshot/Languages/installer/language-installer-de-DE.xml similarity index 98% rename from Greenshot/Languages/language-installer-de-DE.xml rename to Greenshot/Languages/installer/language-installer-de-DE.xml index ffbbafc05..743515c35 100644 --- a/Greenshot/Languages/language-installer-de-DE.xml +++ b/Greenshot/Languages/installer/language-installer-de-DE.xml @@ -1,14 +1,14 @@ - - - - {#ExeName} starten wenn Windows hochfährt - {#ExeName} starten - Jira Plug-in - Confluence Plug-in - Öffne mit ein externem Kommando Plug-in - OCR Plug-in (benötigt Microsoft Office Document Imaging (MODI)) - Imgur Plug-in (Siehe: http://imgur.com) - Zusätzliche Sprachen - Optimierung der Leistung, kann etwas dauern. - + + + + {#ExeName} starten wenn Windows hochfährt + {#ExeName} starten + Jira Plug-in + Confluence Plug-in + Öffne mit ein externem Kommando Plug-in + OCR Plug-in (benötigt Microsoft Office Document Imaging (MODI)) + Imgur Plug-in (Siehe: http://imgur.com) + Zusätzliche Sprachen + Optimierung der Leistung, kann etwas dauern. + \ No newline at end of file diff --git a/Greenshot/Languages/language-installer-en-US.xml b/Greenshot/Languages/installer/language-installer-en-US.xml similarity index 98% rename from Greenshot/Languages/language-installer-en-US.xml rename to Greenshot/Languages/installer/language-installer-en-US.xml index 058b19a91..843005269 100644 --- a/Greenshot/Languages/language-installer-en-US.xml +++ b/Greenshot/Languages/installer/language-installer-en-US.xml @@ -1,14 +1,14 @@ - - - - Start {#ExeName} with Windows start - Start {#ExeName} - Jira plug-in - Confluence plug-in - Open with external command plug-in - OCR plug-in (needs Microsoft Office Document Imaging (MODI)) - Imgur plug-in (See: http://imgur.com) - Additional languages - Optimizing performance, this may take a while. - + + + + Start {#ExeName} with Windows start + Start {#ExeName} + Jira plug-in + Confluence plug-in + Open with external command plug-in + OCR plug-in (needs Microsoft Office Document Imaging (MODI)) + Imgur plug-in (See: http://imgur.com) + Additional languages + Optimizing performance, this may take a while. + \ No newline at end of file diff --git a/Greenshot/Languages/language-installer-es-ES.xml b/Greenshot/Languages/installer/language-installer-es-ES.xml similarity index 98% rename from Greenshot/Languages/language-installer-es-ES.xml rename to Greenshot/Languages/installer/language-installer-es-ES.xml index 78a27e00d..e11d06704 100644 --- a/Greenshot/Languages/language-installer-es-ES.xml +++ b/Greenshot/Languages/installer/language-installer-es-ES.xml @@ -1,14 +1,14 @@ - - - - Extensión para Confluence - Extensión para abrir con programas externos - Extensión para Imgur (Ver http://imgur.com) - Extensión para Jira - Idiomas adicionales - Extensión para OCR (necesita Microsoft Office Document Imaging (MODI)) - Optimizando rendimiento; por favor, espera. - Lanzar {#ExeName} - Lanzar {#ExeName} al iniciarse Windows - + + + + Extensión para Confluence + Extensión para abrir con programas externos + Extensión para Imgur (Ver http://imgur.com) + Extensión para Jira + Idiomas adicionales + Extensión para OCR (necesita Microsoft Office Document Imaging (MODI)) + Optimizando rendimiento; por favor, espera. + Lanzar {#ExeName} + Lanzar {#ExeName} al iniciarse Windows + \ No newline at end of file diff --git a/Greenshot/Languages/language-installer-fi-FI.xml b/Greenshot/Languages/installer/language-installer-fi-FI.xml similarity index 98% rename from Greenshot/Languages/language-installer-fi-FI.xml rename to Greenshot/Languages/installer/language-installer-fi-FI.xml index 90d9376c9..5182c880b 100644 --- a/Greenshot/Languages/language-installer-fi-FI.xml +++ b/Greenshot/Languages/installer/language-installer-fi-FI.xml @@ -1,14 +1,14 @@ - - - - Käynnistä {#ExeName} Windowsin käynnistyessä - Käynnistä {#ExeName} - Jira-liitännäinen - Confluence-liitännäinen - Avaa Ulkoinen komento-liitännäisellä - OCR-liitännäinen (Tarvitaan: Microsoft Office Document Imaging (MODI)) - Imgur-liitännäinen (Katso: http://imgur.com) - Lisäkielet - Optimoidaan suorituskykyä, tämä voi kestää hetken. - + + + + Käynnistä {#ExeName} Windowsin käynnistyessä + Käynnistä {#ExeName} + Jira-liitännäinen + Confluence-liitännäinen + Avaa Ulkoinen komento-liitännäisellä + OCR-liitännäinen (Tarvitaan: Microsoft Office Document Imaging (MODI)) + Imgur-liitännäinen (Katso: http://imgur.com) + Lisäkielet + Optimoidaan suorituskykyä, tämä voi kestää hetken. + \ No newline at end of file diff --git a/Greenshot/Languages/language-installer-fr-FR.xml b/Greenshot/Languages/installer/language-installer-fr-FR.xml similarity index 98% rename from Greenshot/Languages/language-installer-fr-FR.xml rename to Greenshot/Languages/installer/language-installer-fr-FR.xml index 608e2fe3f..4f2cab573 100644 --- a/Greenshot/Languages/language-installer-fr-FR.xml +++ b/Greenshot/Languages/installer/language-installer-fr-FR.xml @@ -1,14 +1,14 @@ - - - - Greffon Confluence - Ouvrir avec le greffon de commande externe - Greffon Imgur (Voir: http://imgur.com) - Greffon Jira - Langues additionnelles - Greffon OCR (nécessite Document Imaging de Microsoft Office [MODI]) - Optimisation des performances, Ceci peut prendre un certain temps. - Démarrer {#ExeName} - Lancer {#ExeName} au démarrage de Windows - + + + + Greffon Confluence + Ouvrir avec le greffon de commande externe + Greffon Imgur (Voir: http://imgur.com) + Greffon Jira + Langues additionnelles + Greffon OCR (nécessite Document Imaging de Microsoft Office [MODI]) + Optimisation des performances, Ceci peut prendre un certain temps. + Démarrer {#ExeName} + Lancer {#ExeName} au démarrage de Windows + \ No newline at end of file diff --git a/Greenshot/Languages/language-installer-lv-LV.xml b/Greenshot/Languages/installer/language-installer-lv-LV.xml similarity index 100% rename from Greenshot/Languages/language-installer-lv-LV.xml rename to Greenshot/Languages/installer/language-installer-lv-LV.xml diff --git a/Greenshot/Languages/language-installer-nl-NL.xml b/Greenshot/Languages/installer/language-installer-nl-NL.xml similarity index 98% rename from Greenshot/Languages/language-installer-nl-NL.xml rename to Greenshot/Languages/installer/language-installer-nl-NL.xml index 612f3943c..43c8454c4 100644 --- a/Greenshot/Languages/language-installer-nl-NL.xml +++ b/Greenshot/Languages/installer/language-installer-nl-NL.xml @@ -1,14 +1,14 @@ - - - - Prestaties verbeteren, kan even duren. - Extra talen - Imgur plug-in (Zie: http://imgur.com) - OCR plug-in (heeft Microsoft Office Document Imaging (MODI) nodig) - Open met externes commando plug-in - Confluence plug-in - Jira plug-in - Start {#ExeName} - Start {#ExeName} wanneer Windows opstart - + + + + Prestaties verbeteren, kan even duren. + Extra talen + Imgur plug-in (Zie: http://imgur.com) + OCR plug-in (heeft Microsoft Office Document Imaging (MODI) nodig) + Open met externes commando plug-in + Confluence plug-in + Jira plug-in + Start {#ExeName} + Start {#ExeName} wanneer Windows opstart + \ No newline at end of file diff --git a/Greenshot/Languages/language-installer-nn-NO.xml b/Greenshot/Languages/installer/language-installer-nn-NO.xml similarity index 98% rename from Greenshot/Languages/language-installer-nn-NO.xml rename to Greenshot/Languages/installer/language-installer-nn-NO.xml index cfa04e16e..dbde65c2e 100644 --- a/Greenshot/Languages/language-installer-nn-NO.xml +++ b/Greenshot/Languages/installer/language-installer-nn-NO.xml @@ -1,14 +1,14 @@ - - - - Confluence-tillegg - Tillegg for å opne med ekstern kommando - Imgur-tillegg (sjå http://imgur.com) - Jira-tillegg - Andre språk - OCR-tillegg (krev Microsoft Office Document Imaging (MODI)) - Optimaliserar ytelse, dette kan ta litt tid... - Start {#ExeName} - Start {#ExeName} når Windows startar - + + + + Confluence-tillegg + Tillegg for å opne med ekstern kommando + Imgur-tillegg (sjå http://imgur.com) + Jira-tillegg + Andre språk + OCR-tillegg (krev Microsoft Office Document Imaging (MODI)) + Optimaliserar ytelse, dette kan ta litt tid... + Start {#ExeName} + Start {#ExeName} når Windows startar + \ No newline at end of file diff --git a/Greenshot/Languages/language-installer-sr-RS.xml b/Greenshot/Languages/installer/language-installer-sr-RS.xml similarity index 98% rename from Greenshot/Languages/language-installer-sr-RS.xml rename to Greenshot/Languages/installer/language-installer-sr-RS.xml index b55e6d893..01e3ba5f4 100644 --- a/Greenshot/Languages/language-installer-sr-RS.xml +++ b/Greenshot/Languages/installer/language-installer-sr-RS.xml @@ -1,14 +1,14 @@ - - - - Прикључак за Конфлуенс - Отвори са прикључком за спољне наредбе - Прикључак за Имиџер (http://imgur.com) - Прикључак за Џиру - Додатни језици - OCR прикључак (захтева Microsoft Office Document Imaging (MODI)) - Оптимизујем перформансе… - Покрени Гриншот - Покрени програм са системом - + + + + Прикључак за Конфлуенс + Отвори са прикључком за спољне наредбе + Прикључак за Имиџер (http://imgur.com) + Прикључак за Џиру + Додатни језици + OCR прикључак (захтева Microsoft Office Document Imaging (MODI)) + Оптимизујем перформансе… + Покрени Гриншот + Покрени програм са системом + \ No newline at end of file diff --git a/Greenshot/Languages/language-installer-sv-SE.xml b/Greenshot/Languages/installer/language-installer-sv-SE.xml similarity index 100% rename from Greenshot/Languages/language-installer-sv-SE.xml rename to Greenshot/Languages/installer/language-installer-sv-SE.xml diff --git a/Greenshot/Languages/language-installer-uk-UA.xml b/Greenshot/Languages/installer/language-installer-uk-UA.xml similarity index 98% rename from Greenshot/Languages/language-installer-uk-UA.xml rename to Greenshot/Languages/installer/language-installer-uk-UA.xml index d10360622..33698d9b2 100644 --- a/Greenshot/Languages/language-installer-uk-UA.xml +++ b/Greenshot/Languages/installer/language-installer-uk-UA.xml @@ -1,14 +1,14 @@ - - - - Запускати {#ExeName} під час запуску Windows - Запустити {#ExeName} - Плагін Jira - Плагін Confluence - Плагін запуску зовнішньої команди - Плагін OCR (потребує Microsoft Office Document Imaging (MODI)) - Плагін Imgur (див.: http://imgur.com) - Додаткові мови - Оптимізація продуктивності, це може зайняти певний час. - - + + + + Запускати {#ExeName} під час запуску Windows + Запустити {#ExeName} + Плагін Jira + Плагін Confluence + Плагін запуску зовнішньої команди + Плагін OCR (потребує Microsoft Office Document Imaging (MODI)) + Плагін Imgur (див.: http://imgur.com) + Додаткові мови + Оптимізація продуктивності, це може зайняти певний час. + + diff --git a/Greenshot/Languages/language-installer-zh-CN.xml b/Greenshot/Languages/installer/language-installer-zh-CN.xml similarity index 98% rename from Greenshot/Languages/language-installer-zh-CN.xml rename to Greenshot/Languages/installer/language-installer-zh-CN.xml index 8b5dd6d79..ec014bb24 100644 --- a/Greenshot/Languages/language-installer-zh-CN.xml +++ b/Greenshot/Languages/installer/language-installer-zh-CN.xml @@ -1,14 +1,14 @@ - - - - Confluence插件 - 使用外部命令打开插件 - Imgur插件( (请访问: http://imgur.com)) - Jira插件 - 其它语言 - OCR插件(需要Microsoft Office Document Imaging (MODI)的支持) - 正在优化性能,这可能需要一点时间。 - 启动{#ExeName} - 让{#ExeName}随Windows一起启动 - + + + + Confluence插件 + 使用外部命令打开插件 + Imgur插件( (请访问: http://imgur.com)) + Jira插件 + 其它语言 + OCR插件(需要Microsoft Office Document Imaging (MODI)的支持) + 正在优化性能,这可能需要一点时间。 + 启动{#ExeName} + 让{#ExeName}随Windows一起启动 + \ No newline at end of file diff --git a/Greenshot/Languages/language-website-de-DE.xml b/Greenshot/Languages/website/language-website-de-DE.xml similarity index 99% rename from Greenshot/Languages/language-website-de-DE.xml rename to Greenshot/Languages/website/language-website-de-DE.xml index 301f1f5c5..07a7406cc 100644 --- a/Greenshot/Languages/language-website-de-DE.xml +++ b/Greenshot/Languages/website/language-website-de-DE.xml @@ -1,20 +1,20 @@ - - - - Downloads - Greenshot - ein kostenloses Screenshot-Programm für maximale Produktivität - Greenshot ist kostenlos und open-source - Falls Sie merken, dass Greenshot Ihnen viel Zeit und/oder Geld spart, würde sich das Entwickler-Team über Ihre <a href="/support/">Unterstützung für die Weiterentwicklung</a> dieser Screenshot-Software freuen. - Greenshot wurde unter der <a href="http://de.wikipedia.org/wiki/GNU_General_Public_License" target="_blank">GPL</a> veröffentlicht und kann kostenlos heruntergeladen und verwendet werden, auch zur kommerziellen Nutzung. - Und weiter? - Natürlich kann Greenshot noch einiges mehr. Werfen Sie einen Blick auf einige <a title="Screenshots von Greenshot in Aktion" href="/screenshots/">Screenshots</a> von Greenshot in Aktion oder probieren Sie die <a title="Download der aktuellen Version von Greenshot" href="/downloads/">aktuelle Version</a> einfach aus. - Was ist Greenshot? - Schnelle Erstellung von kompletten oder teilweisen Screenshots. - Einfaches Hinzufügen von Kommentaren, Hervorhebungen oder Unkenntlichmachungen. - Greenshot ist ein kompaktes Screenshot-Programm für Windows mit den folgenden Hauptfunktionen: - ... und viele weitere Möglichkeiten, die die Erstellung von und die Arbeit mit Screenshots vereinfachen - Tag für Tag. + + + + Downloads + Greenshot - ein kostenloses Screenshot-Programm für maximale Produktivität + Greenshot ist kostenlos und open-source + Falls Sie merken, dass Greenshot Ihnen viel Zeit und/oder Geld spart, würde sich das Entwickler-Team über Ihre <a href="/support/">Unterstützung für die Weiterentwicklung</a> dieser Screenshot-Software freuen. + Greenshot wurde unter der <a href="http://de.wikipedia.org/wiki/GNU_General_Public_License" target="_blank">GPL</a> veröffentlicht und kann kostenlos heruntergeladen und verwendet werden, auch zur kommerziellen Nutzung. + Und weiter? + Natürlich kann Greenshot noch einiges mehr. Werfen Sie einen Blick auf einige <a title="Screenshots von Greenshot in Aktion" href="/screenshots/">Screenshots</a> von Greenshot in Aktion oder probieren Sie die <a title="Download der aktuellen Version von Greenshot" href="/downloads/">aktuelle Version</a> einfach aus. + Was ist Greenshot? + Schnelle Erstellung von kompletten oder teilweisen Screenshots. + Einfaches Hinzufügen von Kommentaren, Hervorhebungen oder Unkenntlichmachungen. + Greenshot ist ein kompaktes Screenshot-Programm für Windows mit den folgenden Hauptfunktionen: + ... und viele weitere Möglichkeiten, die die Erstellung von und die Arbeit mit Screenshots vereinfachen - Tag für Tag. Direkter Export des Screenshots in eine Datei, die Zwischenablage, -an einen Drucker, ein MS Office-Dokument oder als E-Mail-Anhang; Sie können es auch zu verschiedene Bild-Hosting-Services hochladen. - Da Greenshot leicht verständlich und konfigurierbar ist, ist es ein effizientes Programm für Projektmanager, Software-Entwickler, technische Redakteure, Dokumentations-Entwickler, Tester und andere Personen, die oft mit Screenshots arbeiten. - +an einen Drucker, ein MS Office-Dokument oder als E-Mail-Anhang; Sie können es auch zu verschiedene Bild-Hosting-Services hochladen. + Da Greenshot leicht verständlich und konfigurierbar ist, ist es ein effizientes Programm für Projektmanager, Software-Entwickler, technische Redakteure, Dokumentations-Entwickler, Tester und andere Personen, die oft mit Screenshots arbeiten. + \ No newline at end of file diff --git a/Greenshot/Languages/language-website-en-US.xml b/Greenshot/Languages/website/language-website-en-US.xml similarity index 99% rename from Greenshot/Languages/language-website-en-US.xml rename to Greenshot/Languages/website/language-website-en-US.xml index 1eb773f8b..6cb85ca9f 100644 --- a/Greenshot/Languages/language-website-en-US.xml +++ b/Greenshot/Languages/website/language-website-en-US.xml @@ -1,19 +1,19 @@ - - - - Downloads - Greenshot - a free screenshot tool optimized for productivity - Greenshot is free and open source - If you find that Greenshot saves you a lot of time and/or money, you are very welcome to <a href="/support/">support the development</a> of this screenshot software. - Greenshot was published under <a href="http://en.wikipedia.org/wiki/GNU_General_Public_License" target="_blank">GPL</a>, i.e. this software can be downloaded and used free of charge, even in a commercial environment. - Want to see more? - Of course there is more that Greenshot can do for you. Have a look at some <a title="Screenshots of Greenshot in action" href="/screenshots/">screenshots</a> of Greenshot in action or try the <a title="Download the latest stable version of Greenshot" href="/downloads/">latest release</a>. - What is Greenshot???? - Quickly create screenshots of a selected region, window or fullscreen; you can even capture complete (scrolling) web pages from Internet Explorer. - Easily annotate, highlight or obfuscate parts of the screenshot. - Greenshot is a light-weight screenshot software tool for Windows with the following key features: - ...and a lot more options simplyfying creation of and work with screenshots every day. - Export the screenshot in various ways: save to file, send to printer, copy to clipboard, attach to e-mail, send Office programs or upload to photo sites like Flickr or Picasa, and others. - Being easy to understand and configurable, Greenshot is an efficient tool for project managers, software developers, technical writers, testers and anyone else creating screenshots. - + + + + Downloads + Greenshot - a free screenshot tool optimized for productivity + Greenshot is free and open source + If you find that Greenshot saves you a lot of time and/or money, you are very welcome to <a href="/support/">support the development</a> of this screenshot software. + Greenshot was published under <a href="http://en.wikipedia.org/wiki/GNU_General_Public_License" target="_blank">GPL</a>, i.e. this software can be downloaded and used free of charge, even in a commercial environment. + Want to see more? + Of course there is more that Greenshot can do for you. Have a look at some <a title="Screenshots of Greenshot in action" href="/screenshots/">screenshots</a> of Greenshot in action or try the <a title="Download the latest stable version of Greenshot" href="/downloads/">latest release</a>. + What is Greenshot???? + Quickly create screenshots of a selected region, window or fullscreen; you can even capture complete (scrolling) web pages from Internet Explorer. + Easily annotate, highlight or obfuscate parts of the screenshot. + Greenshot is a light-weight screenshot software tool for Windows with the following key features: + ...and a lot more options simplyfying creation of and work with screenshots every day. + Export the screenshot in various ways: save to file, send to printer, copy to clipboard, attach to e-mail, send Office programs or upload to photo sites like Flickr or Picasa, and others. + Being easy to understand and configurable, Greenshot is an efficient tool for project managers, software developers, technical writers, testers and anyone else creating screenshots. + \ No newline at end of file diff --git a/Greenshot/Languages/language-website-es-ES.xml b/Greenshot/Languages/website/language-website-es-ES.xml similarity index 99% rename from Greenshot/Languages/language-website-es-ES.xml rename to Greenshot/Languages/website/language-website-es-ES.xml index 12ae3a7fe..2c6f35720 100644 --- a/Greenshot/Languages/language-website-es-ES.xml +++ b/Greenshot/Languages/website/language-website-es-ES.xml @@ -1,19 +1,19 @@ - - - - Descargas - Greenshot - herramienta libre de captura de pantalla, optimizada para una mayor productividad - Greenshot es código libre y abierto - Si Greenshot te ahorra tiempo y/o dinero, puedes <a href="/support/">apoyar el desarrollo</a> de esta aplicación de captura de pantallas. - Greenshot se publica bajo licencia <a href="http://en.wikipedia.org/wiki/GNU_General_Public_License" target="_blank">GPL</a>. Esta aplicación se puede descargar y utilizar de forma gratuita, incluso en un entorno comercial. - ¿Quieres ver más? - Por supuesto hay mucho más que Greenshot puede hacer. Echa un vistazo a algunas <a href="/screenshots/">capturas de pantalla</a> de Greenshot en acción o prueba la <a href="/downloads/">última versión</a>. - ¿Qué es Greenshot? - Creación rápida de capturas de una región seleccionado, una ventana o toda la pantalla; se puede incluso capturar (desplazando) páginas completas de Internet Explorer. - Anotación, resalte y ocultación de partes de la captura de pantalla fácilmente. - Greenshot es una herramienta ligera de captura de pantalla para Windows con las características esenciales: - ... y muchas más opciones para simplificar el día a día en la creación y el trabajo con capturas de pantalla. - Exportar la captura de pantalla de diversas maneras: guardar en archivo, imprimir, copiar al portapapeles, adjuntar a un correo electrónico, enviar a programa de Office o subir a sitios de fotos como Flickr o Picasa, entre otros. - Al ser fácil de entender y configurar, Greenshot es una herramienta eficaz para gestores de proyecto, desarrolladores de software, escritores técnicos, evaluadores y cualquier persona que necesite capturas de pantalla. - + + + + Descargas + Greenshot - herramienta libre de captura de pantalla, optimizada para una mayor productividad + Greenshot es código libre y abierto + Si Greenshot te ahorra tiempo y/o dinero, puedes <a href="/support/">apoyar el desarrollo</a> de esta aplicación de captura de pantallas. + Greenshot se publica bajo licencia <a href="http://en.wikipedia.org/wiki/GNU_General_Public_License" target="_blank">GPL</a>. Esta aplicación se puede descargar y utilizar de forma gratuita, incluso en un entorno comercial. + ¿Quieres ver más? + Por supuesto hay mucho más que Greenshot puede hacer. Echa un vistazo a algunas <a href="/screenshots/">capturas de pantalla</a> de Greenshot en acción o prueba la <a href="/downloads/">última versión</a>. + ¿Qué es Greenshot? + Creación rápida de capturas de una región seleccionado, una ventana o toda la pantalla; se puede incluso capturar (desplazando) páginas completas de Internet Explorer. + Anotación, resalte y ocultación de partes de la captura de pantalla fácilmente. + Greenshot es una herramienta ligera de captura de pantalla para Windows con las características esenciales: + ... y muchas más opciones para simplificar el día a día en la creación y el trabajo con capturas de pantalla. + Exportar la captura de pantalla de diversas maneras: guardar en archivo, imprimir, copiar al portapapeles, adjuntar a un correo electrónico, enviar a programa de Office o subir a sitios de fotos como Flickr o Picasa, entre otros. + Al ser fácil de entender y configurar, Greenshot es una herramienta eficaz para gestores de proyecto, desarrolladores de software, escritores técnicos, evaluadores y cualquier persona que necesite capturas de pantalla. + \ No newline at end of file diff --git a/Greenshot/Languages/language-website-fr-FR.xml b/Greenshot/Languages/website/language-website-fr-FR.xml similarity index 99% rename from Greenshot/Languages/language-website-fr-FR.xml rename to Greenshot/Languages/website/language-website-fr-FR.xml index 2da7d16f5..54943cced 100644 --- a/Greenshot/Languages/language-website-fr-FR.xml +++ b/Greenshot/Languages/website/language-website-fr-FR.xml @@ -1,19 +1,19 @@ - - - - Téléchargement - Greenshot - Un outil de capture d’écran gratuit pour une productivité optimale - Greenshot est gratuit et «Open Source». - Si vous trouvez que Greenshot vous permet de faire des économies de temps et d’argent, vous êtes les bienvenus si vous nous apportez <a href="/support/">votre support dans le développement</a> de ce logiciel de capture d’écran. - Greenshot a été publié sous <a href="http://en.wikipedia.org/wiki/GNU_General_Public_License" target="_blank">GPL</a>, à savoir que ce logiciel peut être utilisé gratuitement, même dans un environnement commercial. - Voulez-vous en savoir plus? - Bien entendu Greenshot peut en faire beaucoup plus pour vous. Prenez la peine de regarder quelques <a href="/screenshots/">captures d’écran</a> de Greenshot en action ou essayer <a title="Download the latest stable version of Greenshot" href="/downloads/">la dernière mise à niveau</a>. - Qu’est ce que Greenshot? - Créer rapidement des captures d'une zone, d'une fenêtre ou d’un écran complet ; Il est même possible de capturer des pages web complètes (défilement) dans Internet Explorer. - Annoter, surligner, assombrir ou brouiller facilement des parties de la capture. - Greenshot est un logiciel de capture d’écran léger pour Windows avec les fonctionnalités majeures suivantes: - ...et bien d'autres options qui permettent de simplifier le travail de création ou de gestion journaliers des captures d’écran. - Exporter la capture de multiples façons: sauvegarde vers un fichier, impression, copie dans le presse-papier, joindre à un courriel, envoi vers des programmes Office ou envoi vers des sites de photos comme Flickr ou Picasa, et d’autres encore. - Simple et facile à configurer, Greenshot est un outil efficace pour des responsables de projet, développeurs de logiciel, Concepteurs de manuels techniques, testeurs ou autres personnes créant des captures d’écran. - + + + + Téléchargement + Greenshot - Un outil de capture d’écran gratuit pour une productivité optimale + Greenshot est gratuit et «Open Source». + Si vous trouvez que Greenshot vous permet de faire des économies de temps et d’argent, vous êtes les bienvenus si vous nous apportez <a href="/support/">votre support dans le développement</a> de ce logiciel de capture d’écran. + Greenshot a été publié sous <a href="http://en.wikipedia.org/wiki/GNU_General_Public_License" target="_blank">GPL</a>, à savoir que ce logiciel peut être utilisé gratuitement, même dans un environnement commercial. + Voulez-vous en savoir plus? + Bien entendu Greenshot peut en faire beaucoup plus pour vous. Prenez la peine de regarder quelques <a href="/screenshots/">captures d’écran</a> de Greenshot en action ou essayer <a title="Download the latest stable version of Greenshot" href="/downloads/">la dernière mise à niveau</a>. + Qu’est ce que Greenshot? + Créer rapidement des captures d'une zone, d'une fenêtre ou d’un écran complet ; Il est même possible de capturer des pages web complètes (défilement) dans Internet Explorer. + Annoter, surligner, assombrir ou brouiller facilement des parties de la capture. + Greenshot est un logiciel de capture d’écran léger pour Windows avec les fonctionnalités majeures suivantes: + ...et bien d'autres options qui permettent de simplifier le travail de création ou de gestion journaliers des captures d’écran. + Exporter la capture de multiples façons: sauvegarde vers un fichier, impression, copie dans le presse-papier, joindre à un courriel, envoi vers des programmes Office ou envoi vers des sites de photos comme Flickr ou Picasa, et d’autres encore. + Simple et facile à configurer, Greenshot est un outil efficace pour des responsables de projet, développeurs de logiciel, Concepteurs de manuels techniques, testeurs ou autres personnes créant des captures d’écran. + \ No newline at end of file diff --git a/Greenshot/Languages/language-website-it-IT.xml b/Greenshot/Languages/website/language-website-it-IT.xml similarity index 99% rename from Greenshot/Languages/language-website-it-IT.xml rename to Greenshot/Languages/website/language-website-it-IT.xml index 4db0441b5..31f1b1dfb 100644 --- a/Greenshot/Languages/language-website-it-IT.xml +++ b/Greenshot/Languages/website/language-website-it-IT.xml @@ -1,19 +1,19 @@ - - - - Download - Greenshot - strumento di cattura gratis ottimizzato per la produttività - Greenshot è gratuito e open source - Se si scopre che Greenshot risparmiare un sacco di tempo e / o denaro, è possibile <a href="/support/">sostenere lo sviluppo</a> di questa strumento di cattura. - Greenshot è pubblicato sotto licenza <a href="http://en.wikipedia.org/wiki/GNU_General_Public_License" target="_blank">GPL</a>. Questo software può essere scaricato e utilizzato gratuitamente, anche in un ambiente commerciale. - Vuoi saperne di più? - Naturalmente c'è molto di più che si può fare per Greenshot. Check out alcuni <a href="/screenshots/">screenshot</a> di Greenshot in azione o provare la versione <a href="/downloads/">più recente</a>. - Greenshot - Che cosa è questo? - Rapidamente rendere le immagini di uno schermo selezionata regione, finestra o completo schermo. È possibile anche catturare le pagine web da Internet Explorer completi (scorrimento). - Annotare, evidenziare o nascondere parti di screenshot è facilmente. - Greenshot è uno strumento di cattura schermo per Windows con leggeri caratteristiche essenziali: - ... e molte altre opzioni per creare e lavorare con le immagini ogni giorno. - Esportazione screenshot in vari modi: salvare in un file, stampa, copia negli appunti, attaccare a un messaggio, inviare ai programmi di Office o caricare su siti di foto come Flickr e Picasa, tra gli altri. - Essere facile da capire e configurare, Greenshot è uno strumento efficace per i project manager, sviluppatori di software, redattori tecnici, collaudatori e chiunque altro la creazione di screenshot. - + + + + Download + Greenshot - strumento di cattura gratis ottimizzato per la produttività + Greenshot è gratuito e open source + Se si scopre che Greenshot risparmiare un sacco di tempo e / o denaro, è possibile <a href="/support/">sostenere lo sviluppo</a> di questa strumento di cattura. + Greenshot è pubblicato sotto licenza <a href="http://en.wikipedia.org/wiki/GNU_General_Public_License" target="_blank">GPL</a>. Questo software può essere scaricato e utilizzato gratuitamente, anche in un ambiente commerciale. + Vuoi saperne di più? + Naturalmente c'è molto di più che si può fare per Greenshot. Check out alcuni <a href="/screenshots/">screenshot</a> di Greenshot in azione o provare la versione <a href="/downloads/">più recente</a>. + Greenshot - Che cosa è questo? + Rapidamente rendere le immagini di uno schermo selezionata regione, finestra o completo schermo. È possibile anche catturare le pagine web da Internet Explorer completi (scorrimento). + Annotare, evidenziare o nascondere parti di screenshot è facilmente. + Greenshot è uno strumento di cattura schermo per Windows con leggeri caratteristiche essenziali: + ... e molte altre opzioni per creare e lavorare con le immagini ogni giorno. + Esportazione screenshot in vari modi: salvare in un file, stampa, copia negli appunti, attaccare a un messaggio, inviare ai programmi di Office o caricare su siti di foto come Flickr e Picasa, tra gli altri. + Essere facile da capire e configurare, Greenshot è uno strumento efficace per i project manager, sviluppatori di software, redattori tecnici, collaudatori e chiunque altro la creazione di screenshot. + \ No newline at end of file diff --git a/Greenshot/Languages/language-website-lv-LV.xml b/Greenshot/Languages/website/language-website-lv-LV.xml similarity index 100% rename from Greenshot/Languages/language-website-lv-LV.xml rename to Greenshot/Languages/website/language-website-lv-LV.xml diff --git a/Greenshot/Languages/language-website-nn-NO.xml b/Greenshot/Languages/website/language-website-nn-NO.xml similarity index 99% rename from Greenshot/Languages/language-website-nn-NO.xml rename to Greenshot/Languages/website/language-website-nn-NO.xml index 1807d9b1e..c388583da 100644 --- a/Greenshot/Languages/language-website-nn-NO.xml +++ b/Greenshot/Languages/website/language-website-nn-NO.xml @@ -1,19 +1,19 @@ - - - - Nedlastingar - Greenshot - ein gratis skjermknipsar som effektiviserer kvardagen - Greenshot er gratis og har open kjeldekode - Om du finn ut at Greenshot sparar deg for mykje tid og/eller pengar, er du velkomen til å <a href="/support/">støtte utviklinga</a> av programmet! - Greenshot blir utgjeven under _GPL_, så programmet kan lastast ned og brukast utan kostnad, også i verksemder. - Sjå meir? - Sjølvsagt kan Greenshot by på meir! Ta ein gløtt på _skjermbilde_ av programmet i bruk, eller prøv den _nyaste utgåva_. - Kva er Greenshot? - Tar med eit tastetrykk bilde av eit vindauge, område eller heile skjermen - du kan til og med knipse heile nettsider (med rulling) frå Internet Explorer. - Enkel notering, markering og sensurering i knipsfiksaren. - Greenshot er eit lite og nett Windows-verktøy med dei fylgjande eigenskapane: - ...og endå meir som forenklar arbeidet med skjermbilde - kvar dag! - Eksporter skjermbildet til fil, skrivar, utklyppstavle, e-post, Office-program eller skytenester som til dømes Flickr og Picasa. - Med det enkle, konfigurerbare grensesnittet er Greenshot eit effektivt verktøy for prosjektleiarar, programvareutviklararar, tekniske skribentar, testarar og alle andre som har nytte av å ta skjermbilde. - + + + + Nedlastingar + Greenshot - ein gratis skjermknipsar som effektiviserer kvardagen + Greenshot er gratis og har open kjeldekode + Om du finn ut at Greenshot sparar deg for mykje tid og/eller pengar, er du velkomen til å <a href="/support/">støtte utviklinga</a> av programmet! + Greenshot blir utgjeven under _GPL_, så programmet kan lastast ned og brukast utan kostnad, også i verksemder. + Sjå meir? + Sjølvsagt kan Greenshot by på meir! Ta ein gløtt på _skjermbilde_ av programmet i bruk, eller prøv den _nyaste utgåva_. + Kva er Greenshot? + Tar med eit tastetrykk bilde av eit vindauge, område eller heile skjermen - du kan til og med knipse heile nettsider (med rulling) frå Internet Explorer. + Enkel notering, markering og sensurering i knipsfiksaren. + Greenshot er eit lite og nett Windows-verktøy med dei fylgjande eigenskapane: + ...og endå meir som forenklar arbeidet med skjermbilde - kvar dag! + Eksporter skjermbildet til fil, skrivar, utklyppstavle, e-post, Office-program eller skytenester som til dømes Flickr og Picasa. + Med det enkle, konfigurerbare grensesnittet er Greenshot eit effektivt verktøy for prosjektleiarar, programvareutviklararar, tekniske skribentar, testarar og alle andre som har nytte av å ta skjermbilde. + \ No newline at end of file diff --git a/Greenshot/Languages/language-website-sv-SE.xml b/Greenshot/Languages/website/language-website-sv-SE.xml similarity index 100% rename from Greenshot/Languages/language-website-sv-SE.xml rename to Greenshot/Languages/website/language-website-sv-SE.xml diff --git a/Greenshot/Languages/language-website-uk-UA.xml b/Greenshot/Languages/website/language-website-uk-UA.xml similarity index 99% rename from Greenshot/Languages/language-website-uk-UA.xml rename to Greenshot/Languages/website/language-website-uk-UA.xml index ef3dfe65c..db80898d3 100644 --- a/Greenshot/Languages/language-website-uk-UA.xml +++ b/Greenshot/Languages/website/language-website-uk-UA.xml @@ -1,19 +1,19 @@ - - - - Завантаження - Greenshot — безкоштовний інструмент для створення знімків екрану, оптимізований для покращення продуктивності - Greenshot безкоштовний і з відкритим кодом - Якщо Вам здається, що Greenshot зберігає чимало Вашого часу та/або грошей, Ви можете <a href="/support/">підтримати розробку</a> цього програмного забезпечення для створення знімків екрану. - Greenshot розповсюджується відповідно до <a href="http://uk.wikipedia.org/wiki/GNU_General_Public_License" target="_blank">GPL</a>, тобто це програмне забезпечення можна вільно завантажувати та використовувати навіть з комерційною метою. - Хочете побачити більше? - Звісно, Greenshot може зробити для Вас набагато більше. Подивіться кілька <a title="Знімки Greenshot у дії" href="/screenshots/">знімків</a> Greenshot у дії та спробуйте <a title="Завантажити найновішу стабільну версію Greenshot" href="/downloads/">останній реліз</a>. - Що таке Greenshot??? - Швидке створення знімків вибраної області, вікна або всього екрану; Ви навіть можете захоплювати всю (з прокручуванням) Інтернет-сторінку в Internet Explorer. - Легке коментування, підсвічування або виділення частин знімку. - Greenshot — це невеличка програма для створення знімків екрану для Windows з такими основними можливостями: - ...та чимало інших можливостей, що спрощують створення та обробку знімків. - Кілька варіантів експорту знімків: збереження в файл, друк, копіювання в буфер обміну, долучення до електронного листа, надсилання до офісних програм або вивантаження на фото-хостинги на зразок Flickr, Picasa та інші. - Завдяки простоті налаштування та інтуїтивності, Greenshot є ефективним інструментом для керівників проектів, розробників програмного забезпечення, технічних авторів, тестерів та будь-кого іншого, кому потрібно створювати знімки. - - + + + + Завантаження + Greenshot — безкоштовний інструмент для створення знімків екрану, оптимізований для покращення продуктивності + Greenshot безкоштовний і з відкритим кодом + Якщо Вам здається, що Greenshot зберігає чимало Вашого часу та/або грошей, Ви можете <a href="/support/">підтримати розробку</a> цього програмного забезпечення для створення знімків екрану. + Greenshot розповсюджується відповідно до <a href="http://uk.wikipedia.org/wiki/GNU_General_Public_License" target="_blank">GPL</a>, тобто це програмне забезпечення можна вільно завантажувати та використовувати навіть з комерційною метою. + Хочете побачити більше? + Звісно, Greenshot може зробити для Вас набагато більше. Подивіться кілька <a title="Знімки Greenshot у дії" href="/screenshots/">знімків</a> Greenshot у дії та спробуйте <a title="Завантажити найновішу стабільну версію Greenshot" href="/downloads/">останній реліз</a>. + Що таке Greenshot??? + Швидке створення знімків вибраної області, вікна або всього екрану; Ви навіть можете захоплювати всю (з прокручуванням) Інтернет-сторінку в Internet Explorer. + Легке коментування, підсвічування або виділення частин знімку. + Greenshot — це невеличка програма для створення знімків екрану для Windows з такими основними можливостями: + ...та чимало інших можливостей, що спрощують створення та обробку знімків. + Кілька варіантів експорту знімків: збереження в файл, друк, копіювання в буфер обміну, долучення до електронного листа, надсилання до офісних програм або вивантаження на фото-хостинги на зразок Flickr, Picasa та інші. + Завдяки простоті налаштування та інтуїтивності, Greenshot є ефективним інструментом для керівників проектів, розробників програмного забезпечення, технічних авторів, тестерів та будь-кого іншого, кому потрібно створювати знімки. + + diff --git a/GreenshotConfluencePlugin/GreenshotConfluencePlugin.csproj b/GreenshotConfluencePlugin/GreenshotConfluencePlugin.csproj index 46091586c..b969ea5ce 100644 --- a/GreenshotConfluencePlugin/GreenshotConfluencePlugin.csproj +++ b/GreenshotConfluencePlugin/GreenshotConfluencePlugin.csproj @@ -12,6 +12,16 @@ + + + + + + + Never + + + diff --git a/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs b/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs index bbedaea56..edc19b7cb 100644 --- a/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs +++ b/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs @@ -1,29 +1,28 @@ /* * Greenshot - a free and open source screenshot tool * Copyright (C) 2007-2020 Thomas Braun, Jens Klingen, Robin Krom - * + * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 1 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ using Greenshot.Plugin; using System.Runtime.InteropServices; -using System.Security; -// General Information about an assembly is controlled through the following +// General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. // The PluginAttribute describes the "entryType" and if the plugin is configurable @@ -32,6 +31,3 @@ using System.Security; // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. [assembly: ComVisible(false)] - -// Solve Link-Demand issues -[assembly: SecurityTransparent] diff --git a/GreenshotJiraPlugin/Hooking/TitleChangeEventArgs.cs b/GreenshotJiraPlugin/Hooking/TitleChangeEventArgs.cs deleted file mode 100644 index 6ec8878fd..000000000 --- a/GreenshotJiraPlugin/Hooking/TitleChangeEventArgs.cs +++ /dev/null @@ -1,50 +0,0 @@ -/* - * dapplo - building blocks for desktop applications - * Copyright (C) Dapplo 2015-2016 - * - * For more information see: http://dapplo.net/ - * dapplo repositories are hosted on GitHub: https://github.com/dapplo - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; - -namespace GreenshotJiraPlugin.Hooking -{ - /// - /// Event arguments for the TitleChangeEvent - /// - public class TitleChangeEventArgs : EventArgs - { - /// - /// HWnd of the window which has a changed title - /// - public IntPtr HWnd - { - get; - set; - } - - /// - /// Title which is changed - /// - public string Title - { - get; - set; - } - } - -} diff --git a/GreenshotJiraPlugin/Hooking/TitleChangeEventDelegate.cs b/GreenshotJiraPlugin/Hooking/TitleChangeEventDelegate.cs deleted file mode 100644 index 29847a1e5..000000000 --- a/GreenshotJiraPlugin/Hooking/TitleChangeEventDelegate.cs +++ /dev/null @@ -1,29 +0,0 @@ -/* - * dapplo - building blocks for desktop applications - * Copyright (C) Dapplo 2015-2016 - * - * For more information see: http://dapplo.net/ - * dapplo repositories are hosted on GitHub: https://github.com/dapplo - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -namespace GreenshotJiraPlugin.Hooking -{ - /// - /// Delegate for the title change event - /// - /// - public delegate void TitleChangeEventDelegate(TitleChangeEventArgs eventArgs); -} \ No newline at end of file diff --git a/GreenshotJiraPlugin/JiraMonitor.cs b/GreenshotJiraPlugin/JiraMonitor.cs index 409fc9140..3598142bd 100644 --- a/GreenshotJiraPlugin/JiraMonitor.cs +++ b/GreenshotJiraPlugin/JiraMonitor.cs @@ -27,17 +27,17 @@ using System.Threading; using System.Threading.Tasks; using Dapplo.Jira; using Dapplo.Log; -using GreenshotJiraPlugin.Hooking; +using GreenshotPlugin.Hooking; namespace GreenshotJiraPlugin { - /// - /// This class will monitor all _jira activity by registering for title changes - /// It keeps a list of the last "accessed" jiras, and makes it easy to upload to one. - /// Make sure this is instanciated on the UI thread! - /// - public class JiraMonitor : IDisposable + /// + /// This class will monitor all _jira activity by registering for title changes + /// It keeps a list of the last "accessed" jiras, and makes it easy to upload to one. + /// Make sure this is instanciated on the UI thread! + /// + public class JiraMonitor : IDisposable { private static readonly LogSource Log = new LogSource(); private readonly Regex _jiraKeyPattern = new Regex(@"[A-Z][A-Z0-9]+\-[0-9]+"); diff --git a/GreenshotJiraPlugin/Hooking/WindowsEventHook.cs b/GreenshotPlugin/Hooking/WindowsEventHook.cs similarity index 91% rename from GreenshotJiraPlugin/Hooking/WindowsEventHook.cs rename to GreenshotPlugin/Hooking/WindowsEventHook.cs index cd13831d3..e24675abd 100644 --- a/GreenshotJiraPlugin/Hooking/WindowsEventHook.cs +++ b/GreenshotPlugin/Hooking/WindowsEventHook.cs @@ -1,149 +1,149 @@ -/* - * dapplo - building blocks for desktop applications - * Copyright (C) Dapplo 2015-2016 - * - * For more information see: http://dapplo.net/ - * dapplo repositories are hosted on GitHub: https://github.com/dapplo - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using GreenshotPlugin.UnmanagedHelpers; - -namespace GreenshotJiraPlugin.Hooking -{ - /// - /// The WinEventHook can register handlers to become important windows events - /// This makes it possible to know a.o. when a window is created, moved, updated and closed. - /// - public class WindowsEventHook : IDisposable - { - private readonly WinEventDelegate _winEventHandler; - private GCHandle _gcHandle; - - /// - /// Used with Register hook - /// - /// - /// - /// - /// - /// - /// - public delegate void WinEventHandler(WinEvent eventType, IntPtr hwnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime); - - /// - /// Create a WindowsEventHook object - /// - public WindowsEventHook() - { - _winEventHandler = WinEventDelegateHandler; - _gcHandle = GCHandle.Alloc(_winEventHandler); - } - - [DllImport("user32", SetLastError = true)] - private static extern bool UnhookWinEvent(IntPtr hWinEventHook); - [DllImport("user32", SetLastError = true)] - private static extern IntPtr SetWinEventHook(WinEvent eventMin, WinEvent eventMax, IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc, int idProcess, int idThread, WinEventHookFlags dwFlags); - - /// - /// Used with SetWinEventHook - /// - /// - /// - /// - /// - /// - /// - /// - private delegate void WinEventDelegate(IntPtr hWinEventHook, WinEvent eventType, IntPtr hwnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime); - - private readonly IDictionary _winEventHandlers = new Dictionary(); - - /// - /// Are hooks active? - /// - public bool IsHooked => _winEventHandlers.Count > 0; - - /// - /// Hook a WinEvent - /// - /// - /// - /// true if success - public void Hook(WinEvent winEvent, WinEventHandler winEventHandler) - { - Hook(winEvent, winEvent, winEventHandler); - } - - /// - /// Hook a WinEvent - /// - /// - /// - /// - public void Hook(WinEvent winEventStart, WinEvent winEventEnd, WinEventHandler winEventHandler) - { - var hookPtr = SetWinEventHook(winEventStart, winEventEnd, IntPtr.Zero, _winEventHandler, 0, 0, WinEventHookFlags.WINEVENT_SKIPOWNPROCESS | WinEventHookFlags.WINEVENT_OUTOFCONTEXT); - _winEventHandlers.Add(hookPtr, winEventHandler); - } - - /// - /// Remove all hooks - /// - private void Unhook() - { - foreach (var hookPtr in _winEventHandlers.Keys) - { - if (hookPtr != IntPtr.Zero) - { - UnhookWinEvent(hookPtr); - } - } - _winEventHandlers.Clear(); - _gcHandle.Free(); - } - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - Unhook(); - } - - /// - /// Call the WinEventHandler for this event - /// - /// - /// - /// - /// - /// - /// - /// - private void WinEventDelegateHandler(IntPtr hWinEventHook, WinEvent eventType, IntPtr hWnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime) - { - if (_winEventHandlers.TryGetValue(hWinEventHook, out var handler)) - { - handler(eventType, hWnd, idObject, idChild, dwEventThread, dwmsEventTime); - } - } - - } - -} +/* + * dapplo - building blocks for desktop applications + * Copyright (C) Dapplo 2015-2016 + * + * For more information see: http://dapplo.net/ + * dapplo repositories are hosted on GitHub: https://github.com/dapplo + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using GreenshotPlugin.UnmanagedHelpers; + +namespace GreenshotPlugin.Hooking +{ + /// + /// The WinEventHook can register handlers to become important windows events + /// This makes it possible to know a.o. when a window is created, moved, updated and closed. + /// + public class WindowsEventHook : IDisposable + { + private readonly WinEventDelegate _winEventHandler; + private GCHandle _gcHandle; + + /// + /// Used with Register hook + /// + /// + /// + /// + /// + /// + /// + public delegate void WinEventHandler(WinEvent eventType, IntPtr hwnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime); + + /// + /// Create a WindowsEventHook object + /// + public WindowsEventHook() + { + _winEventHandler = WinEventDelegateHandler; + _gcHandle = GCHandle.Alloc(_winEventHandler); + } + + [DllImport("user32", SetLastError = true)] + private static extern bool UnhookWinEvent(IntPtr hWinEventHook); + [DllImport("user32", SetLastError = true)] + private static extern IntPtr SetWinEventHook(WinEvent eventMin, WinEvent eventMax, IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc, int idProcess, int idThread, WinEventHookFlags dwFlags); + + /// + /// Used with SetWinEventHook + /// + /// + /// + /// + /// + /// + /// + /// + private delegate void WinEventDelegate(IntPtr hWinEventHook, WinEvent eventType, IntPtr hwnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime); + + private readonly IDictionary _winEventHandlers = new Dictionary(); + + /// + /// Are hooks active? + /// + public bool IsHooked => _winEventHandlers.Count > 0; + + /// + /// Hook a WinEvent + /// + /// + /// + /// true if success + public void Hook(WinEvent winEvent, WinEventHandler winEventHandler) + { + Hook(winEvent, winEvent, winEventHandler); + } + + /// + /// Hook a WinEvent + /// + /// + /// + /// + public void Hook(WinEvent winEventStart, WinEvent winEventEnd, WinEventHandler winEventHandler) + { + var hookPtr = SetWinEventHook(winEventStart, winEventEnd, IntPtr.Zero, _winEventHandler, 0, 0, WinEventHookFlags.WINEVENT_SKIPOWNPROCESS | WinEventHookFlags.WINEVENT_OUTOFCONTEXT); + _winEventHandlers.Add(hookPtr, winEventHandler); + } + + /// + /// Remove all hooks + /// + private void Unhook() + { + foreach (var hookPtr in _winEventHandlers.Keys) + { + if (hookPtr != IntPtr.Zero) + { + UnhookWinEvent(hookPtr); + } + } + _winEventHandlers.Clear(); + _gcHandle.Free(); + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + Unhook(); + } + + /// + /// Call the WinEventHandler for this event + /// + /// + /// + /// + /// + /// + /// + /// + private void WinEventDelegateHandler(IntPtr hWinEventHook, WinEvent eventType, IntPtr hWnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime) + { + if (_winEventHandlers.TryGetValue(hWinEventHook, out var handler)) + { + handler(eventType, hWnd, idObject, idChild, dwEventThread, dwmsEventTime); + } + } + + } + +} diff --git a/GreenshotPlugin/Hooking/WindowsOpenCloseMonitor.cs b/GreenshotPlugin/Hooking/WindowsOpenCloseMonitor.cs new file mode 100644 index 000000000..3da390952 --- /dev/null +++ b/GreenshotPlugin/Hooking/WindowsOpenCloseMonitor.cs @@ -0,0 +1,171 @@ +/* + * dapplo - building blocks for desktop applications + * Copyright (C) Dapplo 2015-2016 + * + * For more information see: http://dapplo.net/ + * dapplo repositories are hosted on GitHub: https://github.com/dapplo + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; +using GreenshotPlugin.Core; +using GreenshotPlugin.UnmanagedHelpers; + +namespace GreenshotPlugin.Hooking +{ + /// + /// Event arguments for the WindowOpenCloseEvent + /// + public class WindowOpenCloseEventArgs : EventArgs + { + public bool IsOpen { get; set; } + /// + /// HWnd of the window which has a changed title + /// + public IntPtr HWnd + { + get; + set; + } + + /// + /// Title which is changed + /// + public string Title + { + get; + set; + } + + public string ClassName { get; set; } + } + /// + /// Delegate for the title change event + /// + /// + public delegate void WindowOpenCloseEventDelegate(WindowOpenCloseEventArgs eventArgs); + + /// + /// Monitor all title changes + /// + public sealed class WindowsOpenCloseMonitor : IDisposable + { + private WindowsEventHook _hook; + private readonly object _lockObject = new object(); + // ReSharper disable once InconsistentNaming + private event WindowOpenCloseEventDelegate _windowOpenCloseEvent; + + /// + /// Add / remove event handler to the title monitor + /// + public event WindowOpenCloseEventDelegate WindowOpenCloseChangeEvent + { + add + { + lock (_lockObject) + { + if (_hook == null) + { + _hook = new WindowsEventHook(); + _hook.Hook(WinEvent.EVENT_OBJECT_CREATE, WinEvent.EVENT_OBJECT_DESTROY, WinEventHandler); + } + _windowOpenCloseEvent += value; + } + } + remove + { + lock (_lockObject) + { + _windowOpenCloseEvent -= value; + if (_windowOpenCloseEvent == null || _windowOpenCloseEvent.GetInvocationList().Length == 0) + { + if (_hook != null) + { + _hook.Dispose(); + _hook = null; + } + } + } + } + } + + /// + /// WinEventDelegate for the creation & destruction + /// + /// + /// + /// + /// + /// + /// + private void WinEventHandler(WinEvent eventType, IntPtr hWnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime) + { + if (hWnd == IntPtr.Zero || idObject != EventObjects.OBJID_WINDOW) + { + return; + } + if (eventType == WinEvent.EVENT_OBJECT_CREATE) + { + if (_windowOpenCloseEvent != null) + { + var windowsDetails = new WindowDetails(hWnd); + _windowOpenCloseEvent(new WindowOpenCloseEventArgs { HWnd = hWnd, IsOpen = true, Title = windowsDetails.Text, ClassName = windowsDetails.ClassName }); + } + } + if (eventType == WinEvent.EVENT_OBJECT_DESTROY) + { + _windowOpenCloseEvent?.Invoke(new WindowOpenCloseEventArgs { HWnd = hWnd, IsOpen = false }); + } + } + + private bool _disposedValue; // To detect redundant calls + + /// + /// Dispose the underlying hook + /// + public void Dispose(bool disposing) + { + if (_disposedValue) + { + return; + } + lock (_lockObject) + { + _hook?.Dispose(); + } + _disposedValue = true; + } + + /// + /// Make sure the finalizer disposes the underlying hook + /// + ~WindowsOpenCloseMonitor() + { + // Do not change this code. Put cleanup code in Dispose(bool disposing) above. + Dispose(false); + } + + /// + /// Dispose the underlying hook + /// + public void Dispose() + { + // Do not change this code. Put cleanup code in Dispose(bool disposing) above. + Dispose(true); + GC.SuppressFinalize(this); + } + } + +} diff --git a/GreenshotJiraPlugin/Hooking/WindowsTitleMonitor.cs b/GreenshotPlugin/Hooking/WindowsTitleMonitor.cs similarity index 83% rename from GreenshotJiraPlugin/Hooking/WindowsTitleMonitor.cs rename to GreenshotPlugin/Hooking/WindowsTitleMonitor.cs index d92ffe2d3..919357caf 100644 --- a/GreenshotJiraPlugin/Hooking/WindowsTitleMonitor.cs +++ b/GreenshotPlugin/Hooking/WindowsTitleMonitor.cs @@ -1,135 +1,164 @@ -/* - * dapplo - building blocks for desktop applications - * Copyright (C) Dapplo 2015-2016 - * - * For more information see: http://dapplo.net/ - * dapplo repositories are hosted on GitHub: https://github.com/dapplo - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using GreenshotPlugin.Core; -using GreenshotPlugin.UnmanagedHelpers; - -namespace GreenshotJiraPlugin.Hooking -{ - /// - /// Monitor all title changes - /// - public sealed class WindowsTitleMonitor : IDisposable - { - private WindowsEventHook _hook; - private readonly object _lockObject = new object(); - // ReSharper disable once InconsistentNaming - private event TitleChangeEventDelegate _titleChangeEvent; - - /// - /// Add / remove event handler to the title monitor - /// - public event TitleChangeEventDelegate TitleChangeEvent - { - add - { - lock (_lockObject) - { - if (_hook == null) - { - _hook = new WindowsEventHook(); - _hook.Hook(WinEvent.EVENT_OBJECT_NAMECHANGE, WinEventHandler); - } - _titleChangeEvent += value; - } - } - remove - { - lock (_lockObject) - { - _titleChangeEvent -= value; - if (_titleChangeEvent == null || _titleChangeEvent.GetInvocationList().Length == 0) - { - if (_hook != null) - { - _hook.Dispose(); - _hook = null; - } - } - } - } - } - - /// - /// WinEventDelegate for the creation & destruction - /// - /// - /// - /// - /// - /// - /// - private void WinEventHandler(WinEvent eventType, IntPtr hWnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime) - { - if (hWnd == IntPtr.Zero || idObject != EventObjects.OBJID_WINDOW) - { - return; - } - if (eventType == WinEvent.EVENT_OBJECT_NAMECHANGE) - { - if (_titleChangeEvent != null) - { - string newTitle = new WindowDetails(hWnd).Text; - _titleChangeEvent(new TitleChangeEventArgs { HWnd = hWnd, Title = newTitle }); - } - } - } - - private bool _disposedValue; // To detect redundant calls - - /// - /// Dispose the underlying hook - /// - public void Dispose(bool disposing) - { - if (_disposedValue) - { - return; - } - lock (_lockObject) - { - _hook?.Dispose(); - } - _disposedValue = true; - } - - /// - /// Make sure the finalizer disposes the underlying hook - /// - ~WindowsTitleMonitor() - { - // Do not change this code. Put cleanup code in Dispose(bool disposing) above. - Dispose(false); - } - - /// - /// Dispose the underlying hook - /// - public void Dispose() - { - // Do not change this code. Put cleanup code in Dispose(bool disposing) above. - Dispose(true); - GC.SuppressFinalize(this); - } - } - -} +/* + * dapplo - building blocks for desktop applications + * Copyright (C) Dapplo 2015-2016 + * + * For more information see: http://dapplo.net/ + * dapplo repositories are hosted on GitHub: https://github.com/dapplo + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; +using GreenshotPlugin.Core; +using GreenshotPlugin.UnmanagedHelpers; + +namespace GreenshotPlugin.Hooking +{ + /// + /// Event arguments for the TitleChangeEvent + /// + public class TitleChangeEventArgs : EventArgs + { + /// + /// HWnd of the window which has a changed title + /// + public IntPtr HWnd + { + get; + set; + } + + /// + /// Title which is changed + /// + public string Title + { + get; + set; + } + } + /// + /// Delegate for the title change event + /// + /// + public delegate void TitleChangeEventDelegate(TitleChangeEventArgs eventArgs); + + /// + /// Monitor all title changes + /// + public sealed class WindowsTitleMonitor : IDisposable + { + private WindowsEventHook _hook; + private readonly object _lockObject = new object(); + // ReSharper disable once InconsistentNaming + private event TitleChangeEventDelegate _titleChangeEvent; + + /// + /// Add / remove event handler to the title monitor + /// + public event TitleChangeEventDelegate TitleChangeEvent + { + add + { + lock (_lockObject) + { + if (_hook == null) + { + _hook = new WindowsEventHook(); + _hook.Hook(WinEvent.EVENT_OBJECT_NAMECHANGE, WinEventHandler); + } + _titleChangeEvent += value; + } + } + remove + { + lock (_lockObject) + { + _titleChangeEvent -= value; + if (_titleChangeEvent == null || _titleChangeEvent.GetInvocationList().Length == 0) + { + if (_hook != null) + { + _hook.Dispose(); + _hook = null; + } + } + } + } + } + + /// + /// WinEventDelegate for the creation & destruction + /// + /// + /// + /// + /// + /// + /// + private void WinEventHandler(WinEvent eventType, IntPtr hWnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime) + { + if (hWnd == IntPtr.Zero || idObject != EventObjects.OBJID_WINDOW) + { + return; + } + if (eventType == WinEvent.EVENT_OBJECT_NAMECHANGE) + { + if (_titleChangeEvent != null) + { + string newTitle = new WindowDetails(hWnd).Text; + _titleChangeEvent(new TitleChangeEventArgs { HWnd = hWnd, Title = newTitle }); + } + } + } + + private bool _disposedValue; // To detect redundant calls + + /// + /// Dispose the underlying hook + /// + public void Dispose(bool disposing) + { + if (_disposedValue) + { + return; + } + lock (_lockObject) + { + _hook?.Dispose(); + } + _disposedValue = true; + } + + /// + /// Make sure the finalizer disposes the underlying hook + /// + ~WindowsTitleMonitor() + { + // Do not change this code. Put cleanup code in Dispose(bool disposing) above. + Dispose(false); + } + + /// + /// Dispose the underlying hook + /// + public void Dispose() + { + // Do not change this code. Put cleanup code in Dispose(bool disposing) above. + Dispose(true); + GC.SuppressFinalize(this); + } + } + +} diff --git a/GreenshotWin10Plugin/GreenshotWin10Plugin.csproj b/GreenshotWin10Plugin/GreenshotWin10Plugin.csproj index 85d3f19f9..225968f64 100644 --- a/GreenshotWin10Plugin/GreenshotWin10Plugin.csproj +++ b/GreenshotWin10Plugin/GreenshotWin10Plugin.csproj @@ -14,7 +14,6 @@ - diff --git a/GreenshotWin10Plugin/Native/WindowMessageInfo.cs b/GreenshotWin10Plugin/Native/WindowMessageInfo.cs deleted file mode 100644 index 231e3ec14..000000000 --- a/GreenshotWin10Plugin/Native/WindowMessageInfo.cs +++ /dev/null @@ -1,70 +0,0 @@ -// Greenshot - a free and open source screenshot tool -// Copyright (C) 2007-2020 Thomas Braun, Jens Klingen, Robin Krom -// -// For more information see: http://getgreenshot.org/ -// The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 1 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -using GreenshotPlugin.UnmanagedHelpers; -using System; - -namespace Greenshot.Addon.Win10.Native -{ - /// - /// Container for the windows messages - /// - public class WindowMessageInfo - { - /// - /// IntPtr with the Handle of the window - /// - public IntPtr Handle { get; private set; } - - /// - /// WindowsMessages which is the actual message - /// - public WindowsMessages Message { get; private set; } - - /// - /// IntPtr with the word-param - /// - public IntPtr WordParam { get; private set; } - - /// - /// IntPtr with the long-param - /// - public IntPtr LongParam { get; private set; } - - /// - /// Factory method for the Window Message Info - /// - /// IntPtr with the Handle of the window - /// WindowsMessages which is the actual message - /// IntPtr with the word-param - /// IntPtr with the long-param - /// - /// WindowMessageInfo - public static WindowMessageInfo Create(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) - { - return new WindowMessageInfo - { - Handle = hwnd, - Message = (WindowsMessages)msg, - WordParam = wParam, - LongParam = lParam - }; - } - } -} \ No newline at end of file diff --git a/GreenshotWin10Plugin/Native/WindowMessageMonitor.cs b/GreenshotWin10Plugin/Native/WindowMessageMonitor.cs deleted file mode 100644 index 81e40ec66..000000000 --- a/GreenshotWin10Plugin/Native/WindowMessageMonitor.cs +++ /dev/null @@ -1,137 +0,0 @@ -// Greenshot - a free and open source screenshot tool -// Copyright (C) 2007-2020 Thomas Braun, Jens Klingen, Robin Krom -// -// For more information see: http://getgreenshot.org/ -// The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 1 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -using System; -using System.Reactive.Disposables; -using System.Reactive.Linq; -using System.Windows; -using System.Windows.Interop; - -namespace Greenshot.Addon.Win10.Native -{ - - /// - /// A monitor for window messages - /// - public static class WindowMessageMonitor - { - /// - /// Create a HwndSource for the specified Window - /// - /// Window - /// HwndSource - private static HwndSource ToHwndSource(this Window window) - { - IntPtr windowHandle = new WindowInteropHelper(window).Handle; - if (windowHandle == IntPtr.Zero) - { - return null; - } - return HwndSource.FromHwnd(windowHandle); - } - - /// - /// Create an observable for the specified window - /// - public static IObservable WindowMessages(this Window window) - { - return WindowMessages(window, null); - } - - /// - /// Create an observable for the specified HwndSource - /// - public static IObservable WindowMessages(this HwndSource hwndSource) - { - return WindowMessages(null, hwndSource); - } - - /// - /// Create an observable for the specified window or HwndSource - /// - /// Window - /// HwndSource - /// IObservable - private static IObservable WindowMessages(Window window, HwndSource hwndSource) - { - if (window == null && hwndSource == null) - { - throw new NotSupportedException("One of Window or HwndSource must be supplied"); - } - if (window != null && hwndSource != null) - { - throw new NotSupportedException("Either Window or HwndSource must be supplied"); - } - - return Observable.Create(observer => - { - // This handles the message, and generates the observable OnNext - IntPtr WindowMessageHandler(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) - { - observer.OnNext(WindowMessageInfo.Create(hwnd, msg, wParam, lParam, ref handled)); - // ReSharper disable once AccessToDisposedClosure - if (hwndSource.IsDisposed) - { - observer.OnCompleted(); - } - return IntPtr.Zero; - } - - void HwndSourceDisposedHandle(object sender, EventArgs e) - { - observer.OnCompleted(); - } - - void RegisterHwndSource() - { - hwndSource.Disposed += HwndSourceDisposedHandle; - hwndSource.AddHook(WindowMessageHandler); - } - - if (window != null) - { - hwndSource = window.ToHwndSource(); - } - if (hwndSource != null) - { - RegisterHwndSource(); - } - else - { - // No, try to get it later - window.SourceInitialized += (sender, args) => - { - hwndSource = window.ToHwndSource(); - RegisterHwndSource(); - }; - } - - return Disposable.Create(() => - { - hwndSource.Disposed -= HwndSourceDisposedHandle; - hwndSource.RemoveHook(WindowMessageHandler); - hwndSource.Dispose(); - }); - }) - // Make sure there is always a value produced when connecting - .Publish() - .RefCount(); - } - } -} diff --git a/GreenshotWin10Plugin/Win10ShareDestination.cs b/GreenshotWin10Plugin/Win10ShareDestination.cs index 2a86b585b..20fbde97a 100644 --- a/GreenshotWin10Plugin/Win10ShareDestination.cs +++ b/GreenshotWin10Plugin/Win10ShareDestination.cs @@ -28,15 +28,13 @@ using System.Windows.Interop; using Windows.ApplicationModel.DataTransfer; using Windows.Storage; using Windows.Storage.Streams; -using Greenshot.Addon.Win10.Native; using Color = Windows.UI.Color; -using System.Reactive.Linq; -using GreenshotPlugin.UnmanagedHelpers; using Greenshot.Plugin; using GreenshotPlugin.Core; using System.Drawing; using GreenshotWin10Plugin.Native; using System.Windows.Media; +using GreenshotPlugin.Hooking; namespace GreenshotWin10Plugin { @@ -67,6 +65,8 @@ namespace GreenshotWin10Plugin public TaskCompletionSource ShareTask { get; } = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); public bool IsDataRequested { get; set; } + + public IntPtr SharingHwnd { get; set; } } /// @@ -92,28 +92,42 @@ namespace GreenshotWin10Plugin AllowsTransparency = true, Background = new SolidColorBrush(Colors.Transparent) }; + var shareInfo = new ShareInfo(); triggerWindow.Show(); - var shareInfo = new ShareInfo(); + + var focusMonitor = new WindowsOpenCloseMonitor(); + var windowHandle = new WindowInteropHelper(triggerWindow).Handle; // This is a bad trick, but don't know how else to do it. // Wait for the focus to return, and depending on the state close the window! - triggerWindow.WindowMessages() - .Where(m => m.Message == WindowsMessages.WM_SETFOCUS).Delay(TimeSpan.FromSeconds(1)) - .Subscribe(info => - { - if (shareInfo.ApplicationName != null) - { - return; - } + focusMonitor.WindowOpenCloseChangeEvent += e => { - shareInfo.ShareTask.TrySetResult(false); - }); - var windowHandle = new WindowInteropHelper(triggerWindow).Handle; + if (e.IsOpen) + { + if ("Windows Shell Experience Host" == e.Title) + { + shareInfo.SharingHwnd = e.HWnd; + } + return; + } + else + { + if (e.HWnd == shareInfo.SharingHwnd) + { + if (shareInfo.ApplicationName != null) + { + return; + } + shareInfo.ShareTask.TrySetResult(false); + } + } + }; Share(shareInfo, windowHandle, surface, captureDetails).GetAwaiter().GetResult(); Log.Debug("Sharing finished, closing window."); triggerWindow.Close(); + focusMonitor.Dispose(); if (string.IsNullOrWhiteSpace(shareInfo.ApplicationName)) { exportInformation.ExportMade = false; @@ -144,123 +158,121 @@ namespace GreenshotWin10Plugin /// Task with string, which describes the application which was used to share with private async Task Share(ShareInfo shareInfo, IntPtr handle, ISurface surface, ICaptureDetails captureDetails) { - using (var imageStream = new MemoryRandomAccessStream()) - using (var logoStream = new MemoryRandomAccessStream()) - using (var thumbnailStream = new MemoryRandomAccessStream()) + using var imageStream = new MemoryRandomAccessStream(); + using var logoStream = new MemoryRandomAccessStream(); + using var thumbnailStream = new MemoryRandomAccessStream(); + var outputSettings = new SurfaceOutputSettings(); + outputSettings.PreventGreenshotFormat(); + + // Create capture for export + ImageOutput.SaveToStream(surface, imageStream, outputSettings); + imageStream.Position = 0; + Log.Debug("Created RandomAccessStreamReference for the image"); + var imageRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(imageStream); + + // Create thumbnail + RandomAccessStreamReference thumbnailRandomAccessStreamReference; + using (var tmpImageForThumbnail = surface.GetImageForExport()) + using (var thumbnail = ImageHelper.CreateThumbnail(tmpImageForThumbnail, 240, 160)) { - var outputSettings = new SurfaceOutputSettings(); - outputSettings.PreventGreenshotFormat(); + ImageOutput.SaveToStream(thumbnail, null, thumbnailStream, outputSettings); + thumbnailStream.Position = 0; + thumbnailRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(thumbnailStream); + Log.Debug("Created RandomAccessStreamReference for the thumbnail"); + } - // Create capture for export - ImageOutput.SaveToStream(surface, imageStream, outputSettings); - imageStream.Position = 0; - Log.Debug("Created RandomAccessStreamReference for the image"); - var imageRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(imageStream); + // Create logo + RandomAccessStreamReference logoRandomAccessStreamReference; + using (var logo = GreenshotResources.getGreenshotIcon().ToBitmap()) + using (var logoThumbnail = ImageHelper.CreateThumbnail(logo, 30, 30)) + { + ImageOutput.SaveToStream(logoThumbnail, null, logoStream, outputSettings); + logoStream.Position = 0; + logoRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(logoStream); + Log.Info("Created RandomAccessStreamReference for the logo"); + } - // Create thumbnail - RandomAccessStreamReference thumbnailRandomAccessStreamReference; - using (var tmpImageForThumbnail = surface.GetImageForExport()) - using (var thumbnail = ImageHelper.CreateThumbnail(tmpImageForThumbnail, 240, 160)) - { - ImageOutput.SaveToStream(thumbnail, null, thumbnailStream, outputSettings); - thumbnailStream.Position = 0; - thumbnailRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(thumbnailStream); - Log.Debug("Created RandomAccessStreamReference for the thumbnail"); - } - - // Create logo - RandomAccessStreamReference logoRandomAccessStreamReference; - using (var logo = GreenshotResources.getGreenshotIcon().ToBitmap()) - using (var logoThumbnail = ImageHelper.CreateThumbnail(logo, 30, 30)) - { - ImageOutput.SaveToStream(logoThumbnail, null, logoStream, outputSettings); - logoStream.Position = 0; - logoRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(logoStream); - Log.Info("Created RandomAccessStreamReference for the logo"); - } - - var dataTransferManagerHelper = new DataTransferManagerHelper(handle); - dataTransferManagerHelper.DataTransferManager.ShareProvidersRequested += (sender, args) => - { - shareInfo.AreShareProvidersRequested = true; - Log.DebugFormat("Share providers requested: {0}", string.Join(",", args.Providers.Select(p => p.Title))); - }; - dataTransferManagerHelper.DataTransferManager.TargetApplicationChosen += (dtm, args) => - { - shareInfo.ApplicationName = args.ApplicationName; - Log.DebugFormat("TargetApplicationChosen: {0}", args.ApplicationName); - }; - var filename = FilenameHelper.GetFilename(OutputFormat.png, captureDetails); - var storageFile = await StorageFile.CreateStreamedFileAsync(filename, async streamedFileDataRequest => - { - shareInfo.IsDeferredFileCreated = true; + var dataTransferManagerHelper = new DataTransferManagerHelper(handle); + dataTransferManagerHelper.DataTransferManager.ShareProvidersRequested += (sender, args) => + { + shareInfo.AreShareProvidersRequested = true; + Log.DebugFormat("Share providers requested: {0}", string.Join(",", args.Providers.Select(p => p.Title))); + }; + dataTransferManagerHelper.DataTransferManager.TargetApplicationChosen += (dtm, args) => + { + shareInfo.ApplicationName = args.ApplicationName; + Log.DebugFormat("TargetApplicationChosen: {0}", args.ApplicationName); + }; + var filename = FilenameHelper.GetFilename(OutputFormat.png, captureDetails); + var storageFile = await StorageFile.CreateStreamedFileAsync(filename, async streamedFileDataRequest => + { + shareInfo.IsDeferredFileCreated = true; // Information on the "how" was found here: https://socialeboladev.wordpress.com/2013/03/15/how-to-use-createstreamedfileasync/ Log.DebugFormat("Creating deferred file {0}", filename); - try + try + { + using (var deferredStream = streamedFileDataRequest.AsStreamForWrite()) { - using (var deferredStream = streamedFileDataRequest.AsStreamForWrite()) - { - await imageStream.CopyToAsync(deferredStream).ConfigureAwait(false); - await imageStream.FlushAsync().ConfigureAwait(false); - } + await imageStream.CopyToAsync(deferredStream).ConfigureAwait(false); + await imageStream.FlushAsync().ConfigureAwait(false); + } // Signal that the stream is ready streamedFileDataRequest.Dispose(); // Signal that the action is ready, bitmap was exported shareInfo.ShareTask.TrySetResult(true); - } - catch (Exception) - { - streamedFileDataRequest.FailAndClose(StreamedFileFailureMode.Incomplete); - } - }, imageRandomAccessStreamReference).AsTask().ConfigureAwait(false); - - dataTransferManagerHelper.DataTransferManager.DataRequested += (dataTransferManager, dataRequestedEventArgs) => + } + catch (Exception) { - var deferral = dataRequestedEventArgs.Request.GetDeferral(); - try - { - shareInfo.IsDataRequested = true; - Log.DebugFormat("DataRequested with operation {0}", dataRequestedEventArgs.Request.Data.RequestedOperation); - var dataPackage = dataRequestedEventArgs.Request.Data; - dataPackage.OperationCompleted += (dp, eventArgs) => - { - Log.DebugFormat("OperationCompleted: {0}, shared with", eventArgs.Operation); - shareInfo.CompletedWithOperation = eventArgs.Operation; - shareInfo.AcceptedFormat = eventArgs.AcceptedFormatId; + streamedFileDataRequest.FailAndClose(StreamedFileFailureMode.Incomplete); + } + }, imageRandomAccessStreamReference).AsTask().ConfigureAwait(false); - shareInfo.ShareTask.TrySetResult(true); - }; - dataPackage.Destroyed += (dp, o) => - { - shareInfo.IsDestroyed = true; - Log.Debug("Destroyed"); - shareInfo.ShareTask.TrySetResult(true); - }; - dataPackage.ShareCompleted += (dp, shareCompletedEventArgs) => - { - shareInfo.IsShareCompleted = true; - Log.Debug("ShareCompleted"); - shareInfo.ShareTask.TrySetResult(true); - }; - dataPackage.Properties.Title = captureDetails.Title; - dataPackage.Properties.ApplicationName = "Greenshot"; - dataPackage.Properties.Description = "Share a screenshot"; - dataPackage.Properties.Thumbnail = thumbnailRandomAccessStreamReference; - dataPackage.Properties.Square30x30Logo = logoRandomAccessStreamReference; - dataPackage.Properties.LogoBackgroundColor = Color.FromArgb(0xff, 0x3d, 0x3d, 0x3d); - dataPackage.SetStorageItems(new[] {storageFile}); - dataPackage.SetBitmap(imageRandomAccessStreamReference); - } - finally + dataTransferManagerHelper.DataTransferManager.DataRequested += (dataTransferManager, dataRequestedEventArgs) => + { + var deferral = dataRequestedEventArgs.Request.GetDeferral(); + try + { + shareInfo.IsDataRequested = true; + Log.DebugFormat("DataRequested with operation {0}", dataRequestedEventArgs.Request.Data.RequestedOperation); + var dataPackage = dataRequestedEventArgs.Request.Data; + dataPackage.OperationCompleted += (dp, eventArgs) => { - deferral.Complete(); - Log.Debug("Called deferral.Complete()"); - } - }; - dataTransferManagerHelper.ShowShareUi(); - Log.Debug("ShowShareUi finished."); - await shareInfo.ShareTask.Task.ConfigureAwait(false); - } + Log.DebugFormat("OperationCompleted: {0}, shared with", eventArgs.Operation); + shareInfo.CompletedWithOperation = eventArgs.Operation; + shareInfo.AcceptedFormat = eventArgs.AcceptedFormatId; + + shareInfo.ShareTask.TrySetResult(true); + }; + dataPackage.Destroyed += (dp, o) => + { + shareInfo.IsDestroyed = true; + Log.Debug("Destroyed"); + shareInfo.ShareTask.TrySetResult(true); + }; + dataPackage.ShareCompleted += (dp, shareCompletedEventArgs) => + { + shareInfo.IsShareCompleted = true; + Log.Debug("ShareCompleted"); + shareInfo.ShareTask.TrySetResult(true); + }; + dataPackage.Properties.Title = captureDetails.Title; + dataPackage.Properties.ApplicationName = "Greenshot"; + dataPackage.Properties.Description = "Share a screenshot"; + dataPackage.Properties.Thumbnail = thumbnailRandomAccessStreamReference; + dataPackage.Properties.Square30x30Logo = logoRandomAccessStreamReference; + dataPackage.Properties.LogoBackgroundColor = Color.FromArgb(0xff, 0x3d, 0x3d, 0x3d); + dataPackage.SetStorageItems(new[] { storageFile }); + dataPackage.SetBitmap(imageRandomAccessStreamReference); + } + finally + { + deferral.Complete(); + Log.Debug("Called deferral.Complete()"); + } + }; + dataTransferManagerHelper.ShowShareUi(); + Log.Debug("ShowShareUi finished."); + await shareInfo.ShareTask.Task.ConfigureAwait(false); } } }