Тень в форме без границ (Powershell GUI) - PullRequest
0 голосов
/ 07 января 2020

Как можно нарисовать тень на форме без полей, когда $Form.FormBorderStyle = 'None'? Я нашел несколько решений , но они для C#. Я думаю, что есть похожий вариант для Powershell, но я до сих пор не могу его найти. Спасибо за ответы.

Ответы [ 2 ]

1 голос
/ 08 января 2020

PowerShell равно . NET, как C#. Большинство из тех же. NET библиотек будут работать в PowerShell, как и в C#, с некоторыми причудливыми крайними случаями из-за того, что выполнение скрипта отличается от скомпилированной. NET программы. Если вы найдете примеры из C#, вы обычно можете создавать те же объекты и вызывать те же методы, которые вы видите в C# примерах. В большинстве случаев это предпочтительный метод для перевода вызовов C# в синтаксис PowerShell.

Однако PowerShell делает шаг вперед по сравнению с этим, а также позволяет компилировать и выполните ad-ho c C# код . Например, :

$assemblies=(
    "System"
)

$source=@"
using System;
namespace Helloworld
{
    public static class Hello{
        public static void Main(){
            Console.WriteLine("Hello, world!");
        }
    }
}
"@

Add-Type -ReferencedAssemblies $assemblies -TypeDefinition $source -Language CSharp
[HelloWorld.Hello]::Main()

Код, представленный выше, выполняет компиляцию короткого класса стиля hello-world и делает его члены доступными для сеанса PowerShell после завершения Add-Type. Хотя в целом этого метода следует избегать в пользу вызова членов. NET непосредственно из PowerShell, в некоторых случаях (например, в случае использования P/Invoke для доступа к Win32 API) это становится полезным, и это ваше Единственный реальный вариант.

Существует также третий вариант. Вместо того, чтобы ad-ho c компилировать C# код, как описано выше, вы также можете создать правильную. NET DLL и использовать для загрузки ее Add-Type. Это гораздо безопаснее, хотя и менее удобно, чем компиляция C# при каждом выполнении:

# Assume we have Library.dll already built
# and it consists of the same code as the `$source` in the block above
Add-Type -Path C:\path\to\Library.dll
[HelloWorld.Hello]::Main()
0 голосов
/ 09 января 2020

Основываясь на новых знаниях, я сам пишу ответ на свой вопрос.

$Shadow = @'

using System;
using System.Windows;
using System.Windows.Forms;

namespace Program
{
    public partial class Shadow: Form
    {
        protected override CreateParams CreateParams
        {
            get
            {
                var сp = base.CreateParams;
                сp.ClassStyle |= 0x00020000;
                return сp;
            }
        }    
    }
}
'@

Add-Type -TypeDefinition $Shadow -Language CSharp -ReferencedAssemblies System, System.Windows, System.Windows.Forms

# Next, instead of your object $Form = New-Object System.Windows.Forms.Form, you need to write this:
$Form = New-Object Program.Shadow

Я так и не нашел решения по чистой PowerShell.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...