只要在DataGridTextColumn裡面加入DataGridTextColumn.EditingElementStyle就可以在裡面放入事件了
方法如下
-->
參考來源:Cell value changed event(?) in DataGrid
-->
......
......
string dll = @"Z:\test.dll"; Assembly a = Assembly.UnsafeLoadFrom(dll);
string dll = @"Z:\test.dll"; ; byte[] assemblyBuffer = File.ReadAllBytes(dll); Assembly a = Assembly.Load(assemblyBuffer);
private void ServerBrowserItemsUI(ListserverList) { Application.Current.Dispatcher.BeginInvoke((Action)delegate () { serverList.ToList().ForEach(args => { OPCServerSource.Add(new Model.OPCServer() { ProgName = args.progID, ProgID = args.clsid.ToString(), Url = new System.Windows.Media.Imaging.BitmapImage(new Uri(@"/OPCDASettingWPFLib;component/Common/Images/lightIcon_green_20.png", UriKind.RelativeOrAbsolute)) }); }); }); }
public bool WriteAlarmEvent(IOPCDAClientLib.AlarmRecord alarm)
{
bool result = false;
using (_cmd = new SqlCommand("AlarmRecordAdd", _connect))
{
_cmd.CommandType = System.Data.CommandType.StoredProcedure;
_cmd.Parameters.Add("@TagName", System.Data.SqlDbType.NVarChar, 200);
_cmd.Parameters.Add("@AlarmState", System.Data.SqlDbType.NVarChar, 100);
_cmd.Parameters.Add("@Description", System.Data.SqlDbType.NVarChar);
_cmd.Parameters.Add("@Value", System.Data.SqlDbType.NVarChar, 100);
_cmd.Parameters.Add("@EventStampDate", System.Data.SqlDbType.Date);
_cmd.Parameters.Add("@EventStampTime", System.Data.SqlDbType.Time);
_cmd.Parameters.Add("@Provider", System.Data.SqlDbType.NVarChar, 100);
_cmd.Parameters.Add("@Area", System.Data.SqlDbType.NVarChar, 100);
_cmd.Parameters.Add("@Type", System.Data.SqlDbType.NVarChar, 100);
_cmd.Parameters.Add("@Priority", System.Data.SqlDbType.Int,1);
_cmd.Parameters.Add("@MilliSec", System.Data.SqlDbType.Int,1);
_cmd.Parameters.Add("@Category", System.Data.SqlDbType.NVarChar, 100);
_cmd.Parameters.Add("@CheckValue", System.Data.SqlDbType.NVarChar, 100);
_cmd.Parameters.Add("@Operator", System.Data.SqlDbType.NVarChar, 100);
_cmd.Parameters.Add("@DomainName", System.Data.SqlDbType.NVarChar, 100);
_cmd.Parameters.Add("@UserFullName", System.Data.SqlDbType.NVarChar, 100);
_cmd.Parameters.Add("@OperatorNode", System.Data.SqlDbType.NVarChar, 100);
_cmd.Parameters.Add("@AlarmId", System.Data.SqlDbType.Int);
_cmd.Parameters["@TagName"].Value = alarm.TagName ?? "";
_cmd.Parameters["@AlarmState"].Value = alarm.AlarmState ?? "";
_cmd.Parameters["@Description"].Value = alarm.Description ?? "";
_cmd.Parameters["@Value"].Value = alarm.Value ?? "";
_cmd.Parameters["@EventStampDate"].Value = DateTime.Now.ToString("yyyy/MM/dd");
_cmd.Parameters["@EventStampTime"].Value = DateTime.Now.ToString("HH:mm:ss.fff");
_cmd.Parameters["@Provider"].Value = alarm.Provider ?? "";
_cmd.Parameters["@Area"].Value = alarm.Area ?? "";
_cmd.Parameters["@Type"].Value = alarm.Type ?? "";
_cmd.Parameters["@Priority"].Value = alarm.Priority;
_cmd.Parameters["@MilliSec"].Value = 0;
_cmd.Parameters["@Category"].Value = alarm.Category ?? "";
_cmd.Parameters["@CheckValue"].Value = alarm.CheckValue;
_cmd.Parameters["@Operator"].Value = alarm.Operator ?? "";
_cmd.Parameters["@DomainName"].Value = alarm.DomainName ?? "";
_cmd.Parameters["@UserFullName"].Value = alarm.UserFullName ?? "";
_cmd.Parameters["@OperatorNode"].Value = alarm.OperatorNode ?? "";
_cmd.Parameters["@AlarmId"].Value = alarm.AlarmId;
_connect.Open();
try
{
if(ConnectStatus())
{
_cmd.ExecuteNonQuery();
_connect.Close();
result = true;
}
else
{
result = false;
}
}
catch(Exception ex)
{
result = false;
throw ex;
}
finally
{
_connect.Close();
}
}
return result;
}
ALTER PROCEDURE [dbo].[AlarmRecordAdd]
@TagName nvarchar(200), @AlarmState nvarchar(100), @Description nvarchar(MAX),
@Value nvarchar(100), @EventStampDate datetime, @EventStampTime datetime,
@Provider nvarchar(100), @Area nvarchar(100), @Type nvarchar(100), @Priority int,
@MilliSec int, @Category nvarchar(100), @CheckValue nvarchar(100), @Operator nvarchar(100),
@DomainName nvarchar(100), @UserFullName nvarchar(100), @OperatorNode nvarchar(100),
@AlarmId int
AS
DECLARE @EventTimeStamp datetime
DECLARE @EventDate char(10)
DECLARE @EventTime char(12)
BEGIN
IF @EventStampDate IS NOT NULL AND @EventStampTime IS NOT NULL
BEGIN
SET @EventDate = CONVERT(varchar(10), @EventStampDate, 111)
SET @EventTime = CONVERT(varchar(12), @EventStampTime, 114)
SET @EventTimeStamp = CONVERT(datetime, @EventDate + ' ' + @EventTime, 121)
SET @MilliSec = DATEPART(MS,@EventTimeStamp)
END
ELSE
BEGIN
SET @EventTimeStamp = '1900-01-01 07:07:07'
END
IF NOT EXISTS(SELECT TOP 1 EventStamp FROM AlarmRecord WHERE EventStamp = @EventTimeStamp AND TagName = @TagName AND AlarmState = @AlarmState )
BEGIN
INSERT INTO AlarmRecord(TagName, AlarmState, [Description], [Value], EventStamp,EventStampUTC, Provider, Area,
[Type], Priority, MilliSec, Category, CheckValue, Operator, DomainName, UserFullName, OperatorNode,
AlarmId, WriteTimestamp)
VALUES(@TagName, @AlarmState, @Description, @Value, @EventTimeStamp,@EventTimeStamp, @Provider, @Area, @Type, @Priority,
@MilliSec, @Category, @CheckValue, @Operator, @DomainName, @UserFullName, @OperatorNode, @AlarmId, GETDATE())
END
SELECT 0
END
using System;
using System.Collections.Generic;
using System.Text;
using System.Security;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace WS_Monitor_Task_CSharp
{
///
/// Class that allows running applications with full admin rights. In
/// addition the application launched will bypass the Vista UAC prompt.
///
public class ApplicationLoader
{
#region Structrures
[StructLayout(LayoutKind.Sequential)]
public struct SECURITY_ATTRIBUTES
{
public int Length;
public IntPtr lpSecurityDescriptor;
public bool bInheritHandle;
}
[StructLayout(LayoutKind.Sequential)]
public struct STARTUPINFO
{
public int cb;
public String lpReserved;
public String lpDesktop;
public String lpTitle;
public uint dwX;
public uint dwY;
public uint dwXSize;
public uint dwYSize ;
public uint dwXCountChars;
public uint dwYCountChars;
public uint dwFillAttribute;
public uint dwFlags;
public short wShowWindow;
public short cbReserved2;
public IntPtr lpReserved2;
public IntPtr hStdInput;
public IntPtr hStdOutput;
public IntPtr hStdError;
}
[StructLayout(LayoutKind.Sequential)]
public struct PROCESS_INFORMATION
{
public IntPtr hProcess;
public IntPtr hThread;
public uint dwProcessId;
public uint dwThreadId;
}
#endregion
#region Enumberation
enum TOKEN_TYPE : int
{
TokenPrimary = 1,
TokenImpersonation = 2
}
enum SECURITY_IMPERSONATION_LEVEL : int
{
SecurityAnonymous = 0,
SecurityIdentification = 1,
SecurityImpersonation = 2,
SecurityDelegation = 3,
}
#endregion
#region Constants
public const int TOKEN_DUPLICATE = 0x0002;
public const uint MAXIMUM_ALLOWED = 0x2000000;
public const int CREATE_NEW_CONSOLE = 0x00000010;
public const int IDLE_PRIORITY_CLASS = 0x40;
public const int NORMAL_PRIORITY_CLASS = 0x20;
public const int HIGH_PRIORITY_CLASS = 0x80;
public const int REALTIME_PRIORITY_CLASS = 0x100;
#endregion
#region Win32 API Imports
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool CloseHandle(IntPtr hSnapshot);
[DllImport("kernel32.dll")]
static extern uint WTSGetActiveConsoleSessionId();
[DllImport("advapi32.dll", EntryPoint = "CreateProcessAsUser", SetLastError = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public extern static bool CreateProcessAsUser(IntPtr hToken, String lpApplicationName, String lpCommandLine, ref SECURITY_ATTRIBUTES lpProcessAttributes,
ref SECURITY_ATTRIBUTES lpThreadAttributes, bool bInheritHandle, int dwCreationFlags, IntPtr lpEnvironment,
String lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation);
[DllImport("kernel32.dll")]
static extern bool ProcessIdToSessionId(uint dwProcessId, ref uint pSessionId);
[DllImport("advapi32.dll", EntryPoint = "DuplicateTokenEx")]
public extern static bool DuplicateTokenEx(IntPtr ExistingTokenHandle, uint dwDesiredAccess,
ref SECURITY_ATTRIBUTES lpThreadAttributes, int TokenType,
int ImpersonationLevel, ref IntPtr DuplicateTokenHandle);
[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
[DllImport("advapi32", SetLastError = true), SuppressUnmanagedCodeSecurityAttribute]
static extern bool OpenProcessToken(IntPtr ProcessHandle, int DesiredAccess, ref IntPtr TokenHandle);
#endregion
///
/// Launches the given application with full admin rights, and in addition bypasses the Vista UAC prompt
///
/// The name of the application to launch
/// Process information regarding the launched application that gets returned to the caller
///
public static bool StartProcessAndBypassUAC(String applicationName, out PROCESS_INFORMATION procInfo)
{
uint winlogonPid = 0;
IntPtr hUserTokenDup = IntPtr.Zero,
hPToken = IntPtr.Zero,
hProcess = IntPtr.Zero;
procInfo = new PROCESS_INFORMATION();
// obtain the currently active session id; every logged on user in the system has a unique session id
TSControl.WTS_SESSION_INFO[] pSessionInfo = TSControl.SessionEnumeration();
uint dwSessionId = 100;
for (int i = 0; i < pSessionInfo.Length; i++)
{
if (pSessionInfo[i].SessionID != 0)
{
try
{
int count = 0;
IntPtr buffer = IntPtr.Zero;
StringBuilder sb = new StringBuilder();
bool bsuccess = TSControl.WTSQuerySessionInformation(
IntPtr.Zero, pSessionInfo[i].SessionID,
TSControl.WTSInfoClass.WTSUserName, out sb, out count);
if (bsuccess)
{
if (sb.ToString().Trim() == "dmpadmin")
{
dwSessionId = (uint)pSessionInfo[i].SessionID;
}
}
}
catch (Exception ex)
{
LoaderService.WriteLog(ex.Message.ToString(),"Monitor");
}
}
}
// obtain the process id of the winlogon process that is running within the currently active session
Process[] processes = Process.GetProcessesByName("explorer");
foreach (Process p in processes)
{
if ((uint)p.SessionId == dwSessionId)
{
winlogonPid = (uint)p.Id;
}
}
LoaderService.WriteLog(winlogonPid.ToString(), "Monitor");
// obtain a handle to the winlogon process
hProcess = OpenProcess(MAXIMUM_ALLOWED, false, winlogonPid);
// obtain a handle to the access token of the winlogon process
if (!OpenProcessToken(hProcess, TOKEN_DUPLICATE, ref hPToken))
{
CloseHandle(hProcess);
return false;
}
// Security attibute structure used in DuplicateTokenEx and CreateProcessAsUser
// I would prefer to not have to use a security attribute variable and to just
// simply pass null and inherit (by default) the security attributes
// of the existing token. However, in C# structures are value types and therefore
// cannot be assigned the null value.
SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
sa.Length = Marshal.SizeOf(sa);
// copy the access token of the winlogon process; the newly created token will be a primary token
if (!DuplicateTokenEx(hPToken, MAXIMUM_ALLOWED, ref sa, (int)SECURITY_IMPERSONATION_LEVEL.SecurityIdentification, (int)TOKEN_TYPE.TokenPrimary, ref hUserTokenDup))
{
CloseHandle(hProcess);
CloseHandle(hPToken);
return false;
}
// By default CreateProcessAsUser creates a process on a non-interactive window station, meaning
// the window station has a desktop that is invisible and the process is incapable of receiving
// user input. To remedy this we set the lpDesktop parameter to indicate we want to enable user
// interaction with the new process.
STARTUPINFO si = new STARTUPINFO();
si.cb = (int)Marshal.SizeOf(si);
si.lpDesktop = @"winsta0\default"; // interactive window station parameter; basically this indicates that the process created can display a GUI on the desktop
// flags that specify the priority and creation method of the process
int dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;
// create a new process in the current user's logon session
bool result = CreateProcessAsUser(hUserTokenDup, // client's access token
null, // file to execute
applicationName, // command line
ref sa, // pointer to process SECURITY_ATTRIBUTES
ref sa, // pointer to thread SECURITY_ATTRIBUTES
false, // handles are not inheritable
dwCreationFlags, // creation flags
IntPtr.Zero, // pointer to new environment block
null, // name of current directory
ref si, // pointer to STARTUPINFO structure
out procInfo // receives information about new process
);
// invalidate the handles
CloseHandle(hProcess);
CloseHandle(hPToken);
CloseHandle(hUserTokenDup);
LoaderService.WriteLog("launch Task","Monitor");
return result; // return the result
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace WS_Monitor_Task_CSharp
{
public class TSControl
{
/**/
///
/// Terminal Services API Functions,The WTSEnumerateSessions function retrieves a list of sessions on a specified terminal server,
///
/// [in] Handle to a terminal server. Specify a handle opened by the WTSOpenServer function, or specify WTS_CURRENT_SERVER_HANDLE to indicate the terminal server on which your application is running
/// Reserved; must be zero
/// [in] Specifies the version of the enumeration request. Must be 1.
/// [out] Pointer to a variable that receives a pointer to an array of WTS_SESSION_INFO structures. Each structure in the array contains information about a session on the specified terminal server. To free the returned buffer, call the WTSFreeMemory function.
/// To be able to enumerate a session, you need to have the Query Information permission.
/// [out] Pointer to the variable that receives the number of WTS_SESSION_INFO structures returned in the ppSessionInfo buffer.
/// If the function succeeds, the return value is a nonzero value. If the function fails, the return value is zero
[DllImport("wtsapi32", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool WTSEnumerateSessions(int hServer, int Reserved, int Version, ref long ppSessionInfo, ref int pCount);
/**/
///
/// Terminal Services API Functions,The WTSFreeMemory function frees memory allocated by a Terminal Services function.
///
/// [in] Pointer to the memory to free
[DllImport("wtsapi32.dll")]
public static extern void WTSFreeMemory(System.IntPtr pMemory);
/**/
///
/// Terminal Services API Functions,The WTSLogoffSession function logs off a specified Terminal Services session.
///
/// [in] Handle to a terminal server. Specify a handle opened by the WTSOpenServer function, or specify WTS_CURRENT_SERVER_HANDLE to indicate the terminal server on which your application is running.
/// [in] A Terminal Services session identifier. To indicate the current session, specify WTS_CURRENT_SESSION. You can use the WTSEnumerateSessions function to retrieve the identifiers of all sessions on a specified terminal server.
/// To be able to log off another user's session, you need to have the Reset permission
/// [in] Indicates whether the operation is synchronous.
/// If bWait is TRUE, the function returns when the session is logged off.
/// If bWait is FALSE, the function returns immediately.
/// If the function succeeds, the return value is a nonzero value.
/// If the function fails, the return value is zero.
[DllImport("wtsapi32.dll")]
public static extern bool WTSLogoffSession(int hServer, long SessionId, bool bWait);
[DllImport("Wtsapi32.dll")]
public static extern bool WTSQuerySessionInformation(
System.IntPtr hServer,
int sessionId,
WTSInfoClass wtsInfoClass,
out StringBuilder ppBuffer,
out int pBytesReturned
);
public enum WTSInfoClass
{
WTSInitialProgram,
WTSApplicationName,
WTSWorkingDirectory,
WTSOEMId,
WTSSessionId,
WTSUserName,
WTSWinStationName,
WTSDomainName,
WTSConnectState,
WTSClientBuildNumber,
WTSClientName,
WTSClientDirectory,
WTSClientProductId,
WTSClientHardwareId,
WTSClientAddress,
WTSClientDisplay,
WTSClientProtocolType
}
/**/
///
/// The WTS_CONNECTSTATE_CLASS enumeration type contains INT values that indicate the connection state of a Terminal Services session.
///
public enum WTS_CONNECTSTATE_CLASS
{
WTSActive,
WTSConnected,
WTSConnectQuery,
WTSShadow,
WTSDisconnected,
WTSIdle,
WTSListen,
WTSReset,
WTSDown,
WTSInit,
}
/**/
///
/// The WTS_SESSION_INFO structure contains information about a client session on a terminal server.
/// if the WTS_SESSION_INFO.SessionID==0, it means that the SESSION is the local logon user's session.
///
public struct WTS_SESSION_INFO
{
public int SessionID;
[MarshalAs(UnmanagedType.LPTStr)]
public string pWinStationName;
public WTS_CONNECTSTATE_CLASS state;
}
/**/
///
/// The SessionEnumeration function retrieves a list of
///WTS_SESSION_INFO on a current terminal server.
///
/// a list of WTS_SESSION_INFO on a current terminal server
public static WTS_SESSION_INFO[] SessionEnumeration()
{
//Set handle of terminal server as the current terminal server
int hServer = 0;
bool RetVal;
long lpBuffer = 0;
int Count = 0;
long p;
WTS_SESSION_INFO Session_Info = new WTS_SESSION_INFO();
WTS_SESSION_INFO[] arrSessionInfo;
RetVal = WTSEnumerateSessions(hServer, 0, 1, ref lpBuffer, ref Count);
arrSessionInfo = new WTS_SESSION_INFO[0];
if (RetVal)
{
arrSessionInfo = new WTS_SESSION_INFO[Count];
int i;
p = lpBuffer;
for (i = 0; i < Count; i++)
{
arrSessionInfo[i] =
(WTS_SESSION_INFO)Marshal.PtrToStructure(new IntPtr(p),
Session_Info.GetType());
p += Marshal.SizeOf(Session_Info.GetType());
}
WTSFreeMemory(new IntPtr(lpBuffer));
}
else
{
//Insert Error Reaction Here
}
return arrSessionInfo;
}
public TSControl()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
}
}
if (sb.ToString().Trim() == "dmpadmin")
[DllImport("Wtsapi32.dll")]
private static extern bool WTSQuerySessionInformation(IntPtr hServer, int sessionId, WtsInfoClass wtsInfoClass, out IntPtr ppBuffer, out int pBytesReturned);
[DllImport("Wtsapi32.dll")]
private static extern void WTSFreeMemory(IntPtr pointer);
private enum WtsInfoClass
{
WTSUserName = 5,
WTSDomainName = 7,
}
private static string GetUsername(int sessionId, bool prependDomain = true)
{
IntPtr buffer;
int strLen;
string username = "SYSTEM";
if (WTSQuerySessionInformation(IntPtr.Zero, sessionId, WtsInfoClass.WTSUserName, out buffer, out strLen) && strLen > 1)
{
username = Marshal.PtrToStringAnsi(buffer);
WTSFreeMemory(buffer);
if (prependDomain)
{
if (WTSQuerySessionInformation(IntPtr.Zero, sessionId, WtsInfoClass.WTSDomainName, out buffer, out strLen) && strLen > 1)
{
username = Marshal.PtrToStringAnsi(buffer) + "\\" + username;
WTSFreeMemory(buffer);
}
}
}
return username;
}
using System;
namespace WindowsServiceTest
{
class Program
{
static void Main(string[] args)
{
System.Management.SelectQuery sQuery = new System.Management.SelectQuery(string.Format("select name, startname from Win32_Service")); // where name = '{0}'", "MCShield.exe"));
using (System.Management.ManagementObjectSearcher mgmtSearcher = new System.Management.ManagementObjectSearcher(sQuery))
{
foreach (System.Management.ManagementObject service in mgmtSearcher.Get())
{
string servicelogondetails =
string.Format("Name: {0} , Logon : {1} ", service["Name"].ToString(), service["startname"]).ToString();
Console.WriteLine(servicelogondetails);
}
}
Console.ReadLine();
}
}
}
MethodBase method = stackTrace.GetFrame(1).GetMethod(); string methodName = method.Name; string className = method.ReflectedType.Name; Console.WriteLine(className + "." + methodName);
DelayStartTimeTextBox.PreviewTextInput += StaticResourceModel.PreviewTextInput;
public static class StaticResourceModel
{
public static void PreviewTextInput(object sender, TextCompositionEventArgs e)
{
e.Handled = new System.Text.RegularExpressions.Regex("[^0-9]+").IsMatch(e.Text);
}
}
public ObservableCollectionMyString = new ObservableCollection (new List ());
public ICommand ResetProgramCommand { get { if (_resetProgramCommand == null) { _resetProgramCommand = new RelayCommand(obj => {_event.ResetProgramEvent() , _event.UpdateProgramEvent()}, null); } return _resetProgramCommand; } }
string value = string.empty;
string result = "Success";
public ICommand ResetProgramCommand { get { if (_resetProgramCommand == null) { _resetProgramCommand = new RelayCommand(obj => {_event.ResetProgramEvent(),value = result;}, null); } return _resetProgramCommand; } }
首先宣告XDocument的物件,並給它檔案路徑去讀取,然後再new一個ObservableCollection的string泛型,透過linq的語法去取得attribute的參數,並轉成list在轉型放入到ObservableCollection。
XDocument allLanguage = XDocument.Load($@"{Properties.Settings.Default.ConfigPath}");
name = = new ObservableCollection((from data in allLanguage.Descendants("TaskManager").Descendants("Language") select data).Elements("LanguageInfo").Select(args => args.Attribute("name").Value).ToList());
value = new ObservableCollection((from data in allLanguage.Descendants("TaskManager").Descendants("Language") select data).Elements("LanguageInfo").Select(args => args.Attribute("value").Value).ToList());
如果是要放到一個類別裡面也可以這樣宣告
foreach(XElement element in (from data in allLanguage.Descendants("TaskManager").Descendants("Language") select data).Elements("LanguageInfo"))
{
StaticResourceModel.ComboBoxValue.Add(new ComboBoxValue() {Name= element.Attribute("name").Value , Value = element.Attribute("value").Value});
}
public void Test(3). Func Func是有傳回值的泛型委派 Func(Action action,T p) { action(p); }