我正在尝试向powershell中的表单添加进度条.我不想使用PowerShell的Write-Progress cmdlet(因为当我从命令行运行脚本时,它显示了一个基于文本的进度条,我总是想要一个基于表单/图形的栏).
我试过这个似乎工作(在网上找到):
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
$form_main = New-Object System.Windows.Forms.Form
$progressBar1 = New-Object System.Windows.Forms.ProgressBar
$timer1 = New-Object System.Windows.Forms.Timer
$timer1_OnTick = {
$progressBar1.PerformStep()
}
$form_main.Text = 'ProgressBar demo'
$progressBar1.DataBindings.DefaultDataSourceUpdateMode = 0
$progressBar1.Step = 1
$progressBar1.Name = 'progressBar1'
$form_main.Controls.Add($progressBar1)
$timer1.Interval = 100
$timer1.add_tick($timer1_OnTick)
$timer1.Start()
$form_main.ShowDialog()| Out-Null
Run Code Online (Sandbox Code Playgroud)
但是,我不希望事件更新进度条(如上例中的$ timer1_OnTic)我想通过在整个脚本中调用来自行更新它,例如:
$progressBar1.PerformStep()
Run Code Online (Sandbox Code Playgroud)
要么
$progressBar1.Value = 10
Run Code Online (Sandbox Code Playgroud)
因此,似乎我需要某种后台工作程序,只要我调用PerformStep()或更改progressBar的值,就会更新进度条
调用ShowDialog会停止脚本内的所有处理,直到表单关闭.
我试图弄清楚如何以编程方式判断Windows 7机器是否启用了触控功能.是否有任何触摸API(托管或非托管)可以帮助我实现这一目标?或者我可以检查注册表中的某些内容?
Windows 7附带了几个内置主题.可以通过右键单击桌面并选择"个性化"来访问它们.在Personalize下,有一个名称为"航空主题"的部分包含"建筑","自然"等主题.
我尝试使用uxtheme.dll的GetCurrentThemeName,但它实际上给出了样式名称:"C:\ Windows\resources\Themes\Aero\Aero.msstyles",除非我当前的主题设置为Windows Basic,在这种情况下它返回一个空字符串.是否有实际返回主题名称的API,如"自然""建筑"等......?
我尝试的代码如下:
[DllImport("uxtheme", ExactSpelling = true, CharSet = CharSet.Unicode)]
public extern static Int32 GetCurrentThemeName(StringBuilder stringThemeName,
int lengthThemeName, StringBuilder stringColorName, int lengthColorName,
StringBuilder stringSizeName, int lengthSizeName);
StringBuilder stringThemeName = new StringBuilder(260);
StringBuilder stringColorName = new StringBuilder(260);
StringBuilder stringSizeName = new StringBuilder(260);
Int32 s = GetCurrentThemeName(stringThemeName, 260,stringColorName, 260,stringSizeName, 260);
Run Code Online (Sandbox Code Playgroud) 我正在尝试调用powershell文件中的函数,如下所示:
string script = System.IO.File.ReadAllText(@"C:\Users\Bob\Desktop\CallPS.ps1");
using (Runspace runspace = RunspaceFactory.CreateRunspace())
{
runspace.Open();
using (Pipeline pipeline = runspace.CreatePipeline(script))
{
Command c = new Command("BatAvg",false);
c.Parameters.Add("Name", "John");
c.Parameters.Add("Runs", "6996");
c.Parameters.Add("Outs", "70");
pipeline.Commands.Add(c);
Collection<PSObject> results = pipeline.Invoke();
foreach (PSObject obj in results)
{
// do somethingConsole.WriteLine(obj.ToString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
powershell函数在CallPS.ps1中:
Function BatAvg
{
param ($Name, $Runs, $Outs)
$Avg = [int]($Runs / $Outs*100)/100
Write-Output "$Name's Average = $Avg, $Runs, $Outs "
}
Run Code Online (Sandbox Code Playgroud)
我收到以下异常:
术语"BatAvg"不被识别为cmdlet,函数,脚本文件或可操作程序的名称.
我承认,我做错了什么,我对PowerShell知之甚少.
我试图在C:\ Windows\System32\oobe\info\Backgrounds下列出Windows 7上的所有文件,方法是调用以下内容:
const string logonScreenBackgroundPath = "C:\\Windows\\System32\\oobe\\info\\Backgrounds";
DirectoryInfo dInfo = new DirectoryInfo(logonScreenBackgroundPath);
string[] backgroundFiles = Directory.GetFiles(logonScreenBackgroundPath);
Run Code Online (Sandbox Code Playgroud)
但是我在GetFiles调用上遇到异常:找不到路径'C:\ Windows\System32\oobe\info\Backgrounds的一部分
我验证了文件夹存在并且有文件,我在命令提示符下cd,它一切都很好,但c#调用失败.
在C:\ Windows\System32\oobe \上调用GetFiles可以正常工作.文件夹属性在\ oobe和\ info之间没有什么不同.
经过进一步调查后,这看起来像64位问题.当我为"AnyCpu"构建项目时,找到了没有问题的文件夹.问题是我的项目必须为x86编译,而不是由于依赖项而编译AnyCpu.
解决方案:看起来这是一个已知问题,MS已经为它发布了一个修补程序.问题是由于文件系统重定向.
我现在使用以下命令禁用调用线程上的重定向:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);
IntPtr ptr = new IntPtr();
bool isWow64FsRedirectionDisabled = Wow64DisableWow64FsRedirection(ref ptr);
Run Code Online (Sandbox Code Playgroud) 我正在使用SetWindowPos
并MoveWindow
调整窗口大小和居中。它可以正常工作,但是在Windows Media Player或“控制面板”等几个窗口上,当您关闭窗口并再次打开它时,新的调整大小/移动不会反映出来。手动调整大小时,更改将在下次打开窗口时反映出来。即使我打电话UpdateWindow
,更改也不会反映出来。我需要发送窗口以便保存更改吗?有RedrawWindow
帮助吗?谢谢?
我需要在特定的表中获取最后一个插入行以严格控制当前会话.我不能使用@@IDENTITY
,SCOPE_IDENTITY()
因为他们将返回任何表的最后插入的标识.问题IDENT_CURRENT
是它将返回特定表的记录的最后插入标识,但是对于任何会话.这对我来说是一个问题,因为它INSERT
是由多个会话调用的,我特别需要我的特定会话的最后插入记录的标识.
任何指针如何实现这一目标?
PS.该INSERT
声明不在SPROC内部,因此SPROC解决方案不可行.
谢谢
c# ×5
.net ×3
winapi ×3
powershell ×2
windows-7 ×2
sql ×1
sql-server ×1
t-sql ×1
touch ×1
windows ×1