之所以有这篇文章,得首先感谢组员zhangjing同学,正是因为有了她的idea,我才会去寻找解决方案,希望我们组的成员能多多提出好的idea。实现MessageBox自动消失的类的源码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
| class MessageBoxTimeOut
{
private string _caption;
public void Show(string text, string caption, int timeout)
{
this._caption = caption;
StartTimer(timeout);
MessageBox.Show(text, caption);
}
private void StartTimer(int interval)
{
Timer timer = new Timer();
timer.Interval = interval;
timer.Tick += new EventHandler(Timer_Tick);
timer.Enabled = true;
}
private void Timer_Tick(object sender, EventArgs e)
{
KillMessageBox();
//停止计时器
((Timer)sender).Enabled = false;
}
[DllImport("coredll.dll", EntryPoint = "FindWindow",
CharSet = CharSet.Auto)]
private extern static IntPtr FindWindow
(string lpClassName, string lpWindowName);
[DllImport("coredll.dll", CharSet = CharSet.Auto)]
public static extern int PostMessage(IntPtr hWnd, int msg,
IntPtr wParam, IntPtr lParam);
public const int WM_CLOSE = 0x10;
private void KillMessageBox()
{
//查找MessageBox的弹出窗口,注意对应标题
IntPtr ptr = FindWindow(null, this._caption);
if (ptr != IntPtr.Zero)
{
//查找到窗口则关闭
PostMessage(ptr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
}
}
} |
C#学习, 移动平台
前几天,在做RFID手持端开发时,发现若插入多条数据总不能成功执行,在仔细核对sql语句确认正确的基础上,我想应该是多条sql语句的错误。
在sqlce中进行数据库操作时,若有多条以“;”分隔的sql语句,则不能正确执行(在wince系统中如此,其他系统没有测试),这时一个比较好的解决方法,就是采用sqlce的事务机制。下面是一个比较简单的代码,在使用的时候可以加以修改以适合自己的需要。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| public void RunSqlCeTransaction(string myConnString) {
SqlCeConnection myConnection = new SqlCeConnection(myConnString);
myConnection.Open();
SqlCeCommand myCommand = new SqlCeCommand();
SqlCeTransaction myTrans;
// Start a local transaction
myTrans = myConnection.BeginTransaction();
// Must assign both transaction object and connection
// to Command object for a pending local transaction
myCommand.Connection = myConnection;
myCommand.Transaction = myTrans;
try {
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
myCommand.ExecuteNonQuery();
myTrans.Commit();
}
catch(Exception) {
try {
myTrans.Rollback();
}
catch (SqlCeException) {
// Handle possible exception here
}
}
finally {
myConnection.Close();
}
} |
C#学习, 移动平台
本文介绍同步模式下的流套接字Socket编程,关于Socket通信的原理在前一篇文章中已经介绍了,在此就不多说了,仅以例子进行说明
Server端:接收数据,并显示,同时反馈给客户端信息,程序是多线程的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
| using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace test.socket
{
class PcSocket
{
//private Socket server;
private int SERVER_PORT=9696;//侦听端口
private string SERVER_IP = "222.195.151.223";//服务器地址
private static int BUFFER_SIZE = 65535;//设置缓冲区大小
public PcSocket() {
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipadd = IPAddress.Parse(SERVER_IP);
IPEndPoint ipe = new IPEndPoint(ipadd, SERVER_PORT);
server.Bind(ipe);
server.Listen(100);
Console.WriteLine("wait for the client to build Connection……");
while (true) {
Socket client = server.Accept();//阻塞方法,创建新的连接
ClientThread newClient = new ClientThread(client);//创建了ClientThread类的实例
Thread newThread = new Thread(new ThreadStart(newClient.ClientServer));//新建线程,并将ClientThread类的实例的方法赋给线程
newThread.Start();//启动线程
}
}
class ClientThread {
private Socket client;
private string data = null;
private byte[] receiveBytes = new byte[BUFFER_SIZE];//服务器端设置缓冲区
int i;
private int bytesCount;
public ClientThread(Socket ClientSocket) {
this.client = ClientSocket;
}
public void ClientServer() {
try
{
bytesCount = client.Receive(receiveBytes, receiveBytes.Length, 0);//从客户端接收信息
if (bytesCount != 0)//当服务器端的缓冲区接收到的信息不为空时
{
data = Encoding.ASCII.GetString(receiveBytes, 0, bytesCount);
Console.WriteLine("Receive date:{0}", data);
string sendStr = "OK!Client send message sucessfully";
byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr);
client.Send(sendBytes, sendBytes.Length, 0);//向客户端发送信息
}
}
catch (Exception ex)
{
Console.Write("出现异常:");
Console.WriteLine(ex.ToString());
Console.ReadLine();
}
client.Close();
}
}
}
} |
Client端:发送数据,并接收服务器端反馈的信息,进行显示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
| using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace testClient.client
{
class ClientSocket
{
private int SERVER_PORT = 9696;
private string SERVER_IP = "222.195.151.223";
private static int BUFFER_SIZE = 65535;
private Socket client = null; //客户端套接字
private string clientInput; // 输入的字符串
private string clientReceiveStr=null;//接收到的字符串
private byte[] clientSendBytes = new byte[BUFFER_SIZE];
private byte[] clientReceiveBytes = new byte[BUFFER_SIZE];
public ClientSocket()
{
try
{
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipadd = IPAddress.Parse(SERVER_IP);
IPEndPoint ipe = new IPEndPoint(ipadd, SERVER_PORT);
client.Connect(ipe);
}
catch (SocketException se)
{
Console.WriteLine("服务器程序尚未启动!请先启动服务器程序!");
Console.WriteLine("Error occurs:" + se.ToString());
Console.ReadLine();
}
if (client.Connected) //如果与服务器已经建立连接
{
try
{
clientInput = "hello,this is a socket test";
clientSendBytes = Encoding.ASCII.GetBytes(clientInput);
//Send方法返回一个System.Int32类型的值,表明已发送数据的大小
client.Send(clientSendBytes, clientSendBytes.Length, 0);
int bytes = client.Receive(clientReceiveBytes, clientReceiveBytes.Length, 0);//从服务器端接受返回信息
clientReceiveStr = Encoding.ASCII.GetString(clientReceiveBytes, 0, bytes);
Console.WriteLine("client get message:{0}", clientReceiveStr);//显示服务器返回信息
}
catch (Exception ex)
{
Console.Write("出现异常:");
Console.WriteLine(ex.ToString());
Console.ReadLine();
}
client.Shutdown(SocketShutdown.Both);
client.Close();
Console.ReadLine();
}
}
}
} |
C#学习, 移动平台
socket, 网络通信
PDA模拟器的上网,一般需要在主机联网的情况下设置。如果主机已经联网,可以按照以下步骤进行设置:
1、打开ActiveSync,“文件”——“连接设置”,在“允许连接到以下其中一个端口”下选择“DMA”。
2、打开VS2005,点击菜单“工具”——“设备仿真管理器”,选择一个相应的模拟器。右击选择“连接”,模拟器启动后点击“插入底座”,此时,通过ActiveSync来连接到模拟器,并进行数据同步。
3、在模拟器中,“开始”——“设置”,点击“连接”选项卡。
(1)选择“网卡”:“我的网卡连接到”选“默认单位设置”。在“点击适配器以修改设置:”下面选“AsyncMac NDISWAN Miniport”,选中“使用服务器分配的IP地址”,点击右上角的“ok”,提示“新设置将在下次使用适配器时应用。如果适配器当前插在设备中,请先移除,然后重新插入适配器以应用设置。”,确认之后关闭页面即可。
(2)在“连接”选项卡中选择“连接”:在“高级”选项卡中,点击“选择网络”,在“在程序自动连接到Internet时,使用:”下面选“单位设置”,然后返回。
4、此时,就可以上网了。如还打不开网页,可在“设备仿真器管理器”中选中该模拟器,先点击右键菜单中的“移除底座”,再点击“插入底座”,重新与ActiveSync连接一次,就没问题了。
参考:http://hi.baidu.com/%B3%A9%CF%EB%BB%ED%C1%C1/blog/item/17e32b460f567a0a6b63e512.html
移动平台
pda, 模拟器
在前一篇文章中介绍了C#透明按钮的实现,但是实验室其他人反应会出现未处理COMException,晚上把自己手头上任务完成之后,就想看看到底怎么回事,参考网上一篇文章的介绍,修改了一下源文件,测试了一下到现在为止没发现什么问题,但具体情况还有待检验,修改方法如下:
参考:http://www.codeplex.com/alphamobilecontrols/WorkItem/View.aspx?WorkItemId=3720
In
IImagingFactory.cs, replace:
// We need the MarshalAs attribute here to keep COM interop from
sending the buffer down as
uint
CreateImageFromBuffer([MarshalAs(UnmanagedType.LPArray)]
byte[] buffer, uint size, BufferDisposalFlag disposalFlag, out
IImage image);
With:
uint CreateImageFromBuffer(IntPtr buffer, uint size,
BufferDisposalFlag disposalFlag, out IImage
image);
|
|
In
AlphaImage.cs add this in the top of the file:
using System.Runtime.InteropServices;
And replace:
factory.CreateImageFromBuffer(pbBuf, cbBuf,
BufferDisposalFlag.BufferDisposalFlagNone, out
alphaImage._image);
With:
// Copy stream data into an unmanaged global buffer that will be
freed by the factory once
// note that we cannot pass pbBuf directly since it might be moved
around or freed by the
IntPtr p =
Marshal.AllocHGlobal((int)cbBuf);
Marshal.Copy(pbBuf, 0, p, (int)cbBuf);
factory.CreateImageFromBuffer(p, cbBuf,
BufferDisposalFlag.BufferDisposalFlagGlobalFree, out
alphaImage._image);
|
移动平台
在此介绍的label和按钮透明是借助第三方控件的方式,假设现有项目是TestDurban,需要引用的第三方控件项目的名称是AlphaMobileControls。
首先,需要引入第三方控件,步骤如下,文件——添加——现有项目,找到对应的文件(本例为AlphaMobileControls.csproj),这时解决方案资源管理器会显示有两个项目。
其次,设置项目依赖性。在解决方案资源管理器中右击任一项目,选择项目依赖性,如下图所示进行设置,设置完毕之后选择项目——添加引用中的项目选项卡即可以看到刚才添加的项目。

