显示列表
 C#实现组合键2008-09-03

// Ctrl + H
if ((Control.ModifierKeys & Keys.Control) != 0 && e.KeyCode == Keys.H)
{
    MessageBox.Show("Ctrl + H");
}

// Alt + H
if ((Control.ModifierKeys & Keys.Alt) != 0 && e.KeyCode == Keys.H)
{
    MessageBox.Show("Alt + H");
}

// Shift + H
if ((Control.ModifierKeys & Keys.Shift) != 0 && e.KeyCode == Keys.H)
{
    MessageBox.Show("Shift + H");
}

// Ctrl + Alt + Shift + H
if ((Control.ModifierKeys & Keys.Control) != 0 &&
    (Control.ModifierKeys & Keys.Alt) != 0 &&
    (Control.ModifierKeys & Keys.Shift) != 0 &&
    e.KeyCode == Keys.H)
{
    MessageBox.Show("Ctrl + Alt + Shift + H");
}

查看全文 | 分类(C#/CSharp) | 访问(1870) | 编辑
 C#中捕获屏幕2008-09-02

通过调用系统的API实现

[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern IntPtr CreateDC(
string lpszDriver, // 驱动名称
string lpszDevice, // 设备名称
string lpszOutput, // 无用,可以设定位"NULL"
IntPtr lpInitData // 任意的打印机数据
);


[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern bool BitBlt(
IntPtr hdcDest, // 目标设备的句柄
int nXDest, // 目标对象的左上角的X坐标
int nYDest, // 目标对象的左上角的X坐标
int nWidth, // 目标对象的矩形的宽度
int nHeight, // 目标对象的矩形的长度
IntPtr hdcSrc, // 源设备的句柄
int nXSrc, // 源对象的左上角的X坐标
int nYSrc, // 源对象的左上角的X坐标
int dwRop // 光栅的操作值
);

private void button1_Click(object sender, EventArgs e)
{
    //创建显示器的DC
    IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);

    //由一个指定设备的句柄创建一个新的Graphics对象
    Graphics g1 = Graphics.FromHdc(dc1);

    //根据屏幕大小创建一个与之相同大小的Bitmap对象
    Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1);
    
    //根据此位图创建一个和其一样的Graphic对象
    Graphics g2 = Graphics.FromImage(bitmap);


    //获得屏幕的句柄
    IntPtr dc3 = g1.GetHdc();


    //获得位图的句柄
    IntPtr dc2 = g2.GetHdc();


    //把当前屏幕捕获到位图对象中,实现屏幕捕获
    BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc3, 0, 0, 13369376);


    //释放屏幕句柄
    g1.ReleaseHdc(dc3);


    //释放位图句柄
    g2.ReleaseHdc(dc2);


    bitmap.Save("c:\\1.jpg", ImageFormat.Jpeg);
}

