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;
}