mirror of
https://github.com/ckaczor/Common.Native.git
synced 2026-01-13 17:22:40 -05:00
Initial commit
This commit is contained in:
63
.gitattributes
vendored
Normal file
63
.gitattributes
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
###############################################################################
|
||||
# Set default behavior to automatically normalize line endings.
|
||||
###############################################################################
|
||||
* text=auto
|
||||
|
||||
###############################################################################
|
||||
# Set default behavior for command prompt diff.
|
||||
#
|
||||
# This is need for earlier builds of msysgit that does not have it on by
|
||||
# default for csharp files.
|
||||
# Note: This is only used by command line
|
||||
###############################################################################
|
||||
#*.cs diff=csharp
|
||||
|
||||
###############################################################################
|
||||
# Set the merge driver for project and solution files
|
||||
#
|
||||
# Merging from the command prompt will add diff markers to the files if there
|
||||
# are conflicts (Merging from VS is not affected by the settings below, in VS
|
||||
# the diff markers are never inserted). Diff markers may cause the following
|
||||
# file extensions to fail to load in VS. An alternative would be to treat
|
||||
# these files as binary and thus will always conflict and require user
|
||||
# intervention with every merge. To do so, just uncomment the entries below
|
||||
###############################################################################
|
||||
#*.sln merge=binary
|
||||
#*.csproj merge=binary
|
||||
#*.vbproj merge=binary
|
||||
#*.vcxproj merge=binary
|
||||
#*.vcproj merge=binary
|
||||
#*.dbproj merge=binary
|
||||
#*.fsproj merge=binary
|
||||
#*.lsproj merge=binary
|
||||
#*.wixproj merge=binary
|
||||
#*.modelproj merge=binary
|
||||
#*.sqlproj merge=binary
|
||||
#*.wwaproj merge=binary
|
||||
|
||||
###############################################################################
|
||||
# behavior for image files
|
||||
#
|
||||
# image files are treated as binary by default.
|
||||
###############################################################################
|
||||
#*.jpg binary
|
||||
#*.png binary
|
||||
#*.gif binary
|
||||
|
||||
###############################################################################
|
||||
# diff behavior for common document formats
|
||||
#
|
||||
# Convert binary document formats to text before diffing them. This feature
|
||||
# is only available from the command line. Turn it on by uncommenting the
|
||||
# entries below.
|
||||
###############################################################################
|
||||
#*.doc diff=astextplain
|
||||
#*.DOC diff=astextplain
|
||||
#*.docx diff=astextplain
|
||||
#*.DOCX diff=astextplain
|
||||
#*.dot diff=astextplain
|
||||
#*.DOT diff=astextplain
|
||||
#*.pdf diff=astextplain
|
||||
#*.PDF diff=astextplain
|
||||
#*.rtf diff=astextplain
|
||||
#*.RTF diff=astextplain
|
||||
156
.gitignore
vendored
Normal file
156
.gitignore
vendored
Normal file
@@ -0,0 +1,156 @@
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
*.user
|
||||
*.sln.docstates
|
||||
|
||||
# Build results
|
||||
|
||||
[Dd]ebug/
|
||||
[Rr]elease/
|
||||
x64/
|
||||
build/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
|
||||
# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets
|
||||
!packages/*/build/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
*_i.c
|
||||
*_p.c
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.log
|
||||
*.scc
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# NCrunch
|
||||
*.ncrunch*
|
||||
.*crunch*.local.xml
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.Publish.xml
|
||||
|
||||
# NuGet Packages Directory
|
||||
## TODO: If you have NuGet Package Restore enabled, uncomment the next line
|
||||
#packages/
|
||||
|
||||
# Windows Azure Build Output
|
||||
csx
|
||||
*.build.csdef
|
||||
|
||||
# Windows Store app package directory
|
||||
AppPackages/
|
||||
|
||||
# Others
|
||||
sql/
|
||||
*.Cache
|
||||
ClientBin/
|
||||
[Ss]tyle[Cc]op.*
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.[Pp]ublish.xml
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file to a newer
|
||||
# Visual Studio version. Backup files are not needed, because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
|
||||
# SQL Server files
|
||||
App_Data/*.mdf
|
||||
App_Data/*.ldf
|
||||
|
||||
|
||||
#LightSwitch generated files
|
||||
GeneratedArtifacts/
|
||||
_Pvt_Extensions/
|
||||
ModelManifest.xml
|
||||
|
||||
# =========================
|
||||
# Windows detritus
|
||||
# =========================
|
||||
|
||||
# Windows image file caches
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
|
||||
# Folder config file
|
||||
Desktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Mac desktop service store files
|
||||
.DS_Store
|
||||
163
Common.Native.csproj
Normal file
163
Common.Native.csproj
Normal file
@@ -0,0 +1,163 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{ED1C07A1-54F5-4796-8B06-2A0BB1960D84}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Common.Native</RootNamespace>
|
||||
<AssemblyName>Common.Native</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<FileUpgradeFlags>
|
||||
</FileUpgradeFlags>
|
||||
<OldToolsVersion>3.5</OldToolsVersion>
|
||||
<UpgradeBackupLocation />
|
||||
<PublishUrl>publish\</PublishUrl>
|
||||
<Install>true</Install>
|
||||
<InstallFrom>Disk</InstallFrom>
|
||||
<UpdateEnabled>false</UpdateEnabled>
|
||||
<UpdateMode>Foreground</UpdateMode>
|
||||
<UpdateInterval>7</UpdateInterval>
|
||||
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||
<UpdatePeriodically>false</UpdatePeriodically>
|
||||
<UpdateRequired>false</UpdateRequired>
|
||||
<MapFileExtensions>true</MapFileExtensions>
|
||||
<ApplicationRevision>0</ApplicationRevision>
|
||||
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
|
||||
<SccProjectName>SAK</SccProjectName>
|
||||
<SccLocalPath>SAK</SccLocalPath>
|
||||
<SccAuxPath>SAK</SccAuxPath>
|
||||
<SccProvider>SAK</SccProvider>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<SignAssembly>true</SignAssembly>
|
||||
<AssemblyOriginatorKeyFile>..\ChrisKaczor.pfx</AssemblyOriginatorKeyFile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>bin\x86\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<CodeAnalysisLogFile>bin\Debug\Common.Native.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
|
||||
<CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
|
||||
<CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
|
||||
<CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
|
||||
<CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
|
||||
<CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||
<OutputPath>bin\x86\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<CodeAnalysisLogFile>bin\Release\Common.Native.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
|
||||
<CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
|
||||
<CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
|
||||
<CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>bin\x64\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<CodeAnalysisLogFile>bin\Debug\Common.Native.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
|
||||
<CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
|
||||
<CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
|
||||
<CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||
<OutputPath>bin\x64\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<CodeAnalysisLogFile>bin\Release\Common.Native.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
|
||||
<CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
|
||||
<CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
|
||||
<CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
|
||||
<CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
|
||||
<CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Drawing" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Constants.cs" />
|
||||
<Compile Include="Functions.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Structures.cs" />
|
||||
<Compile Include="WinEvent.cs" />
|
||||
<Compile Include="WinHook.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>Windows Installer 3.1</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
34
Common.Native.sln
Normal file
34
Common.Native.sln
Normal file
@@ -0,0 +1,34 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 2013
|
||||
VisualStudioVersion = 12.0.30110.0
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Native", "Common.Native.csproj", "{ED1C07A1-54F5-4796-8B06-2A0BB1960D84}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Debug|x64.Build.0 = Debug|x64
|
||||
{ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Debug|x86.Build.0 = Debug|x86
|
||||
{ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Release|x64.ActiveCfg = Release|x64
|
||||
{ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Release|x64.Build.0 = Release|x64
|
||||
{ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Release|x86.ActiveCfg = Release|x86
|
||||
{ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Release|x86.Build.0 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
227
Constants.cs
Normal file
227
Constants.cs
Normal file
@@ -0,0 +1,227 @@
|
||||
using System;
|
||||
|
||||
namespace Common.Native
|
||||
{
|
||||
public static class Constants
|
||||
{
|
||||
/// <summary>
|
||||
/// SetWindowPos flags
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum WindowPositionFlags
|
||||
{
|
||||
AsyncWindowPosition = 0x4000,
|
||||
DeferErase = 0x2000,
|
||||
DrawFrame = 0x0020,
|
||||
FrameChanged = 0x0020,
|
||||
HideWindow = 0x0080,
|
||||
NoActivate = 0x0010,
|
||||
NoCopyBits = 0x0100,
|
||||
NoMove = 0x0002,
|
||||
NoOwnerZorder = 0x0200,
|
||||
NoRedraw = 0x0008,
|
||||
NoReposition = 0x0200,
|
||||
NoSendChanging = 0x0400,
|
||||
NoSize = 0x0001,
|
||||
NoZorder = 0x0004,
|
||||
ShowWindow = 0x0040,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// WM_SYSCOMMAND resize direction
|
||||
/// </summary>
|
||||
public enum ResizeDirection
|
||||
{
|
||||
Left = 61441,
|
||||
Right = 61442,
|
||||
Top = 61443,
|
||||
TopLeft = 61444,
|
||||
TopRight = 61445,
|
||||
Bottom = 61446,
|
||||
BottomLeft = 61447,
|
||||
BottomRight = 61448,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Window messages
|
||||
/// </summary>
|
||||
public enum WindowMessage
|
||||
{
|
||||
Create = 0x0001,
|
||||
Destroy = 0x0002,
|
||||
Move = 0x0003,
|
||||
Moving = 0x0216,
|
||||
Size = 0x0005,
|
||||
Activate = 0x0006,
|
||||
SetFocus = 0x0007,
|
||||
KillFocus = 0x0008,
|
||||
Enable = 0x000a,
|
||||
SetRedraw = 0x000b,
|
||||
SetText = 0x000c,
|
||||
GetText = 0x000d,
|
||||
GetTextLength = 0x000e,
|
||||
Paint = 0x000f,
|
||||
Close = 0x0010,
|
||||
QueryEndSession = 0x0011,
|
||||
Quit = 0x0012,
|
||||
QueryOpen = 0x0013,
|
||||
EraseBackground = 0x0014,
|
||||
SystemColorChange = 0x0015,
|
||||
|
||||
WindowPositionChanging = 0x0046,
|
||||
WindowPositionChanged = 0x0047,
|
||||
|
||||
QueryDragIcon = 0x0037,
|
||||
GetIcon = 0x007F,
|
||||
SetIcon = 0x0080,
|
||||
CreateNonClientArea = 0x0081,
|
||||
DestroyNonClientArea = 0x0082,
|
||||
CalculateNonClientSize = 0x0083,
|
||||
HitTestNonClientArea = 0x0084,
|
||||
PaintNonClientArea = 0x0085,
|
||||
ActivateNonClientArea = 0x0086,
|
||||
GetDialogCode = 0x0087,
|
||||
SyncPaint = 0x0088,
|
||||
NonClientMouseMove = 0x00a0,
|
||||
NonClientLeftButtonDown = 0x00a1,
|
||||
NonClientLeftButtonUp = 0x00a2,
|
||||
NonClientLeftButtonDoubleClick = 0x00a3,
|
||||
NonClientRightButtonDown = 0x00a4,
|
||||
NonClientRightButtonUp = 0x00a5,
|
||||
NonClientRightButtonDoubleClick = 0x00a6,
|
||||
NonClientMiddleButtonDown = 0x00a7,
|
||||
NonClientMiddleButtonUp = 0x00a8,
|
||||
NonClientMiddleButtonDoubleClick = 0x00a9,
|
||||
|
||||
SysKeyDown = 0x0104,
|
||||
SysKeyUp = 0x0105,
|
||||
SysChar = 0x0106,
|
||||
SysDeadChar = 0x0107,
|
||||
SysCommand = 0x0112,
|
||||
|
||||
Hotkey = 0x312,
|
||||
|
||||
DwmCompositionChanged = 0x031e,
|
||||
User = 0x0400,
|
||||
App = 0x8000,
|
||||
}
|
||||
|
||||
public enum HitTestValues
|
||||
{
|
||||
Error = -2,
|
||||
Transparent = -1,
|
||||
Nowhere = 0,
|
||||
Client = 1,
|
||||
Caption = 2,
|
||||
SystemMenu = 3,
|
||||
GrowBox = 4,
|
||||
Menu = 5,
|
||||
HorizontalScroll = 6,
|
||||
VerticalScroll = 7,
|
||||
MinimizeButton = 8,
|
||||
MaximizeButton = 9,
|
||||
Left = 10,
|
||||
Right = 11,
|
||||
Top = 12,
|
||||
TopLeft = 13,
|
||||
TopRight = 14,
|
||||
Bottom = 15,
|
||||
BottomLeft = 16,
|
||||
BottomRight = 17,
|
||||
Border = 18,
|
||||
Object = 19,
|
||||
Close = 20,
|
||||
Help = 21
|
||||
}
|
||||
|
||||
[Flags]
|
||||
public enum ExtendedWindowStyles
|
||||
{
|
||||
ToolWindow = 0x00000080,
|
||||
}
|
||||
|
||||
public enum GetWindowLongFields
|
||||
{
|
||||
ExStyle = -20,
|
||||
}
|
||||
|
||||
[Flags]
|
||||
public enum ProcessAccess : uint
|
||||
{
|
||||
Terminate = 0x00000001,
|
||||
CreateThread = 0x00000002,
|
||||
SetSessionId = 0x00000004,
|
||||
VmOperation = 0x00000008,
|
||||
VmRead = 0x00000010,
|
||||
VmWrite = 0x00000020,
|
||||
DuplicateHandle = 0x00000040,
|
||||
CreateProcess = 0x00000080,
|
||||
SetQuota = 0x00000100,
|
||||
SetInformation = 0x00000200,
|
||||
QueryInformation = 0x00000400,
|
||||
StandardRightsRequired = 0x000F0000,
|
||||
Synchronize = 0x00100000,
|
||||
|
||||
AllAccess =
|
||||
Terminate | CreateThread | SetSessionId | VmOperation | VmRead | VmWrite | DuplicateHandle |
|
||||
CreateProcess | SetQuota | SetInformation | QueryInformation | StandardRightsRequired | Synchronize
|
||||
}
|
||||
|
||||
[Flags]
|
||||
public enum SnapshotFlags : uint
|
||||
{
|
||||
HeapList = 0x00000001,
|
||||
Process = 0x00000002,
|
||||
Thread = 0x00000004,
|
||||
Module = 0x00000008,
|
||||
Module32 = 0x00000010,
|
||||
All = (HeapList | Process | Thread | Module),
|
||||
Inherit = 0x80000000,
|
||||
}
|
||||
|
||||
public enum ShowWindowCommand : uint
|
||||
{
|
||||
Hide = 0,
|
||||
ShowNormal = 1,
|
||||
Normal = 1,
|
||||
ShowMinimized = 2,
|
||||
ShowMaximized = 3,
|
||||
Maximize = 3,
|
||||
ShowNoActivate = 4,
|
||||
Show = 5,
|
||||
Minimize = 6,
|
||||
ShowMinNoActive = 7,
|
||||
ShowNa = 8,
|
||||
Restore = 9
|
||||
}
|
||||
|
||||
[Flags]
|
||||
public enum SendMessageTimeoutFlags : uint
|
||||
{
|
||||
Normal = 0x0,
|
||||
Block = 0x1,
|
||||
AbortIfHung = 0x2,
|
||||
NoTimeoutIfNotHung = 0x8
|
||||
}
|
||||
|
||||
public const int ICON_BIG = 1;
|
||||
public const int ICON_SMALL = 0;
|
||||
|
||||
public enum ClassLongFlags : int
|
||||
{
|
||||
GCLP_MENUNAME = -8,
|
||||
GCLP_HBRBACKGROUND = -10,
|
||||
GCLP_HCURSOR = -12,
|
||||
GCLP_HICON = -14,
|
||||
GCLP_HMODULE = -16,
|
||||
GCL_CBWNDEXTRA = -18,
|
||||
GCL_CBCLSEXTRA = -20,
|
||||
GCLP_WNDPROC = -24,
|
||||
GCL_STYLE = -26,
|
||||
GCLP_HICONSM = -34,
|
||||
GCW_ATOM = -32
|
||||
}
|
||||
|
||||
public static readonly IntPtr InvalidHandle = new IntPtr(-1);
|
||||
}
|
||||
}
|
||||
208
Functions.cs
Normal file
208
Functions.cs
Normal file
@@ -0,0 +1,208 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
|
||||
namespace Common.Native
|
||||
{
|
||||
public static class TypeExtensions
|
||||
{
|
||||
public static int HighWord(this int value)
|
||||
{
|
||||
return ((short) (((value) >> 16) & 0xFFFF));
|
||||
}
|
||||
|
||||
public static int LowWord(this int value)
|
||||
{
|
||||
return ((short) value);
|
||||
}
|
||||
|
||||
public static int HighWord(this IntPtr value)
|
||||
{
|
||||
return ((int) value).HighWord();
|
||||
}
|
||||
|
||||
public static int LowWord(this IntPtr value)
|
||||
{
|
||||
return ((int) value).LowWord();
|
||||
}
|
||||
}
|
||||
|
||||
public static class Functions
|
||||
{
|
||||
public static class Window
|
||||
{
|
||||
public static bool IsChild(IntPtr childHandle, IntPtr parentHandle)
|
||||
{
|
||||
if (childHandle == parentHandle)
|
||||
return true;
|
||||
|
||||
if (childHandle == IntPtr.Zero)
|
||||
return false;
|
||||
|
||||
return IsChild(User32.GetParent(childHandle), parentHandle);
|
||||
}
|
||||
|
||||
public static string GetText(IntPtr hWnd)
|
||||
{
|
||||
// Allocate correct string length first
|
||||
int length = User32.GetWindowTextLength(hWnd);
|
||||
var sb = new StringBuilder(length + 1);
|
||||
User32.GetWindowText(hWnd, sb, sb.Capacity);
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
public static string GetClass(IntPtr hWnd)
|
||||
{
|
||||
// Allocate correct string length first
|
||||
const int length = 255;
|
||||
var sb = new StringBuilder(length + 1);
|
||||
User32.RealGetWindowClass(hWnd, sb, sb.Capacity);
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
public static void Show(IntPtr hWnd, Constants.ShowWindowCommand command)
|
||||
{
|
||||
var windowPlacement = new Structures.WindowPlacement();
|
||||
User32.GetWindowPlacement(hWnd, ref windowPlacement);
|
||||
windowPlacement.ShowCommand = command;
|
||||
User32.SetWindowPlacement(hWnd, ref windowPlacement);
|
||||
}
|
||||
|
||||
public static Icon GetSmallIcon(IntPtr hWnd)
|
||||
{
|
||||
try
|
||||
{
|
||||
IntPtr hIcon;
|
||||
|
||||
User32.SendMessageTimeout(hWnd,
|
||||
(uint) Constants.WindowMessage.GetIcon,
|
||||
(IntPtr) Constants.ICON_SMALL,
|
||||
IntPtr.Zero,
|
||||
Constants.SendMessageTimeoutFlags.AbortIfHung,
|
||||
1000,
|
||||
out hIcon);
|
||||
|
||||
if (hIcon == IntPtr.Zero)
|
||||
{
|
||||
hIcon = User32.GetClassLongPtr(hWnd, Constants.ClassLongFlags.GCLP_HICONSM);
|
||||
}
|
||||
|
||||
if (hIcon == IntPtr.Zero)
|
||||
{
|
||||
User32.SendMessageTimeout(
|
||||
hWnd,
|
||||
(uint) Constants.WindowMessage.QueryDragIcon,
|
||||
IntPtr.Zero,
|
||||
IntPtr.Zero,
|
||||
Constants.SendMessageTimeoutFlags.AbortIfHung,
|
||||
1000,
|
||||
out hIcon);
|
||||
}
|
||||
|
||||
return hIcon == IntPtr.Zero ? null : Icon.FromHandle(hIcon);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class User32
|
||||
{
|
||||
public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
public static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
public static extern bool GetWindowPlacement(IntPtr hWnd, ref Structures.WindowPlacement lpwndpl);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true)]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
public static extern bool SetWindowPlacement(IntPtr hWnd, [In] ref Structures.WindowPlacement lpwndpl);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern uint RealGetWindowClass(IntPtr hwnd, [Out] StringBuilder pszType, int cchType);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
|
||||
public static extern int GetWindowTextLength(IntPtr hWnd);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto)]
|
||||
public static extern IntPtr SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
|
||||
public static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam, Constants.SendMessageTimeoutFlags flags, uint timeout, out IntPtr result);
|
||||
|
||||
[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
|
||||
public static extern IntPtr GetParent(IntPtr hWnd);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern bool SetForegroundWindow(IntPtr hWnd);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
|
||||
|
||||
public static IntPtr SetWindowLongPtrSmart(IntPtr hWnd, int nIndex, IntPtr dwNewLong)
|
||||
{
|
||||
if (IntPtr.Size == 8)
|
||||
return SetWindowLongPtr(hWnd, nIndex, dwNewLong);
|
||||
|
||||
return new IntPtr(SetWindowLong(hWnd, nIndex, dwNewLong.ToInt32()));
|
||||
}
|
||||
|
||||
[DllImport("user32.dll", EntryPoint = "GetClassLong")]
|
||||
public static extern uint GetClassLongPtr32(IntPtr hWnd, Constants.ClassLongFlags nIndex);
|
||||
|
||||
[DllImport("user32.dll", EntryPoint = "GetClassLongPtr")]
|
||||
public static extern IntPtr GetClassLongPtr64(IntPtr hWnd, Constants.ClassLongFlags nIndex);
|
||||
|
||||
public static IntPtr GetClassLongPtr(IntPtr hWnd, Constants.ClassLongFlags nIndex)
|
||||
{
|
||||
if (IntPtr.Size > 4)
|
||||
return GetClassLongPtr64(hWnd, nIndex);
|
||||
|
||||
return new IntPtr(GetClassLongPtr32(hWnd, nIndex));
|
||||
}
|
||||
}
|
||||
|
||||
public static class Kernel32
|
||||
{
|
||||
[DllImport("kernel32.dll", EntryPoint = "SetLastError")]
|
||||
public static extern void SetLastError(int dwErrorCode);
|
||||
|
||||
[DllImport("kernel32.dll", SetLastError = true)]
|
||||
public static extern IntPtr CreateToolhelp32Snapshot(Constants.SnapshotFlags flags, uint processId);
|
||||
|
||||
[DllImport("kernel32.dll")]
|
||||
public static extern bool Process32First(IntPtr handle, ref Structures.ProcessEntry32 processInfo);
|
||||
|
||||
[DllImport("kernel32.dll")]
|
||||
public static extern bool Process32Next(IntPtr handle, ref Structures.ProcessEntry32 processInfo);
|
||||
|
||||
[DllImport("kernel32.dll")]
|
||||
public static extern bool CloseHandle(IntPtr handle);
|
||||
|
||||
[DllImport("kernel32.dll")]
|
||||
public static extern IntPtr OpenProcess(Constants.ProcessAccess desiredAccess, bool inheritHandle, uint processId);
|
||||
|
||||
[DllImport("kernel32.dll")]
|
||||
public static extern bool GetProcessTimes(IntPtr processHandle, out long creationTime, out long exitTime, out long kernelTime, out long userTime);
|
||||
|
||||
[DllImport("kernel32.dll")]
|
||||
public static extern uint GetCurrentThreadId();
|
||||
}
|
||||
}
|
||||
}
|
||||
36
Properties/AssemblyInfo.cs
Normal file
36
Properties/AssemblyInfo.cs
Normal file
@@ -0,0 +1,36 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// 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.
|
||||
[assembly: AssemblyTitle("Common.Native")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("Microsoft")]
|
||||
[assembly: AssemblyProduct("Common.Native")]
|
||||
[assembly: AssemblyCopyright("Copyright © Microsoft 2009")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("efb734ae-c52e-4719-a333-c8abde2c2823")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
198
Structures.cs
Normal file
198
Structures.cs
Normal file
@@ -0,0 +1,198 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Common.Native
|
||||
{
|
||||
public static class Structures
|
||||
{
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct Point
|
||||
{
|
||||
public int X;
|
||||
public int Y;
|
||||
|
||||
public Point(int x, int y)
|
||||
{
|
||||
X = x;
|
||||
Y = y;
|
||||
}
|
||||
|
||||
public Point(System.Drawing.Point pt) : this(pt.X, pt.Y) { }
|
||||
|
||||
public static implicit operator System.Drawing.Point(Point p)
|
||||
{
|
||||
return new System.Drawing.Point(p.X, p.Y);
|
||||
}
|
||||
|
||||
public static implicit operator Point(System.Drawing.Point p)
|
||||
{
|
||||
return new Point(p.X, p.Y);
|
||||
}
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct Rect
|
||||
{
|
||||
public int Left, Top, Right, Bottom;
|
||||
|
||||
public Rect(int left, int top, int right, int bottom)
|
||||
{
|
||||
Left = left;
|
||||
Top = top;
|
||||
Right = right;
|
||||
Bottom = bottom;
|
||||
}
|
||||
|
||||
public Rect(System.Drawing.Rectangle r) : this(r.Left, r.Top, r.Right, r.Bottom) { }
|
||||
|
||||
public int X
|
||||
{
|
||||
get { return Left; }
|
||||
set { Right -= (Left - value); Left = value; }
|
||||
}
|
||||
|
||||
public int Y
|
||||
{
|
||||
get { return Top; }
|
||||
set { Bottom -= (Top - value); Top = value; }
|
||||
}
|
||||
|
||||
public int Height
|
||||
{
|
||||
get { return Bottom - Top; }
|
||||
set { Bottom = value + Top; }
|
||||
}
|
||||
|
||||
public int Width
|
||||
{
|
||||
get { return Right - Left; }
|
||||
set { Right = value + Left; }
|
||||
}
|
||||
|
||||
public System.Drawing.Point Location
|
||||
{
|
||||
get { return new System.Drawing.Point(Left, Top); }
|
||||
set { X = value.X; Y = value.Y; }
|
||||
}
|
||||
|
||||
public System.Drawing.Size Size
|
||||
{
|
||||
get { return new System.Drawing.Size(Width, Height); }
|
||||
set { Width = value.Width; Height = value.Height; }
|
||||
}
|
||||
|
||||
public static implicit operator System.Drawing.Rectangle(Rect r)
|
||||
{
|
||||
return new System.Drawing.Rectangle(r.Left, r.Top, r.Width, r.Height);
|
||||
}
|
||||
|
||||
public static implicit operator Rect(System.Drawing.Rectangle r)
|
||||
{
|
||||
return new Rect(r);
|
||||
}
|
||||
|
||||
public static bool operator ==(Rect r1, Rect r2)
|
||||
{
|
||||
return r1.Equals(r2);
|
||||
}
|
||||
|
||||
public static bool operator !=(Rect r1, Rect r2)
|
||||
{
|
||||
return !r1.Equals(r2);
|
||||
}
|
||||
|
||||
public bool Equals(Rect r)
|
||||
{
|
||||
return r.Left == Left && r.Top == Top && r.Right == Right && r.Bottom == Bottom;
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
if (obj is Rect)
|
||||
return Equals((Rect) obj);
|
||||
|
||||
if (obj is System.Drawing.Rectangle)
|
||||
return Equals(new Rect((System.Drawing.Rectangle) obj));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return ((System.Drawing.Rectangle) this).GetHashCode();
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return string.Format(System.Globalization.CultureInfo.CurrentCulture, "{{Left={0},Top={1},Right={2},Bottom={3}}}", Left, Top, Right, Bottom);
|
||||
}
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct CWPRETSTRUCT
|
||||
{
|
||||
public IntPtr lResult;
|
||||
public IntPtr lParam;
|
||||
public IntPtr wParam;
|
||||
public uint message;
|
||||
public IntPtr hwnd;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct WindowPosition
|
||||
{
|
||||
public IntPtr Handle;
|
||||
public IntPtr HandleInsertAfter;
|
||||
public int Left;
|
||||
public int Top;
|
||||
public int Width;
|
||||
public int Height;
|
||||
public Constants.WindowPositionFlags Flags;
|
||||
|
||||
public int Right { get { return Left + Width; } }
|
||||
public int Bottom { get { return Top + Height; } }
|
||||
|
||||
public bool IsSameLocationAndSize(WindowPosition compare)
|
||||
{
|
||||
return (compare.Left == Left && compare.Top == Top && compare.Width == Width && compare.Height == Height);
|
||||
}
|
||||
|
||||
public bool IsSameSize(WindowPosition compare)
|
||||
{
|
||||
return (compare.Width == Width && compare.Height == Height);
|
||||
}
|
||||
|
||||
public bool IsSameLocation(WindowPosition compare)
|
||||
{
|
||||
return (compare.Left == Left && compare.Top == Top);
|
||||
}
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct ProcessEntry32
|
||||
{
|
||||
public uint Size;
|
||||
public uint Usage;
|
||||
public uint ProcessId;
|
||||
public IntPtr DefaultHeapId;
|
||||
public uint ModuleId;
|
||||
public uint Threads;
|
||||
public uint ParentProcessId;
|
||||
public int PriorityClassBase;
|
||||
public uint Flags;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
|
||||
public string ExeFilename;
|
||||
}
|
||||
|
||||
public struct WindowPlacement
|
||||
{
|
||||
public int Length;
|
||||
public int Flags;
|
||||
public Constants.ShowWindowCommand ShowCommand;
|
||||
public Point MinPosition;
|
||||
public Point MaxPosition;
|
||||
public Rect NormalPosition;
|
||||
}
|
||||
}
|
||||
}
|
||||
436
WinEvent.cs
Normal file
436
WinEvent.cs
Normal file
@@ -0,0 +1,436 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Common.Native
|
||||
{
|
||||
public class WinEvent
|
||||
{
|
||||
public enum Event
|
||||
{
|
||||
Min = 0x00000001,
|
||||
Max = 0x7FFFFFFF,
|
||||
|
||||
/*
|
||||
* EVENT_SYSTEM_SOUND
|
||||
* Sent when a sound is played. Currently nothing is generating this, we
|
||||
* this event when a system sound (for menus, etc) is played. Apps
|
||||
* generate this, if accessible, when a private sound is played. For
|
||||
* example, if Mail plays a "New Mail" sound.
|
||||
*
|
||||
* System Sounds:
|
||||
* (Generated by PlaySoundEvent in USER itself)
|
||||
* hwnd is NULL
|
||||
* idObject is OBJID_SOUND
|
||||
* idChild is sound child ID if one
|
||||
* App Sounds:
|
||||
* (PlaySoundEvent won't generate notification; up to app)
|
||||
* hwnd + idObject gets interface pointer to Sound object
|
||||
* idChild identifies the sound in question
|
||||
* are going to be cleaning up the SOUNDSENTRY feature in the control panel
|
||||
* and will use this at that time. Applications implementing WinEvents
|
||||
* are perfectly welcome to use it. Clients of IAccessible* will simply
|
||||
* turn around and get back a non-visual object that describes the sound.
|
||||
*/
|
||||
SystemSound = 0x0001,
|
||||
|
||||
/*
|
||||
* EVENT_SYSTEM_ALERT
|
||||
* System Alerts:
|
||||
* (Generated by MessageBox() calls for example)
|
||||
* hwnd is hwndMessageBox
|
||||
* idObject is OBJID_ALERT
|
||||
* App Alerts:
|
||||
* (Generated whenever)
|
||||
* hwnd+idObject gets interface pointer to Alert
|
||||
*/
|
||||
SystemAlert = 0x0002,
|
||||
|
||||
/*
|
||||
* EVENT_SYSTEM_FOREGROUND
|
||||
* Sent when the foreground (active) window changes, even if it is changing
|
||||
* to another window in the same thread as the previous one.
|
||||
* hwnd is hwndNewForeground
|
||||
* idObject is OBJID_WINDOW
|
||||
* idChild is INDEXID_OBJECT
|
||||
*/
|
||||
SystemForeground = 0x0003,
|
||||
|
||||
/*
|
||||
* Menu
|
||||
* hwnd is window (top level window or popup menu window)
|
||||
* idObject is ID of control (OBJID_MENU, OBJID_SYSMENU, OBJID_SELF for popup)
|
||||
* idChild is CHILDID_SELF
|
||||
*
|
||||
* EVENT_SYSTEM_MENUSTART
|
||||
* EVENT_SYSTEM_MENUEND
|
||||
* For MENUSTART, hwnd+idObject+idChild refers to the control with the menu bar,
|
||||
* or the control bringing up the context menu.
|
||||
*
|
||||
* Sent when entering into and leaving from menu mode (system, app bar, and
|
||||
* track popups).
|
||||
*/
|
||||
SystemMenuStart = 0x0004,
|
||||
SystemMenuEnd = 0x0005,
|
||||
|
||||
/*
|
||||
* EVENT_SYSTEM_MENUPOPUPSTART
|
||||
* EVENT_SYSTEM_MENUPOPUPEND
|
||||
* Sent when a menu popup comes up and just before it is taken down. Note
|
||||
* that for a call to TrackPopupMenu(), a client will see EVENT_SYSTEM_MENUSTART
|
||||
* followed almost immediately by EVENT_SYSTEM_MENUPOPUPSTART for the popup
|
||||
* being shown.
|
||||
*
|
||||
* For MENUPOPUP, hwnd+idObject+idChild refers to the NEW popup coming up, not the
|
||||
* parent item which is hierarchical. You can get the parent menu/popup by
|
||||
* asking for the accParent object.
|
||||
*/
|
||||
SystemMenuPopupStart = 0x0006,
|
||||
SystemMenuPopupEnd = 0x0007,
|
||||
|
||||
|
||||
/*
|
||||
* EVENT_SYSTEM_CAPTURESTART
|
||||
* EVENT_SYSTEM_CAPTUREEND
|
||||
* Sent when a window takes the capture and releases the capture.
|
||||
*/
|
||||
SystemCaptureStart = 0x0008,
|
||||
SystemCaptureEnd = 0x0009,
|
||||
|
||||
/*
|
||||
* Move Size
|
||||
* EVENT_SYSTEM_MOVESIZESTART
|
||||
* EVENT_SYSTEM_MOVESIZEEND
|
||||
* Sent when a window enters and leaves move-size dragging mode.
|
||||
*/
|
||||
SystemMoveSizeStart = 0x000A,
|
||||
SystemMoveSizeEnd = 0x000B,
|
||||
|
||||
/*
|
||||
* Context Help
|
||||
* EVENT_SYSTEM_CONTEXTHELPSTART
|
||||
* EVENT_SYSTEM_CONTEXTHELPEND
|
||||
* Sent when a window enters and leaves context sensitive help mode.
|
||||
*/
|
||||
SystemContextHelpStart = 0x000C,
|
||||
EventSystemContextHelpEnd = 0x000D,
|
||||
|
||||
/*
|
||||
* Drag & Drop
|
||||
* EVENT_SYSTEM_DRAGDROPSTART
|
||||
* EVENT_SYSTEM_DRAGDROPEND
|
||||
* Send the START notification just before going into drag&drop loop. Send
|
||||
* the END notification just after canceling out.
|
||||
* Note that it is up to apps and OLE to generate this, since the system
|
||||
* doesn't know. Like EVENT_SYSTEM_SOUND, it will be a while before this
|
||||
* is prevalent.
|
||||
*/
|
||||
SystemDragDropStart = 0x000E,
|
||||
SystemDragdropEnd = 0x000F,
|
||||
|
||||
/*
|
||||
* Dialog
|
||||
* Send the START notification right after the dialog is completely
|
||||
* initialized and visible. Send the END right before the dialog
|
||||
* is hidden and goes away.
|
||||
* EVENT_SYSTEM_DIALOGSTART
|
||||
* EVENT_SYSTEM_DIALOGEND
|
||||
*/
|
||||
SystemDialogStart = 0x0010,
|
||||
SystemDialogEnd = 0x0011,
|
||||
|
||||
/*
|
||||
* EVENT_SYSTEM_SCROLLING
|
||||
* EVENT_SYSTEM_SCROLLINGSTART
|
||||
* EVENT_SYSTEM_SCROLLINGEND
|
||||
* Sent when beginning and ending the tracking of a scrollbar in a window,
|
||||
* and also for scrollbar controls.
|
||||
*/
|
||||
SystemScrollingStart = 0x0012,
|
||||
SystemScrollingEnd = 0x0013,
|
||||
|
||||
/*
|
||||
* Alt-Tab Window
|
||||
* Send the START notification right after the switch window is initialized
|
||||
* and visible. Send the END right before it is hidden and goes away.
|
||||
* EVENT_SYSTEM_SWITCHSTART
|
||||
* EVENT_SYSTEM_SWITCHEND
|
||||
*/
|
||||
SystemSwitchStart = 0x0014,
|
||||
SystemSwitchEnd = 0x0015,
|
||||
|
||||
/*
|
||||
* EVENT_SYSTEM_MINIMIZESTART
|
||||
* EVENT_SYSTEM_MINIMIZEEND
|
||||
* Sent when a window minimizes and just before it restores.
|
||||
*/
|
||||
SystemMinimizeStart = 0x0016,
|
||||
SystemMinimizeEnd = 0x0017,
|
||||
|
||||
|
||||
SystemDesktopSwitch = 0x0020,
|
||||
|
||||
|
||||
EventSystemEnd = 0x00FF,
|
||||
|
||||
OemDefinedStart = 0x0101,
|
||||
OemDefinedEnd = 0x01FF,
|
||||
|
||||
UiaEventIdStart = 0x4E00,
|
||||
UiaEventIdEnd = 0x4EFF,
|
||||
|
||||
UiaPropIdStart = 0x7500,
|
||||
UiaPropIdEnd = 0x75FF,
|
||||
|
||||
ConsoleCaret = 0x4001,
|
||||
ConsoleUpdateRegion = 0x4002,
|
||||
ConsoleUpdateSimple = 0x4003,
|
||||
ConsoleUpdateScroll = 0x4004,
|
||||
ConsoleLayout = 0x4005,
|
||||
ConsoleStartApplication = 0x4006,
|
||||
ConsoleEndApplication = 0x4007,
|
||||
|
||||
ConsoleEnd = 0x40FF,
|
||||
|
||||
/*
|
||||
* Object events
|
||||
*
|
||||
* The system AND apps generate these. The system generates these for
|
||||
* real windows. Apps generate these for objects within their window which
|
||||
* act like a separate control, e.g. an item in a list view.
|
||||
*
|
||||
* When the system generate them, dwParam2 is always WMOBJID_SELF. When
|
||||
* apps generate them, apps put the has-meaning-to-the-app-only ID value
|
||||
* in dwParam2.
|
||||
* For all events, if you want detailed accessibility information, callers
|
||||
* should
|
||||
* * Call AccessibleObjectFromWindow() with the hwnd, idObject parameters
|
||||
* of the event, and IID_IAccessible as the REFIID, to get back an
|
||||
* IAccessible* to talk to
|
||||
* * Initialize and fill in a VARIANT as VT_I4 with lVal the idChild
|
||||
* parameter of the event.
|
||||
* * If idChild isn't zero, call get_accChild() in the container to see
|
||||
* if the child is an object in its own right. If so, you will get
|
||||
* back an IDispatch* object for the child. You should release the
|
||||
* parent, and call QueryInterface() on the child object to get its
|
||||
* IAccessible*. Then you talk directly to the child. Otherwise,
|
||||
* if get_accChild() returns you nothing, you should continue to
|
||||
* use the child VARIANT. You will ask the container for the properties
|
||||
* of the child identified by the VARIANT. In other words, the
|
||||
* child in this case is accessible but not a full-blown object.
|
||||
* Like a button on a titlebar which is 'small' and has no children.
|
||||
*/
|
||||
|
||||
/*
|
||||
* For all EVENT_OBJECT events,
|
||||
* hwnd is the dude to Send the WM_GETOBJECT message to (unless NULL,
|
||||
* see above for system things)
|
||||
* idObject is the ID of the object that can resolve any queries a
|
||||
* client might have. It's a way to deal with windowless controls,
|
||||
* controls that are just drawn on the screen in some larger parent
|
||||
* window (like SDM), or standard frame elements of a window.
|
||||
* idChild is the piece inside of the object that is affected. This
|
||||
* allows clients to access things that are too small to have full
|
||||
* blown objects in their own right. Like the thumb of a scrollbar.
|
||||
* The hwnd/idObject pair gets you to the container, the dude you
|
||||
* probably want to talk to most of the time anyway. The idChild
|
||||
* can then be passed into the acc properties to get the name/value
|
||||
* of it as needed.
|
||||
*
|
||||
* Example #1:
|
||||
* System propagating a listbox selection change
|
||||
* EVENT_OBJECT_SELECTION
|
||||
* hwnd == listbox hwnd
|
||||
* idObject == OBJID_WINDOW
|
||||
* idChild == new selected item, or CHILDID_SELF if
|
||||
* nothing now selected within container.
|
||||
* Word '97 propagating a listbox selection change
|
||||
* hwnd == SDM window
|
||||
* idObject == SDM ID to get at listbox 'control'
|
||||
* idChild == new selected item, or CHILDID_SELF if
|
||||
* nothing
|
||||
*
|
||||
* Example #2:
|
||||
* System propagating a menu item selection on the menu bar
|
||||
* EVENT_OBJECT_SELECTION
|
||||
* hwnd == top level window
|
||||
* idObject == OBJID_MENU
|
||||
* idChild == ID of child menu bar item selected
|
||||
*
|
||||
* Example #3:
|
||||
* System propagating a dropdown coming off of said menu bar item
|
||||
* EVENT_OBJECT_CREATE
|
||||
* hwnd == popup item
|
||||
* idObject == OBJID_WINDOW
|
||||
* idChild == CHILDID_SELF
|
||||
*
|
||||
* Example #4:
|
||||
*
|
||||
* For EVENT_OBJECT_REORDER, the object referred to by hwnd/idObject is the
|
||||
* PARENT container in which the zorder is occurring. This is because if
|
||||
* one child is zordering, all of them are changing their relative zorder.
|
||||
*/
|
||||
ObjectCreate = 0x8000, // hwnd + ID + idChild is created item
|
||||
ObjectDestroy = 0x8001, // hwnd + ID + idChild is destroyed item
|
||||
ObjectShow = 0x8002, // hwnd + ID + idChild is shown item
|
||||
ObjectHide = 0x8003, // hwnd + ID + idChild is hidden item
|
||||
ObjectReorder = 0x8004, // hwnd + ID + idChild is parent of zordering children
|
||||
/*
|
||||
* NOTE:
|
||||
* Minimize the number of notifications!
|
||||
*
|
||||
* When you are hiding a parent object, obviously all child objects are no
|
||||
* longer visible on screen. They still have the same "visible" status,
|
||||
* but are not truly visible. Hence do not send HIDE notifications for the
|
||||
* children also. One implies all. The same goes for SHOW.
|
||||
*/
|
||||
|
||||
ObjectFocus = 0x8005, // hwnd + ID + idChild is focused item
|
||||
ObjectSelection = 0x8006, // hwnd + ID + idChild is selected item (if only one), or idChild is OBJID_WINDOW if complex
|
||||
ObjectSelectionAdd = 0x8007, // hwnd + ID + idChild is item added
|
||||
ObjectSelectionRemove = 0x8008, // hwnd + ID + idChild is item removed
|
||||
ObjectSelectionWithin = 0x8009, // hwnd + ID + idChild is parent of changed selected items
|
||||
|
||||
/*
|
||||
* NOTES:
|
||||
* There is only one "focused" child item in a parent. This is the place
|
||||
* keystrokes are going at a given moment. Hence only send a notification
|
||||
* about where the NEW focus is going. A NEW item getting the focus already
|
||||
* implies that the OLD item is losing it.
|
||||
*
|
||||
* SELECTION however can be multiple. Hence the different SELECTION
|
||||
* notifications. Here's when to use each:
|
||||
*
|
||||
* (1) Send a SELECTION notification in the simple single selection
|
||||
* case (like the focus) when the item with the selection is
|
||||
* merely moving to a different item within a container. hwnd + ID
|
||||
* is the container control, idChildItem is the new child with the
|
||||
* selection.
|
||||
*
|
||||
* (2) Send a SELECTIONADD notification when a new item has simply been added
|
||||
* to the selection within a container. This is appropriate when the
|
||||
* number of newly selected items is very small. hwnd + ID is the
|
||||
* container control, idChildItem is the new child added to the selection.
|
||||
*
|
||||
* (3) Send a SELECTIONREMOVE notification when a new item has simply been
|
||||
* removed from the selection within a container. This is appropriate
|
||||
* when the number of newly selected items is very small, just like
|
||||
* SELECTIONADD. hwnd + ID is the container control, idChildItem is the
|
||||
* new child removed from the selection.
|
||||
*
|
||||
* (4) Send a SELECTIONWITHIN notification when the selected items within a
|
||||
* control have changed substantially. Rather than propagate a large
|
||||
* number of changes to reflect removal for some items, addition of
|
||||
* others, just tell somebody who cares that a lot happened. It will
|
||||
* be faster an easier for somebody watching to just turn around and
|
||||
* query the container control what the new bunch of selected items
|
||||
* are.
|
||||
*/
|
||||
|
||||
ObjectStateChange = 0x800A, // hwnd + ID + idChild is item w/ state change
|
||||
/*
|
||||
* Examples of when to send an EVENT_OBJECT_STATECHANGE include
|
||||
* * It is being enabled/disabled (USER does for windows)
|
||||
* * It is being pressed/released (USER does for buttons)
|
||||
* * It is being checked/unchecked (USER does for radio/check buttons)
|
||||
*/
|
||||
ObjectLocationChange = 0x800B, // hwnd + ID + idChild is moved/sized item
|
||||
|
||||
/*
|
||||
* Note:
|
||||
* A LOCATIONCHANGE is not sent for every child object when the parent
|
||||
* changes shape/moves. Send one notification for the topmost object
|
||||
* that is changing. For example, if the user resizes a top level window,
|
||||
* USER will generate a LOCATIONCHANGE for it, but not for the menu bar,
|
||||
* title bar, scrollbars, etc. that are also changing shape/moving.
|
||||
*
|
||||
* In other words, it only generates LOCATIONCHANGE notifications for
|
||||
* real windows that are moving/sizing. It will not generate a LOCATIONCHANGE
|
||||
* for every non-floating child window when the parent moves (the children are
|
||||
* logically moving also on screen, but not relative to the parent).
|
||||
*
|
||||
* Now, if the app itself resizes child windows as a result of being
|
||||
* sized, USER will generate LOCATIONCHANGEs for those dudes also because
|
||||
* it doesn't know better.
|
||||
*
|
||||
* Note also that USER will generate LOCATIONCHANGE notifications for two
|
||||
* non-window sys objects:
|
||||
* (1) System caret
|
||||
* (2) Cursor
|
||||
*/
|
||||
|
||||
ObjectNameChange = 0x800C, // hwnd + ID + idChild is item w/ name change
|
||||
ObjectDescriptionChange = 0x800D, // hwnd + ID + idChild is item w/ desc change
|
||||
ObjectValueChange = 0x800E, // hwnd + ID + idChild is item w/ value change
|
||||
ObjectParentChange = 0x800F, // hwnd + ID + idChild is item w/ new parent
|
||||
ObjectHelpChange = 0x8010, // hwnd + ID + idChild is item w/ help change
|
||||
ObjectDefaultActionChange = 0x8011, // hwnd + ID + idChild is item w/ def action change
|
||||
ObjectAcceleratorChange = 0x8012, // hwnd + ID + idChild is item w/ keybd accel change
|
||||
|
||||
ObjectInvoked = 0x8013, // hwnd + ID + idChild is item invoked
|
||||
ObjectTextSelectionChanged = 0x8014, // hwnd + ID + idChild is item w? test selection change
|
||||
|
||||
/*
|
||||
* EVENT_OBJECT_CONTENTSCROLLED
|
||||
* Sent when ending the scrolling of a window object.
|
||||
*
|
||||
* Unlike the similar event (EVENT_SYSTEM_SCROLLEND), this event will be
|
||||
* associated with the scrolling window itself. There is no difference
|
||||
* between horizontal or vertical scrolling.
|
||||
*
|
||||
* This event should be posted whenever scroll action is completed, including
|
||||
* when it is scrolled by scroll bars, mouse wheel, or keyboard navigations.
|
||||
*
|
||||
* example:
|
||||
* hwnd == window that is scrolling
|
||||
* idObject == OBJID_CLIENT
|
||||
* idChild == CHILDID_SELF
|
||||
*/
|
||||
ObjectContentScrolled = 0x8015,
|
||||
|
||||
SystemArrangmentPreview = 0x8016,
|
||||
|
||||
ObjectEnd = 0x80FF,
|
||||
|
||||
AiaStart = 0xA000,
|
||||
AiaEnd = 0xAFFF
|
||||
}
|
||||
|
||||
public enum ObjectIdentifier : uint
|
||||
{
|
||||
Window = 0x00000000,
|
||||
SystemMenu = 0xFFFFFFFF,
|
||||
TitleBar = 0xFFFFFFFE,
|
||||
Menu = 0xFFFFFFFD,
|
||||
Client = 0xFFFFFFFC,
|
||||
VerticalScroll = 0xFFFFFFFB,
|
||||
HorizontalScroll = 0xFFFFFFFA,
|
||||
SizeGrip = 0xFFFFFFF9,
|
||||
Caret = 0xFFFFFFF8,
|
||||
Cursor = 0xFFFFFFF7,
|
||||
Alert = 0xFFFFFFF6,
|
||||
Sound = 0xFFFFFFF5
|
||||
}
|
||||
|
||||
public enum ChildIdentifier
|
||||
{
|
||||
Self = 0
|
||||
}
|
||||
|
||||
[Flags]
|
||||
public enum SetWinEventHookFlags : uint
|
||||
{
|
||||
OutOfContext = 0x0000, // Events are ASYNC
|
||||
SkipOwnThread = 0x0001, // Don't call back for events on installer's thread
|
||||
SkipOwnProcess = 0x0002, // Don't call back for events on installer's process
|
||||
InContext = 0x0004, // Events are SYNC, this causes your dll to be injected into every process
|
||||
}
|
||||
|
||||
public delegate void WinEventDelegate(IntPtr hWinEventHook, Event eventType, IntPtr hwnd, ObjectIdentifier idObject, int idChild, uint dwEventThread, uint dwmsEventTime);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern IntPtr SetWinEventHook(Event eventMin, Event eventMax, IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess, uint idThread, SetWinEventHookFlags dwFlags);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern bool UnhookWinEvent(IntPtr hWinEventHook);
|
||||
}
|
||||
}
|
||||
39
WinHook.cs
Normal file
39
WinHook.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Common.Native
|
||||
{
|
||||
public class WinHook
|
||||
{
|
||||
public enum HookType
|
||||
{
|
||||
WH_JOURNALRECORD = 0,
|
||||
WH_JOURNALPLAYBACK = 1,
|
||||
WH_KEYBOARD = 2,
|
||||
WH_GETMESSAGE = 3,
|
||||
WH_CALLWNDPROC = 4,
|
||||
WH_CBT = 5,
|
||||
WH_SYSMSGFILTER = 6,
|
||||
WH_MOUSE = 7,
|
||||
WH_HARDWARE = 8,
|
||||
WH_DEBUG = 9,
|
||||
WH_SHELL = 10,
|
||||
WH_FOREGROUNDIDLE = 11,
|
||||
WH_CALLWNDPROCRET = 12,
|
||||
WH_KEYBOARD_LL = 13,
|
||||
WH_MOUSE_LL = 14
|
||||
}
|
||||
|
||||
public delegate IntPtr HookProc(int code, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true)]
|
||||
public static extern IntPtr SetWindowsHookEx(HookType hookType, HookProc lpfn, IntPtr hMod, uint dwThreadId);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true)]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
public static extern bool UnhookWindowsHookEx(IntPtr hhk);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user