第三,右击AlphaMobileControls,选择重新生成,此步骤的作用类似于编译,将引入的项目重新生成一下。
第四,添加对相应dll文件的引用,项目——添加引用,选择浏览选项卡,在此项目中是选择AlphaMobileControls.dll文件。
第五,添加对项目类包的引用,在需要对label和按钮进行透明化处理的页面加入using
AlphaMobileControls和using
System.Reflection;并且所有的form需要继承AlphaMobileControls.AlphaForm(替代原来的Form)。
第六,根据我们项目需要,最底层加入一个TabControl,之后依次是AlphaPanel,AlphaPictureBox,然后即是AlphaLabel或者AlphaImageButton,
|
alphaLabel1.Text
= “Alpha Mobile
Controls”;
bgPixBox.Image =
AlphaImage.CreateFromResource(”TestDurban.Resources.Wallpaper.jpg”);
btn1.BackgroundImage =
AlphaImage.CreateFromResource(”TestDurban.Resources.Btn1.png”);
btn1.ActiveBackgroundImage =
AlphaImage.CreateFromResource(”TestDurban.Resources.Btn1_Pushed.png”);
btn1.DisabledBackgroundImage =
AlphaImage.CreateFromResource(”TestDurban.Resources.Btn1_Disabled.png”);
|
在这一步中,很关键的一个步骤是需要将所有图片设为嵌入的资源,否则会出现空指针错误。设为嵌入的资源的方法选中图片,将其属性中的生成操作改为嵌入的资源。至此基本就可以完成了,可能稍有疏漏,不过基本就如此。
Ps:出现错误提示:无法直接启动带有“类库输出类型”的项目,若要调试此项目,请在此解决方案中添加一个引用库项目的可执行项目。将这个可执行项目设置为启动项”//错误信息
出错原因:在同一个解决方案里面有多个项目,被设置成启动项目的是类库项目,类库项目是被编译成dll文件给别的项目使用的,是不可执行的项目
解决办法:在解决方案资源管理器里,右击你要启动的项目,选择“设为启动项目”
移动平台