mirror of
https://github.com/netchx/netch.git
synced 2026-04-03 19:35:10 +08:00
Migrate to CsWin32
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Windows.Forms;
|
||||
using Vanara.PInvoke;
|
||||
using static Vanara.PInvoke.User32;
|
||||
using Windows.Win32.Foundation;
|
||||
using Windows.Win32.UI.WindowsAndMessaging;
|
||||
using static Windows.Win32.PInvoke;
|
||||
|
||||
namespace Netch.Forms
|
||||
{
|
||||
@@ -34,21 +35,21 @@ namespace Netch.Forms
|
||||
|
||||
private void Parent_Activated(object? sender, EventArgs? e)
|
||||
{
|
||||
SetWindowPos(Handle,
|
||||
HWND.HWND_TOPMOST,
|
||||
SetWindowPos(new HWND(Handle),
|
||||
new HWND(-1),
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
SetWindowPosFlags.SWP_NOACTIVATE | SetWindowPosFlags.SWP_NOMOVE | SetWindowPosFlags.SWP_NOSIZE | SetWindowPosFlags.SWP_SHOWWINDOW);
|
||||
SET_WINDOW_POS_FLAGS.SWP_NOACTIVATE | SET_WINDOW_POS_FLAGS.SWP_NOMOVE | SET_WINDOW_POS_FLAGS.SWP_NOSIZE | SET_WINDOW_POS_FLAGS.SWP_SHOWWINDOW);
|
||||
|
||||
SetWindowPos(Handle,
|
||||
HWND.HWND_NOTOPMOST,
|
||||
SetWindowPos(new HWND(Handle),
|
||||
new HWND(-2),
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
SetWindowPosFlags.SWP_NOACTIVATE | SetWindowPosFlags.SWP_NOMOVE | SetWindowPosFlags.SWP_NOSIZE | SetWindowPosFlags.SWP_SHOWWINDOW);
|
||||
SET_WINDOW_POS_FLAGS.SWP_NOACTIVATE | SET_WINDOW_POS_FLAGS.SWP_NOMOVE | SET_WINDOW_POS_FLAGS.SWP_NOSIZE | SET_WINDOW_POS_FLAGS.SWP_SHOWWINDOW);
|
||||
}
|
||||
|
||||
private void richTextBox1_TextChanged(object? sender, EventArgs? e)
|
||||
|
||||
@@ -9,6 +9,9 @@ using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using Windows.Win32;
|
||||
using Windows.Win32.Foundation;
|
||||
using Windows.Win32.UI.WindowsAndMessaging;
|
||||
using Microsoft.Win32;
|
||||
using Netch.Controllers;
|
||||
using Netch.Enums;
|
||||
@@ -19,7 +22,6 @@ using Netch.Properties;
|
||||
using Netch.Services;
|
||||
using Netch.Utils;
|
||||
using Serilog;
|
||||
using Vanara.PInvoke;
|
||||
|
||||
namespace Netch.Forms
|
||||
{
|
||||
@@ -391,9 +393,10 @@ namespace Netch.Forms
|
||||
|
||||
private void ShowHideConsoleToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
var windowStyles = (User32.WindowStyles)User32.GetWindowLong(Netch.ConsoleHwnd, User32.WindowLongFlags.GWL_STYLE);
|
||||
var visible = windowStyles.HasFlag(User32.WindowStyles.WS_VISIBLE);
|
||||
User32.ShowWindow(Netch.ConsoleHwnd, visible ? ShowWindowCommand.SW_HIDE : ShowWindowCommand.SW_SHOWNOACTIVATE);
|
||||
|
||||
var windowStyles = (WINDOW_STYLE)PInvoke.GetWindowLong(new HWND(Netch.ConsoleHwnd), WINDOW_LONG_PTR_INDEX.GWL_STYLE);
|
||||
var visible = windowStyles.HasFlag(WINDOW_STYLE.WS_VISIBLE);
|
||||
PInvoke.ShowWindow(Netch.ConsoleHwnd, visible ? SHOW_WINDOW_CMD.SW_HIDE : SHOW_WINDOW_CMD.SW_SHOWNOACTIVATE);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using System;
|
||||
using System.Net;
|
||||
using Vanara.PInvoke;
|
||||
using Windows.Win32;
|
||||
|
||||
namespace Netch.Models
|
||||
{
|
||||
@@ -18,10 +18,10 @@ namespace Netch.Models
|
||||
|
||||
public static NetRoute GetBestRouteTemplate()
|
||||
{
|
||||
if (IpHlpApi.GetBestRoute(BitConverter.ToUInt32(IPAddress.Parse("114.114.114.114").GetAddressBytes(), 0), 0, out var route) != 0)
|
||||
if (PInvoke.GetBestRoute(BitConverter.ToUInt32(IPAddress.Parse("114.114.114.114").GetAddressBytes(), 0), 0, out var route) != 0)
|
||||
throw new MessageException("GetBestRoute 搜索失败");
|
||||
|
||||
var gateway = new IPAddress(route.dwForwardNextHop.S_un_b);
|
||||
var gateway = new IPAddress(route.dwForwardNextHop);
|
||||
return TemplateBuilder(gateway.ToString(), (int)route.dwForwardIfIndex);
|
||||
}
|
||||
|
||||
|
||||
21
Netch/NativeMethods.txt
Normal file
21
Netch/NativeMethods.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
// IpHlpApi.dll
|
||||
GetBestRoute
|
||||
GetExtendedTcpTable
|
||||
MIB_TCPTABLE_OWNER_PID
|
||||
ADDRESS_FAMILY
|
||||
|
||||
// User32.dll
|
||||
SetWindowPos
|
||||
GetWindowLong
|
||||
ShowWindow
|
||||
WINDOW_STYLE
|
||||
|
||||
// Kernel32.dll
|
||||
AllocConsole
|
||||
GetConsoleWindow
|
||||
|
||||
// Ws2_32.dll
|
||||
ntohs
|
||||
|
||||
// Windows.h
|
||||
// WIN32_ERROR
|
||||
@@ -5,13 +5,15 @@ using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using Windows.Win32;
|
||||
using Windows.Win32.Foundation;
|
||||
using Windows.Win32.UI.WindowsAndMessaging;
|
||||
using Netch.Controllers;
|
||||
using Netch.Forms;
|
||||
using Netch.Services;
|
||||
using Netch.Utils;
|
||||
using Serilog;
|
||||
using Serilog.Events;
|
||||
using Vanara.PInvoke;
|
||||
|
||||
namespace Netch
|
||||
{
|
||||
@@ -19,7 +21,7 @@ namespace Netch
|
||||
{
|
||||
public static readonly SingleInstance.SingleInstanceService SingleInstance = new($"Global\\{nameof(Netch)}");
|
||||
|
||||
public static HWND ConsoleHwnd { get; private set; }
|
||||
internal static HWND ConsoleHwnd { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 应用程序的主入口点
|
||||
@@ -103,11 +105,11 @@ namespace Netch
|
||||
|
||||
private static void InitConsole()
|
||||
{
|
||||
Kernel32.AllocConsole();
|
||||
PInvoke.AllocConsole();
|
||||
|
||||
ConsoleHwnd = Kernel32.GetConsoleWindow();
|
||||
ConsoleHwnd = PInvoke.GetConsoleWindow();
|
||||
#if RELEASE
|
||||
User32.ShowWindow(ConsoleHwnd, ShowWindowCommand.SW_HIDE);
|
||||
PInvoke.ShowWindow(ConsoleHwnd, SHOW_WINDOW_CMD.SW_HIDE);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -39,6 +39,10 @@
|
||||
<PackageReference Include="HMBSbige.SingleInstance" Version="5.0.7" />
|
||||
<PackageReference Include="MaxMind.GeoIP2" Version="4.0.1" />
|
||||
<PackageReference Include="Microsoft.Diagnostics.Tracing.TraceEvent" Version="2.0.70" GeneratePathProperty="true" />
|
||||
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.1.506-beta">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Nullable.Extended.Analyzer" Version="1.2.4089">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
@@ -52,9 +56,7 @@
|
||||
<PackageReference Include="System.Management" Version="5.0.0" />
|
||||
<PackageReference Include="System.Reactive" Version="5.0.0" />
|
||||
<PackageReference Include="TaskScheduler" Version="2.9.1" />
|
||||
<PackageReference Include="Vanara.PInvoke.IpHlpApi" Version="3.3.10" />
|
||||
<PackageReference Include="Microsoft-WindowsAPICodePack-Shell" Version="1.1.4" />
|
||||
<PackageReference Include="Vanara.PInvoke.User32" Version="3.3.10" />
|
||||
<PackageReference Include="WindowsFirewallHelper" Version="2.0.4.70-beta2" />
|
||||
<PackageReference Include="System.ServiceProcess.ServiceController" Version="5.0.0" />
|
||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="5.0.0" />
|
||||
|
||||
@@ -5,9 +5,8 @@ using System.Management;
|
||||
using System.Net;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Net.Sockets;
|
||||
using System.Threading.Tasks;
|
||||
using Netch.Models;
|
||||
using Vanara.PInvoke;
|
||||
using Windows.Win32;
|
||||
|
||||
namespace Netch.Utils
|
||||
{
|
||||
@@ -22,7 +21,7 @@ namespace Netch.Utils
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(addressFamily), addressFamily, null)
|
||||
};
|
||||
|
||||
if (IpHlpApi.GetBestRoute(BitConverter.ToUInt32(IPAddress.Parse(ipAddress).GetAddressBytes(), 0), 0, out var route) != 0)
|
||||
if (PInvoke.GetBestRoute(BitConverter.ToUInt32(IPAddress.Parse(ipAddress).GetAddressBytes(), 0), 0, out var route) != 0)
|
||||
throw new MessageException("GetBestRoute 搜索失败");
|
||||
|
||||
return Get((int)route.dwForwardIfIndex);
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Runtime.InteropServices;
|
||||
using Windows.Win32;
|
||||
using Windows.Win32.NetworkManagement.IpHelper;
|
||||
using Netch.Models;
|
||||
using Serilog;
|
||||
using static Vanara.PInvoke.IpHlpApi;
|
||||
using static Vanara.PInvoke.Ws2_32;
|
||||
|
||||
namespace Netch.Utils
|
||||
{
|
||||
@@ -29,14 +31,38 @@ namespace Netch.Utils
|
||||
}
|
||||
}
|
||||
|
||||
public static IEnumerable<Process> GetProcessByUsedTcpPort(ushort port)
|
||||
internal static IEnumerable<Process> GetProcessByUsedTcpPort(ushort port, ADDRESS_FAMILY inet = ADDRESS_FAMILY.AF_INET)
|
||||
{
|
||||
if (port == 0)
|
||||
throw new ArgumentOutOfRangeException();
|
||||
|
||||
var row = GetTcpTable2().Where(r => ntohs((ushort)r.dwLocalPort) == port).Where(r => r.dwOwningPid is not (0 or 4));
|
||||
if (inet is ADDRESS_FAMILY.AF_UNSPEC)
|
||||
throw new ArgumentOutOfRangeException(nameof(inet));
|
||||
|
||||
return row.Select(r => Process.GetProcessById((int)r.dwOwningPid));
|
||||
var process = new List<Process>();
|
||||
unsafe
|
||||
{
|
||||
uint err;
|
||||
uint size = 0;
|
||||
PInvoke.GetExtendedTcpTable(default, ref size, false, (uint)inet, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_LISTENER, 0); // get size
|
||||
var tcpTable = (MIB_TCPTABLE_OWNER_PID*)Marshal.AllocHGlobal((int)size);
|
||||
|
||||
if ((err = PInvoke.GetExtendedTcpTable(tcpTable, ref size, false, (uint)inet, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_LISTENER, 0)) != 0)
|
||||
throw new Win32Exception((int)err);
|
||||
|
||||
for (var i = 0; i < tcpTable->dwNumEntries; i++)
|
||||
{
|
||||
var row = tcpTable->table.ReadOnlyItemRef(i);
|
||||
|
||||
if (row.dwOwningPid is 0 or 4)
|
||||
continue;
|
||||
|
||||
if (PInvoke.ntohs((ushort)row.dwLocalPort) == port)
|
||||
process.Add(Process.GetProcessById((int)row.dwOwningPid));
|
||||
}
|
||||
}
|
||||
|
||||
return process;
|
||||
}
|
||||
|
||||
private static void GetReservedPortRange(PortType portType, ref List<NumberRange> targetList)
|
||||
|
||||
Reference in New Issue
Block a user