当控件可能在其他控件(如Panel)中时,有没有办法检索控件在窗体中的位置?
控件的Left和Top属性只给出了它在父控件中的位置,但如果我的控件位于五个嵌套面板中,我需要它在窗体上的位置怎么办?
快速举例:
按钮btnA位于面板pnlB内的坐标(10,10)上.
面板pnlB位于形式frmC内的坐标(15,15)上.
我想要btnA在frmC上的位置,这是(25,25).
我可以获得这个位置吗?
我正在为应用程序创建一个自动更新程序.应用程序由用户启动,无需管理员权限即可运行.autoupdater以管理员权限启动,并在下载新文件之前终止应用程序.
当我想在autoupdater完成后启动更新的应用程序时出现问题.如果我使用常规的System.Diagnostics.Process.Start(文件),应用程序也会以管理员权限启动,并且必须在当前用户上运行才能按预期工作.
那么,我如何使autoupdater以当前用户而不是管理员的身份启动应用程序?
我尝试过使用以下内容:
var pSI = new ProcessStartInfo() {
UseShellExecute = false,
UserName = Environment.UserName,
FileName = file
};
System.Diagnostics.Process.Start(pSI);
Run Code Online (Sandbox Code Playgroud)
但是这会引发错误"无效的用户名或密码".我已检查用户名是否正确,我知道密码可能无效,因为我没有包含它.但是,要求用户输入他/她的密码不是一个选项,因为自动启动应用程序的全部原因是为了使用户更容易.
有什么建议?
我有一个数据库,在标签系统中使用了很多单词.我已经为自动完成框创建了必要的代码,但我不确定如何以最有效的方式从数据库中获取匹配的条目.
我知道LIKE命令,但在我看来它更像是一个EQUAL命令.我只得到与我输入的单词完全相同的单词.
我的计划是读取每一行,然后使用C#的string.StartsWith()和string.Contains()函数来查找可能适合的单词,但我认为对于大型数据库,读取每一行可能效率低下然后过滤它们.
有没有办法只读取以SQL Server开头或包含给定字符串的行?
我使用以下代码打开和关闭显示器:
[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MONITORPOWER = 0xF170;
private const int MonitorTurnOn = -1;
private const int MonitorShutoff = 2;
//Turn them off
SendMessage(f.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)MonitorShutoff);
//Turn them on
SendMessage(f.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)MonitorTurnOn);
Run Code Online (Sandbox Code Playgroud)
这曾经按预期工作,但在安装Windows 8后(我认为这是原因,因为我看到其他人有同样的问题)打开屏幕将无法正常工作.我仍然可以将其关闭,但无论我使用MonitorTurnOn运行SendMessage()多少次,我仍然需要移动鼠标或按键才能重新启动显示器.
有关如何在Windows 8上运行此工作的任何建议?
我的游戏中有一个叠加层,它包含一个屏幕图像和一组"在屏幕上"的按钮.
截图:
我Screen
有一个Stage
.该Stage
有一套Group
对象,我认为它们是层.第一组具有背景,中间的组具有游戏元素,最前面的组具有屏幕覆盖.
叠加层由一个Image
屏幕本身和四个TextButton
(每个角落一个)组成.
如果不是因为我不能点击游戏层中的任何内容,只要覆盖层中的图像位于其前面,这就行得很好.即使图像是透明的,它仍会在到达游戏层之前拦截所有触摸事件.
所以我的问题是:如何让覆盖层中的图像忽略所有触摸事件,以便游戏层能够获得它们并且实际上可以玩游戏?
我自己尝试了一个想法,但我不确定这是正确的方法:
我尝试创建图像作为自定义Actor
,总是将高度/宽度设置为0,但仍然(通过重载draw()方法)在整个屏幕上绘制图像.这非常有效,除了由于某种原因图像被绘制在较低层中的元素后面的事实.
屏幕截图:https://dl.dropboxusercontent.com/u/1545094/Screen2.png
在这个屏幕截图中,我打开了一个指令消息框,它将自己添加到其中一个游戏层(第6组).请注意,覆盖层(即组7)中的所有按钮都位于消息框的前面,但是屏幕框(它是一个自定义Actor)会以某种方式在消息框后面绘制.这是为什么?注意:如果我采用完全相同的情况,并将我的自定义actor更改为常规图像,则所有内容都会正确绘制,但是我不能再单击较低层中的任何内容,如上所述.
这是我的自定义角色,如果有人能够理解它:
public class ClickThroughImage extends Actor {
BaseDrawable d;
public NonexistingImage(BaseDrawable d){
this.d = d;
setSize(0, 0);
}
@Override
public void draw(SpriteBatch batch, float parentAlpha) {
d.draw(batch, 0, 0, 1024, 768); //Yes, I tried swapping these two lines.
super.draw(batch, parentAlpha); //It had no effect.
}
}
Run Code Online (Sandbox Code Playgroud) 我想创建一个浮动帮助泡泡来介绍我的游戏的基本功能.这个气泡应浮在我希望它解释的Actor之上,如下图所示.
为了实现这一点,我想要Actor的坐标,在这种情况下是左按钮,然后我可以将泡泡Actor添加到舞台上的其他所有内容.最后一部分很简单,但我正在努力检索按钮的实际坐标,就像它在表格中一样.
这两个按钮被添加到表中,如下所示:
t.add(btnLab).expandX().center();
t.add(btnSea).expandX().center();
Run Code Online (Sandbox Code Playgroud)
我尝试过最明显的方法:
Vector2 loc = new Vector2(a.getX(), a.getY());
System.out.println("Loc: " + loc);
a.localToStageCoordinates(loc);
System.out.println("Loc: " + loc);
Run Code Online (Sandbox Code Playgroud)
这给了我(按sysout的顺序):[0.0,0.0]和[40.0,130.0].最后一个位置实际上是表格的位置,它填充了屏幕的蓝色区域.因此,这个位置显然错过了Table放置Actor的功能,并且无法使用(因为我最终只得到了Table的位置).
(我也试过在这里使用t.localToStageCoordinates,这是表.结果相同.)
我尝试的另一个解决方案是递归搜索所有父母:
private static Vector2 getLoc(Actor a) {
return getLoc(new Vector2(a.getX(), a.getY()), a.getParent());
}
private static Vector2 getLoc(Vector2 loc, Actor g) {
System.out.println("Location: " + loc + ", Actor: " + g);
loc.x += g.getX();
loc.y += g.getY();
if(g.getParent() == null) return loc;
return getLoc(loc, g.getParent());
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这给了我同样的东西.sysouts提供以下内容:
Location: [0.0:0.0], Actor: Table 40.0,130.0 944.0x508.0
Location: [40.0:130.0], Actor: Group …
Run Code Online (Sandbox Code Playgroud) 通过使用Windows API,可以将监视器置于睡眠模式:
[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
Run Code Online (Sandbox Code Playgroud)
然后
SendMessage(this.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)2);
Run Code Online (Sandbox Code Playgroud)
运行上面的命令时,两个监视器都会进入休眠状态.是否有可能只影响多个连接的监视器中的一个?
我创建了一个非常简单的绘图,通过在屏幕右侧添加新图像,然后使它们向左侧移动来动态更新.这样,屏幕边界内的绘图看起来就像是随着时间的推移而绘制的.
不幸的是,当这样做时,我必须让图像从屏幕外部开始,然后移动到视图中,在它们完全位于左侧屏幕之外时我无法再将它们移除.这导致图像在屏幕边界之外部分可见.
控件创建为Group
包含两个静态图像(黑色背景和屏幕图像作为前景),以及其间的所有运动图像.这Group
是然后添加到我的Stage
(像所有其他演员),并绘制成的一部分Stage
.
在下图中,控件的边界标有红色.我想隐藏这些边界之外的运动图像部分.这是否可以使用我错过的一些libGDX功能?通过某种方式限制集团的绘图区域,也许?
我的其他选择是在屏幕前绘制部分蓝色背景,隐藏异常值,或使屏幕边缘足够厚以隐藏它们.我认为这两种解决方案都不必要地带来不便,而且我很确定有更好的方法可以做到这一点.
有什么建议?
我正在创建一个上下文菜单,其中应包含所有文件夹,子文件夹和所选文件夹中文件的列表。我希望菜单在单击时打开文件和文件夹,但是如果menuitem具有子项,则单击事件不会注册。
void Foo(string Title)
{
MenuItem = new MenuItem(Title);
MenuItem.Click += new EventHandler(MenuItem_Click);
ContextMenu.MenuItems.Add(MenuItem);
}
void MenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("This box will only show when menuitems without subitems are clicked");
}
Run Code Online (Sandbox Code Playgroud)
即使菜单项有子项,如何使点击事件触发?
使用Microsoft Charts创建图表时,我需要在图表上获得网格的确切位置.
这个页面说 - 据我所知 - 这可以用InnerPlotPosition实现.但是,使用此属性时,我得到以下矩形:
这个矩形似乎与图表大小成比例; 在调整图表大小时,矩形会缩小,但仍会在所有边缘上保持在网格外部.我已尝试使用常量添加和乘以大小,但没有一个常量适用于所有大小.
所以,只是为了澄清,我想要的是网格上的外部黑色矩形.有没有办法得到这个?
(我一直在考虑从边缘扫描像素,并检测每个方向上的第一个黑色像素,但这听起来像是一个肮脏的黑客.)
我想将Mono运行时与我的OS X应用程序捆绑在一起,这样用户就不需要安装额外的框架来运行我的应用程序了.
当试图使用MonoDevelop的自动打包功能,并检查"在应用程序包中包含Mono运行时"时,我被告知我需要Xamarin.Mac.现在,Xamarin对于像我这样的小公司来说价格相当高,我希望我不必购买整个Xamarin软件包来捆绑运行时.
我的猜测是,还有其他方法可以做到这一点.我特意记得一段时间阅读包含框架和设置环境变量的内容,但我再也找不到了.互联网上有评论和提示,即使在这里也是如此,而且共识似乎确实是可能的,但我还没有找到如何做到这一点的描述.大多数答案似乎链接到mono-project.com网页的部分内容,现在已经不见了,因为它被移植到Xamarin包中,我怀疑.
那么,是否有任何非Xamarin方式在我的应用程序包中包含Mono运行时,让用户在不安装Mono的情况下运行它?
使用System.Threading.Timer并在计时器的tick事件上初始化Windows窗体时,表单无响应.为什么会这样,我该如何避免呢?
这个简单的示例代码显示了问题; 两个第一个窗口("原始"和"手动")工作正常,但"定时器"立即变得无法响应.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace WindowsFormsApplication1.Forms
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
private void frmMain_Load(object sender, EventArgs e)
{
this.Text = "Original";
this.Left = 0;
Form f = new Form();
f.Text = "Manual";
f.Show();
f.Left = this.Width;
TimerCallback tCallback = new TimerCallback(Timer_Tick);
System.Threading.Timer timer = new System.Threading.Timer(tCallback, null, 1000, System.Threading.Timeout.Infinite);
}
void Timer_Tick(object o)
{
Form …
Run Code Online (Sandbox Code Playgroud) 有没有办法让目前在Microsoft Word和Microsoft Excel中打开文档的路径?
我知道如何获取运行Excel或Word实例的PID和窗口句柄,但我不知道如何获取打开文档的路径.它甚至可能吗?
我认为API会很好,但我怀疑它是否存在.也许某种插件可以向我的应用程序发送信息?(但如果有其他方法可行,我想避免在任何地方安装插件.)
我更喜欢用C#来做,但任何可以编译成可执行文件的东西都没问题.
如果有人认为这听起来很可疑,那么它就不能被用于任何远程非法行为.它适用于数据收集系统.
c# ×9
libgdx ×3
java ×2
winforms ×2
.net ×1
bundle ×1
click ×1
controls ×1
coordinates ×1
events ×1
grouping ×1
layout ×1
menuitem ×1
monitor ×1
monodevelop ×1
monomac ×1
ms-office ×1
mschart ×1
runtime ×1
screen ×1
sleep-mode ×1
sql ×1
sql-server ×1
t-sql ×1
windows ×1
windows-8 ×1
xamarin.mac ×1