QString NMyUtils::getExeFullPathWithArgs() { QString exePath = QCoreApplication::applicationFilePath().replace("/","\\").replace("Reminder.exe","QTLoader.exe"); QString argPath = "\""+exePath+"\" TrayIcon"; qDebug()<<argPath; return argPath; } bool NMyUtils::isAutoStart() { QSettings reg("HKEY_LOCAL_MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN", QSettings::NativeFormat); QString val = reg.value("NReminder").toString(); if(val.length()>0) { return true; } else { return false; } } void NMyUtils::setAutoStart() { QSettings reg("HKEY_LOCAL_MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN", QSettings::NativeFormat); reg.setValue("NReminder",NMyUtils::getExeFullPathWithArgs()); } void NMyUtils::removeAutoStart() { QSettings reg("HKEY_LOCAL_MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN", QSettings::NativeFormat); reg.remove("NReminder"); }
Category Archives: OS
Winform多行标题TabControl
今天写示例程序的时候,遇到了需要多行标题TabControl的情况。
整体流程很简单,就是将标题拆分,然后根据行数和最大行宽设置每一Page标题的高度及宽度即可。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Collections; namespace UITabControlTest { public partial class SubForm : Form { private Dictionary<TabPage, TabPageInfo> allTabMap = new Dictionary<TabPage, TabPageInfo>(); public SubForm() { InitializeComponent(); tabMain.DrawMode = TabDrawMode.OwnerDrawFixed; } private void SubForm_Load(object sender, EventArgs e) { tabPage1.Text = "line1\nline2\nline3\nline4\nlin5"; tabPage2.Text = "line1\nline2\nline3\nline4"; tabPage3.Text = "line1\nline2\nline3"; tabPage4.Text = "line1\nline2"; int lineNum = 0; foreach (TabPage tab in this.tabMain.TabPages) { TabPageInfo pInfo = new TabPageInfo(tab.Text,"\n"); allTabMap.Add(tab, pInfo); lineNum = lineNum>pInfo.LineNum?lineNum:pInfo.LineNum; } foreach (TabPage tab in this.tabMain.TabPages) { TabPageInfo pInfo = allTabMap[tab]; tab.Text = pInfo.MaxLine; } //some thing is wrong, the font height is 14, the padding height is around 9, why? tabMain.Padding = new Point(0, Convert.ToInt32(tabMain.Font.Height * (lineNum - 1) * 0.65)); } private void tabMain_DrawItem(object sender, DrawItemEventArgs e) { TabControl tabControl = (TabControl)sender; TabPage currentTab = tabControl.TabPages[e.Index]; TabPageInfo info = allTabMap[currentTab]; string tabText = info.AllLine; StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Center; sf.LineAlignment = StringAlignment.Center; RectangleF tabRect = (RectangleF)e.Bounds; RectangleF textRect = tabRect; if (e.Index == tabControl.SelectedIndex) { tabRect.Inflate(1, 1); } Graphics g = e.Graphics; g.Clip = new Region(tabRect); g.Clear(Control.DefaultBackColor); g.ResetClip(); g.DrawString(tabText, e.Font, SystemBrushes.ControlText, textRect, sf); } } class TabPageInfo { public int LineNum { get { return nLineNum; } } public String MaxLine { get { //prevent auto wrap return szMaxLine+" "; } } public String getLine(int index) { if (index < nLineNum) { return szLines[index]; } else { return ""; } } public String AllLine { get { return szAllLine; } } private int nLineNum = 0; private String[] szLines; private String szAllLine; private String szMaxLine; public TabPageInfo(String pageTitle, String splitString) { szAllLine = pageTitle.Replace(splitString, "\n"); String [] separators = new String[]{splitString}; szLines = pageTitle.Split(separators,StringSplitOptions.RemoveEmptyEntries); nLineNum = szLines.Length; int nMaxLineWidth = 0; foreach(String line in szLines) { if (nMaxLineWidth < line.Length) { nMaxLineWidth = line.Length; szMaxLine = line; } } } } }
如何配置域控
开始->运行
dcpromo
从WIN ADT复制到MAC ADT
Android SDK超级大(我现在有26.5G),而连接Google的速度超级慢,一次下载要好久。
最近准备在MAC进行Android开发,别的都好下载,但Adroid SDK就有些太大了,于是考虑从WIN下直接复制到MAC。
Android SDK主要由下面几部分组成:
/add-ons:GoogleAPI,操作系统无关 /build-tools:构建工具,这个和操作系统相关的,要重新下载 /docs:文档,操作系统无关 /extras:扩展内容,是否需要重新下载与其功能有关 /extras/android:操作系统无关 /extras/google:操作系统无关 /extras/intel:intel的硬件加速驱动,操作系统相关,需重新下载 /platforms:android平台,早期操作系统相关,后期将操作系统相关内容放到了build-tools中,可以全部拷贝过去,系统相关内容会自动重新下载 /platform-tools:管理工具,这个和操作系统相关的,要重新下载 /samples:demo,操作系统无关 /sources:android源码,操作系统无关 /system-images:android系统映像,操作系统无关 /temp:下载缓存,不需要拷贝 /tools:管理工具,这个和操作系统相关的,要重新下载
MAC设置AndroidStudio初始环境
1、从Oracle下载MAC版本的JDK7
http://www.oracle.com/technetwork/java/javase/downloads/index.html
2、从Google下载MAC版本Android Studio和Android SDK Manager
http://developer.android.com/sdk/index.html
3、安装JDK7、Android Studio、Android SDK Manager,并下载需要版本的Android SDK
4、此时双击Android Studio会报错:
Android Studio was unable to find a valid JVM.
这是因为Android Studio默认使用JDK1.6.*的原因
在Finder中打开Application文件夹,在“Android Studio.app”上右键,显示程序包内容 编辑Content/Info.plist,修改属性JVMOptions->JVMVersion一行,从1.6.*修改为1.7.*
5、此时双击Android Studio会尝试从Google获取最新的Android SDK信息
Fetching Android SDK component information
当然你读不到啦,只好屏蔽初始化方法:
编辑Content/idea.properties/bin/idea.properties文件,添加一行 disable.android.first.run=true
6、现在Android Studio可以启动了,但是不能新建项目
需要告诉Android Studio,Android SDK在哪里:
主界面-》Configure-》Project Defaults-》Project Structure-》Android SDK location 填写Android SDK的绝对路径,保存,然后就能新建应用了
7、那就新建一个简单应用测试一下吧,当然先是虚拟机:
Starting emulator for AVD 'new' emulator: ERROR: x86 emulation currently requires hardware acceleration! Please ensure Intel HAXM is properly installed and usable. CPU acceleration status: HAX kernel module is not installed!
这是因为HAXM模块没有安装,前往Android SDK根目录
安装下面的软件: PATH_TO_SDK/extras/intel/Hardware_Accelerated_Execution_Manager/IntelHAXM_1.1.1_for_10_9_and_above.dmg
8、然后就是在设备上测试,Android SDK找不到我的设备
#添加adb路径 echo "export PATH=${PATH}:/PATH_TO_SDK/android-sdk-macosx/platform-tools/">>~/.bash_profile #然后刷新一下 source .bash_profile #添加设备厂商ID(我的是小米),可以在系统报告中看到设备厂商ID信息 echo"0x2717">>~/.android/adb_usb.ini #杀掉adb服务 adb kill-server #重启adb服务 adb sever #PTP模式连上手机,当然要开启手机调试咯,这样就能看到设备了 adb devices
9、连上设备了,运行时报错:
Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.neohope.testapp/.LoginActivity } from null (pid=29619, uid=2000) not exported from uid 10139
这个错误是因为Main Activity没有设置,在Manifest中对应的Activity中增加如下设置即可
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
Windows服务程序访问NAS
由于服务程序授权与用户桌面授权互不影响,所以即使在用户桌面映射了NAS盘符,在Windows服务程序下仍然是不可以访问的。
一般来说有这样几种做法来访问NAS或共享盘:
1、加入域,通过“域用户认证”或“通过将NAS资源设置对某台计算机授权”来达到访问NAS的目的
2、不加域,在Windows中添加与NAS相同的用户名及密码,服务程序通过该用户名密码登录,可以访问NAS
3、不加域,通过调阅API的方式来获得访问NAS的权限
A、VC实现如下:
DWORD AcessNetDrtive(TCHAR* szRemotePath, TCHAR* szLocalDriver, const TCHAR* szUsername, const TCHAR* szPassword) { DWORD dwRetVal; DWORD dwFlags; NETRESOURCE nr; memset(&nr, 0, sizeof(NETRESOURCE)); nr.dwScope = RESOURCE_GLOBALNET; nr.dwType = RESOURCETYPE_ANY; nr.lpLocalName = szLocalDriver; nr.lpRemoteName = szRemotePath; nr.lpProvider = NULL; //CONNECT_REDIRECT;CONNECT_UPDATE_PROFILE; dwFlags = 0; dwRetVal = WNetAddConnection2(&nr, szPassword, szUsername, dwFlags); retrun dwRetVal; }
B、C#实现如下:
public class NetworkDrive { public enum ResourceScope { RESOURCE_CONNECTED = 1, RESOURCE_GLOBALNET, RESOURCE_REMEMBERED, RESOURCE_RECENT, RESOURCE_CONTEXT } public enum ResourceType { RESOURCETYPE_ANY, RESOURCETYPE_DISK, RESOURCETYPE_PRINT, RESOURCETYPE_RESERVED } public enum ResourceUsage { RESOURCEUSAGE_CONNECTABLE = 0x00000001, RESOURCEUSAGE_CONTAINER = 0x00000002, RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004, RESOURCEUSAGE_SIBLING = 0x00000008, RESOURCEUSAGE_ATTACHED = 0x00000010, RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED), } public enum ResourceDisplayType { RESOURCEDISPLAYTYPE_GENERIC, RESOURCEDISPLAYTYPE_DOMAIN, RESOURCEDISPLAYTYPE_SERVER, RESOURCEDISPLAYTYPE_SHARE, RESOURCEDISPLAYTYPE_FILE, RESOURCEDISPLAYTYPE_GROUP, RESOURCEDISPLAYTYPE_NETWORK, RESOURCEDISPLAYTYPE_ROOT, RESOURCEDISPLAYTYPE_SHAREADMIN, RESOURCEDISPLAYTYPE_DIRECTORY, RESOURCEDISPLAYTYPE_TREE, RESOURCEDISPLAYTYPE_NDSCONTAINER } [StructLayout(LayoutKind.Sequential)] private class NETRESOURCE { public ResourceScope dwScope = 0; public ResourceType dwType = 0; public ResourceDisplayType dwDisplayType = 0; public ResourceUsage dwUsage = 0; public string lpLocalName = null; public string lpRemoteName = null; public string lpComment = null; public string lpProvider = null; } [DllImport("mpr.dll")] private static extern int WNetAddConnection2(NETRESOURCE lpNetResource, string lpPassword, string lpUsername, int dwFlags); public static int MapNetworkDrive(string remotePath, string localDrive, string userName, string passWord) { NETRESOURCE myNetResource = new NETRESOURCE(); myNetResource.lpLocalName = localDrive; myNetResource.lpRemoteName = remotePath; myNetResource.lpProvider = null; int result = WNetAddConnection2(myNetResource, passWord, userName, 0); return result; } }
不支持一个STA线程上针对多个句柄的WaitAll
最近项目中用了COM控件,同时也用了多线程,在等待线程退出的地方,使用了
AutoResetEvent[] tEevents; //... WaitHandle.WaitAll(tEevents);
程序运行到这里,就会报错:
不支持一个STA线程上针对多个句柄的WaitAll
当时事情很急,将其调整为
AutoResetEvent[] tEevents; //... foreach(var tEvent in tEevents) { tEvent.WaitOne(); }
就将这个问题绕了过去。
后来,在Stackoverflow上面,查了STA和MTA的区别。COM线程模型称为Apartment模型,分为STA和MTA两种。
STA(Single Thread Apartment):
STA是非线程安全的,常用于UI界面,其他线程要访问STA模式的COM组件,需要通过STA线程进行访问(其实就变成了单线程调用)
MTA(Multi Thread Apartment):
MTA是线程安全的,COM的程序员自己处理了并发的问题,其他线程可以直接访问COM组件
2014版MAC分区失败(后记)
等了一个月,MAC一直卡在“加密已暂停,连接电源适配器”,当然不管插不插电,结果是一样的。
重启到command+r,关闭FileVault,还是不行。
好吧,这是逼着我干掉你了。
1、将MAC备份为移动硬盘上的映像文件。
2、重启进入MAC,用Time Mashine同样备份到移动硬盘上。
3、重启到command+r
4、磁盘工具,干掉当前分区
5、重建分区(不带加密的那个)
6、Time Mashine还原
7、重启进入MAC
8、Bootcamp分区,安装Win7,搞定!
2014版MAC分区失败
最近帮朋友在新买的MBA上分区安装widows,但无论是bootcamp还是磁盘管理工具,都提示无法分区。
用磁盘管理工具直接分区的时候,提示“不允许此Core Storage操作在稀疏逻辑宗卷组上进行”。
不知道为什么,打电话问了Apple的客服,发现是默认开启了“FileVault”功能,压力山大。
到选项-》安全与隐私-》FileVault里关掉就可以了(FileVault要加密完毕后,才能关闭,所以现在用的是虚拟机)。
鄙视Apple,一点儿提示都没有,不就是SSD盘吗,有啥了不起的,哼。
另外,这台新版MBA,重启后按option,没有Recovery选项,客服小妹妹说新版MBA要按住command+r才有这个选项。
压力山大。
这台电脑是定制的i7+8G+128G的定制版本,不知道是不是MAC OS安装时是否和普通版本是一样的,还是客服小妹妹在忽悠我啊。
CS获取可执行文件所在文件夹
//Form程序 private static String getExeFileFolder() { String strExeFolder = System.Reflection.Assembly.GetExecutingAssembly().Location; int nPos = strExeFolder.LastIndexOf("\\"); if (nPos >= 0) { strExeFolder = strExeFolder.Substring(0, nPos + 1); } else { strExeFolder = strExeFolder + "\\"; } return strExeFolder; } //IIS程序 String rootPath = Request.PhysicalApplicationPath; String strExeFolder = getExeFileFolder(rootPath); private static String getExeFileFolder(String strExeFolder) { int nPos = strExeFolder.LastIndexOf("\\"); if (nPos >= 0) { strExeFolder = strExeFolder.Substring(0, nPos + 1); } else { strExeFolder = strExeFolder + "\\"; } return strExeFolder; }