查看全文 | 分类(C#/CSharp) | 访问(208) | 编辑

Byte[]数组与其他数据类型相互转换

通过 BitConverter 类实现

把整型转成 byte[]
byte[] arrayByte = BitConverter.GetBytes(10);

把 byte[] 转成整型
byte[] arrayByte = BitConverter.GetBytes(10);
int a = BitConverter.ToInt32(arrayByte, 0);

把字符串转成 byte[]
string str = "汉字";
byte[] arrayByte = System.Text.Encoding.GetEncoding("GB2312").GetBytes(str);

把 byte[] 转成字符串
string str = "汉字";
byte[] arrayByte = System.Text.Encoding.GetEncoding("GB2312").GetBytes(str);
string str2 = System.Text.Encoding.GetEncoding("GB2312").GetString(arrayByte);

其他数据类型如:Boolean、Char、Single、Double、Int64等都可用 BitConverter 类实现相互转换

标签:byte 
查看全文 | 分类(C#/CSharp) | 访问(419) | 编辑

通过钩子,用快捷键激活窗体,实现窗体显示在用户界面的前台。

if (this.WindowState == FormWindowState.Normal || this.WindowState == FormWindowState.Maximized)
{
    this.Activate();
}
else
{
    // 窗体处在最小化状态
    this.WindowState = FormWindowState.Normal;
    this.Focus();
    this.Activate();
}

查看全文 | 分类(C#/CSharp) | 访问(271) | 编辑

GetWindowPlacement
返回指定窗口的显示状态以及被恢复的、最大化的和最小化的窗口位置。
bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);

hWnd
指定窗口的句柄

WINDOWPLACEMENT
保存窗口位置的信息

[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll")]
public static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);

public struct POINT
{
    public int x;
    public int y;
}

public struct RECT
{
    public int left;
    public int top;
    public int right;
    public int bottom;
}

public struct WINDOWPLACEMENT
{
    public int length;
    public int flags;
    public int showCmd;
    public POINT ptMinPosition;
    public POINT ptMaxPosition;
    public RECT rcNormalPosition;
}

private void button1_Click(object sender, EventArgs e)
{
    IntPtr hWnd = GetForegroundWindow();

    WINDOWPLACEMENT lpwndpl = new WINDOWPLACEMENT();

    //lpwndpl.length = Marshal.SizeOf(typeof(WINDOWPLACEMENT));

    GetWindowPlacement(hWnd, ref lpwndpl); // 数据都被存在 WINDOWPLACEMENT 中

    // 窗口的位置信息
    MessageBox.Show(lpwndpl.rcNormalPosition.left.ToString());
}

标签:API 
查看全文 | 分类(C#/CSharp) | 访问(655) | 编辑
 API学习2008-07-29

API函数
GetWindowPlacement
返回指定窗口的显示状态以及被恢复的、最大化的和最小化的窗口位置。



数据类型



英文翻译
Specifies:指定,指明,详细说明,具体说明

标签:API 
查看全文 | 分类(C#/CSharp) | 访问(102) | 编辑

用C#写的WinForms程序,在自已机器上能正常运行,在其他机器上不能运行,提示“遇到问题需要关闭。我们对此引起的不便表示抱歉。”

网上搜索在其他机器上不能运行原因主要有两个:
1.没有装.Net Framework
2.缺少关联的程序集

如果没有装.Net Framework错误提示不会这样。原因应该是缺少关联的程序集。

找到错误的地方,程序引用了C:\Windows\System32\mshtml.tlb,当使用 mshtml 空间中的对象时就提示“遇到问题需要关闭。我们对此引起的不便表示抱歉。”

解决的方法
通过类型库导入程序(Tlbimp.exe)将 COM 类型库中的类型定义转换为公共语言运行库程序集中。
在 Visual Studio 命令提示中执行
tlbimp C:\Windows\System32\mshtml.tlb /out:C:\mshtml.dll
转换需要一定时间,生成的 mshtml.dll 有8M。
在WinForms程序中添加引用这个 mshtml.dll,不要引用 C:\Windows\System32\mshtml.tlb
最后把这个mshtml.dll和exe文件复制过去就可以用了。


标签:错误 
查看全文 | 分类(C#/CSharp) | 访问(979) | 编辑

iHTMLDocument2 对象中有Frame,要访问Frame中的内容
IHTMLFrameBase2 frame = (IHTMLFrameBase2)iHTMLDocument2.all.item("FrameName", 0);
iHTMLDocument2 iHTMLDocument2Frame = frame.contentWindow.document;
这里会出错。拒绝访问。
原因是Frame中的Src指向另一个域名
IHTMLDocument2 拒绝访问不同域名的对象

标签:错误 
查看全文 | 分类(C#/CSharp) | 访问(2970) | 编辑

常用
1.MessageBox.Show("提示信息");

2.MessageBox.Show("提示信息", "信息标题");

3.MessageBox.Show("提示信息", "信息标题", MessageBoxButtons.OK);

4.MessageBox.Show("提示信息", "信息标题", MessageBoxButtons.OK, MessageBoxIcon.Error);

查看全文 | 分类(C#/CSharp) | 访问(1164) | 编辑

在 WinForms 中,有时要执行耗时的操作,在该操作未完成之前操作用户界面,会导致用户界面停止响应。
解决的方法就是新开一个线程,把耗时的操作放到线程中执行,这样就可以在用户界面上进行其它操作。
新建线程可以用 Thread 类,可以实现多线程同时操作,简单的可以通过 BackgroundWorker 类实现。

用 BackgroundWorker 类执行耗时的操作
BackgroundWorker 类在 System.ComponentModel 命名空间下。
VS 的工具箱时有一个 BackgroundWorker 组件,就是这个类。


常用方法

1.RunWorkerAsync
开始执行后台操作。引发 DoWork 事件

2.CancelAsync
请求取消挂起的后台操作。
注意:这个方法是将 CancellationPending 属性设置为 true,并不会终止后台操作。在后台操作中要检查 CancellationPending 属性,来决定是否要继续执行耗时的操作。

3.ReportProgress
引发 ProgressChanged 事件。


常用属性

1.CancellationPending
指示应用程序是否已请求取消后台操作。
只读属性,默认为 false,当执行了 CancelAsync 方法后,值为 true。

2.WorkerSupportsCancellation
指示是否支持异步取消。要执行 CancelAsync 方法,需要先设置该属性为 true。

3.WorkerReportsProgress
指示是否能报告进度。要执行 ReportProgress 方法,需要先设置该属性为 true。


常用事件
1.DoWork
调用 RunWorkerAsync 方法时发生。

2.RunWorkerCompleted
后台操作已完成、被取消或引发异常时发生。

3.ProgressChanged
调用 ReportProgress 方法时发生。



例子

private BackgroundWorker backgroundWorker = new BackgroundWorker();

private void button1_Click(object sender, EventArgs e)
{
    backgroundWorker.WorkerReportsProgress = true;
    backgroundWorker.WorkerSupportsCancellation = true;

    // 绑定执行的后台操作
    backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
    
    // 绑定后台操作完成后执行的方法
    backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
    
    // 控制进度的方法
    backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);

    // 引发 DoWork 事件,这时就是在线程中执行 backgroundWorker_DoWork 方法
    backgroundWorker.RunWorkerAsync();

    button1.Enabled = false;
}

private void button2_Click(object sender, EventArgs e)
{
    backgroundWorker.CancelAsync(); // 请求取消挂起的后台操作
}

// 这里不可以访问用户界面上的控件
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    System.Threading.Thread.Sleep(5000);

    // 报告进度,引发 ProgressChanged 事件
    backgroundWorker.ReportProgress(50); // 这里完成了50%

    if (!backgroundWorker.CancellationPending) // 判断用户是否执行了 CancelAsync 方法
    {
        System.Threading.Thread.Sleep(5000);
    }
    else
    {
        MessageBox.Show("中止了。");
    }
}

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // 这里可以访问用户界面上的控件
    button1.Enabled = true;
}

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // 一般通过 ProgressBar 类来显示进度
    MessageBox.Show(e.ProgressPercentage.ToString());

    // e.ProgressPercentage、e.UserState
}



在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
如果想在 DoWork 事件处理程序中和用户界面的控件通信,可在用 ReportProgress 方法。
ReportProgress(int percentProgress, object userState),可以传递一个对象。
ProgressChanged 事件可以从参数 ProgressChangedEventArgs 类的 UserState 属性得到这个信息对象。

简单的程序用 BackgroundWorker 比 Thread 方便,Thread 中和用户界面上的控件通信比较麻烦,需要用委托来调用控件的 Invoke 或 BeginInvoke 方法,没有 BackgroundWorker 方便。

查看全文 | 分类(C#/CSharp) | 访问(1086) | 编辑
 总数:58   页次:3/6   首 页   上一页   下一页   尾 页