我使用以下代码为程序加载自定义光标:
var x = new XMLHttpRequest();
x.onreadystatechange = function(){
if(x.readyState == 4 && x.status == 200){
alert("happyness");
}
};
x.open("GET","servlet1",true);
x.send();
然后:
public static Cursor LoadCustomCursor(string path)
{
IntPtr hCurs = LoadCursorFromFile(path);
if (hCurs == IntPtr.Zero) throw new Win32Exception(-2147467259, "Key game file missing. Please try re-installing the game to fix this error.");
Cursor curs = new Cursor(hCurs);
// Note: force the cursor to own the handle so it gets released properly.
FieldInfo fi = typeof(Cursor).GetField("ownHandle", BindingFlags.NonPublic | BindingFlags.Instance);
fi.SetValue(curs, true);
return curs;
}
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern IntPtr LoadCursorFromFile(string path);
我想知道如果项目文件夹例如移动到D:/分区或C:/上的另一个文件夹,上面的绝对路径是否也可以工作?我可以这样做:
Cursor gameCursor = NativeMethods.LoadCustomCursor(@"C:/Users/User/Documents/Visual Studio 2015/Projects/myProj/myProj/Content/Graphics/Cursors/cursor_0.xnb");
Form gameForm = (Form)Control.FromHandle(Window.Handle);
使用string myStr = Assembly.GetExecutingAssembly().Location;
string output = myStr.Replace("bin\\Windows\\Debug\\myProj.exe", "Content\\Graphics\\Cursors\\cursor_0.xnb");
作为游标文件的路径? output
是否为动态(每次移动程序文件夹时都会更改)?或者它始终与项目构建时相同?
答案 0 :(得分:1)
您可以使用Environment.CurrentDirectory
。例如:
string cursorPath = @"Content\Graphics\Cursors\cursor_0.xnb";
string output = Path.Combine(Environment.CurrentDirectory, cursorPath);
Environment.CurrentDirectory返回当前工作目录的完整路径,如果将它放在字符串前面,您可以使用@
一次性转义文字\
。
答案 1 :(得分:0)
这种方法不是最好的方法。
最好使用相对路径,而不是绝对路径。
您可以使用" .."从当前位置向上移动一个文件夹。 例如
var output = @"..\..\..\Content\Graphics\Cursors\cursor_0.xnb";
等于
string myStr = System.Reflection.Assembly.GetExecutingAssembly().Location;
string output = myStr.Replace("bin\\Windows\\Debug\\myProj.exe", "Content\\Graphics\\Cursors\\cursor_0.xnb");
答案 2 :(得分:0)
只有当光标文件位于指定的确切路径时,您的绝对路径才会继续工作:@"C:/Users/User/Documents/Visual Studio 2015/Projects/myProj/myProj/Content/Graphics/Cursors/cursor_0.xnb"
。将光标文件的位置与.EXE文件相关联是一个更好的主意,但是您需要维护在代码中指定的相对文件夹结构。您的代码现在依赖于生活在目录<appRoot>\bin\Windows\Debug
中的.EXE,您在部署应用程序时可能不会想要它。 (相反,您可能会将.EXE放在应用程序的根文件夹中,资源文件会进入子目录。)对于这样的结构,您可以编写(代码从未编译过,因此可能包含拼写错误或其他错误):
var exe = Assembly.GetExecutingAssembly().Location;
var exeFolder = System.IO.Path.GetDirectoryName(exe);
var cursorFile = System.IO.Path.Combine(exeFolder, "relative/path/to/your.cur";
(为了增加好处,当重命名.EXE文件时,此代码将继续工作。)
使用这种方法,您只需要确保在相对于.EXE的特定位置找到光标文件。当然,开发盒和目标机器上都需要存在相同的结构。使用Visual Studio中的MSBuild任务将资源文件复制到$(OutDir)\relative\path\to
。要部署到其他计算机,只需复制+粘贴输出文件夹的内容,或创建将文件部署到所需文件夹结构的安装程序。