C#句柄使用

原文:C#句柄使用

调用 API 函数 SendMessage 发送 WM_CLOSE 消息。

DllImport("User32.dll",EntryPoint="SendMessage")] 

private static extern int SendMessage( int
hWnd,int Msg,int wParam,int lParam);

const int WM_CLOSE = 0x10;
SendMessage(那个程序的窗口句柄, WM_CLOSE, 0, 0);

可以用 IntPtr 代替 int 数据类型

 

 

在Visual C# 2005中如何实现窗口任意处移动窗口

首先,要用到一个WimdowsAPI函数,因此必须引入
using System.Runtime.InteropServices;
命名空间;

然后,这里有两种方法,一种使用API, 一种不用,重写WndProc窗口过程的方式不需要API函数。另一个方法需要两个:
SendMessage 像指定窗口过程发送消息
ReleaseCapture 释放鼠标捕获

最后是一些必要的常数声明,这些声明可以在MSDN或者CPP头文件中找到:
private const int WM_SYSCOMMAND = 0x0112;//点击窗口左上角那个图标时的系统信息
private const int SC_MOVE = 0xF010;//移动信息
private const int HTCAPTION = 0x0002;//表示鼠标在窗口标题栏时的系统信息
private const int WM_NCHITTEST =
0x84;//鼠标在窗体客户区(除了标题栏和边框以外的部分)时发送的消息
private const int HTCLIENT = 0x1;//表示鼠标在窗口客户区的系统消息
private const int SC_MAXIMIZE = 0xF030;//最大化信息
private const int SC_MINIMIZE = 0xF020;//最小化信息

Here we go。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsApplicationTestNoBoarderAndMove
{
    public
partial class Form1 : Form
    {
       
public Form1()
       
{
           
InitializeComponent();
       
}

       
[DllImport("user32.dll")]
       
public static extern bool ReleaseCapture();

       
[DllImport("user32.dll")]
       
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int
wParam, int lParam);

       
private const int WM_SYSCOMMAND = 0x0112;//点击窗口左上角那个图标时的系统信息
       
private const int SC_MOVE = 0xF010;//移动信息
       
private const int HTCAPTION = 0x0002;//表示鼠标在窗口标题栏时的系统信息
       
private const int WM_NCHITTEST =
0x84;//鼠标在窗体客户区(除了标题栏和边框以外的部分)时发送的消息
       
private const int HTCLIENT = 0x1;//表示鼠标在窗口客户区的系统消息
       
private const int SC_MAXIMIZE = 0xF030;//最大化信息
       
private const int SC_MINIMIZE = 0xF020;//最小化信息

       
private void closeToolStripMenuItem_Click(object sender, EventArgs
e)
       
{
           
Application.Exit();
       
}

       
//下面的代码我用//注释了一下,这是两种实现方法

       
//private void Form1_MouseDown(object sender, MouseEventArgs
e)
       
//{
       
//   
ReleaseCapture();//首先释放鼠标焦点捕获,这样就不会再发出WM_NCHITTEST消息
       
//   
SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION,
0);//然后向当前窗体发送消息,消息是移动+表示鼠标在标题栏上
       
//}

       
//如果用这种重写的方法,就把上面的部分注释掉……

       

       
protected override void WndProc(ref Message m)
       
{
           
switch (m.Msg)
           
{
               
case WM_SYSCOMMAND:
                   
if (m.WParam == (IntPtr)SC_MAXIMIZE)
                   
{
                       
m.WParam = (IntPtr)SC_MINIMIZE;
                   
}
                   
break;
               
case WM_NCHITTEST:
//如果鼠标移动或单击                 

                   
base.WndProc(ref m);//调用基类的窗口过程——WndProc方法处理这个消息
                   
if (m.Result == (IntPtr)HTCLIENT)//如果返回的是HTCLIENT
                   
{
                       
m.Result = (IntPtr)HTCAPTION;//把它改为HTCAPTION
                       
return;//直接返回退出方法
                   
}
                   
break;
           
}
           
base.WndProc(ref m);//如果不是鼠标移动或单击消息就调用基类的窗口过程进行处理
       
}

       
//用后面这个重写的方法有个问题~~~
       
//你猜,如果你在窗体上双击鼠标,会发生什么?呵呵,窗体会最大化……
    }
}

时间: 2024-10-02 13:24:22

C#句柄使用的相关文章

oracle-OCI连接Oracle调用OCISessionBegin失败:ORA-24314: 未初始化服务句柄

问题描述 OCI连接Oracle调用OCISessionBegin失败:ORA-24314: 未初始化服务句柄 OCI连接Oracle数据库的时候,建立会话连接OCISessionBegin就失败:Error code为:ORA-24314: 未初始化服务句柄.而使用PL/SQL Developer连接Oracle就可以,进去PL/SQL Developer里面也可以执行SQL语句. 解决方案 小弟是小白,刚看C++如何操作Oracle,看网博上有那么一段代码就整下来试试,没什么经验,严重被打击

关于动态生成控件和动态获得控件的句柄值

动态|控件 从问题者的发的贴子:help me里面需要动态获得控件的句柄值,这些日子在vs.net里试了一下,总结出一点点经验,如下:1.动态生成控件:不管是在asp.net里还是在windows application里,每一个控件都可以作为母控件,在其中添加一些子的控件,当然添加可以是手工添加进去,而动态添加控件一般如下:(asp.net中)         dim textbox as textbox       '动态添加一个textbox控件        textbox=new te

用句柄操纵对象

每种编程语言都有自己的数据处理方式.有些时候,程序员必须时刻留意准备处理的是什么类型.您曾利用一些特殊语法直接操作过对象,或处理过一些间接表示的对象吗(C或C++里的指针)? 所有这些在Java里都得到了简化,任何东西都可看作对象.因此,我们可采用一种统一的语法,任何地方均可照搬不误.但要注意,尽管将一切都"看作"对象,但操纵的标识符实际是指向一个对象的"句柄"(Handle).在其他Java参考书里,还可看到有的人将其称作一个"引用",甚至一个

传递句柄

将句柄传递进入一个方法时,指向的仍然是相同的对象.一个简单的实验可以证明这一点(若执行这个程序时有麻烦,请参考第3章3.1.2小节"赋值"):   //: PassHandles.java // Passing handles around package c12; public class PassHandles { static void f(PassHandles h) { System.out.println("h inside f(): " + h); }

Effective C#原则35:选择重写函数而不是使用事件句柄

很多.Net类提供了两种不同的方法来控制一些系统的事件.那就是,要么添 加一个事件句柄:要么重写基类的虚函数.为什么要提供两个方法来完成同样的 事情呢?其实很简单,那就是因为不同的情况下要调用为的方法.在派生类的内 部,你应该总是重写虚函数.而对于你的用户,则应该限制他们只使用句柄来响 应一些不相关的对象上的事件. 例如你很了一个很不错的Windows应用程 序,它要响应鼠标点下的事件.在你的窗体类中,你可以选择重写OnMouseDown ()方法: public class MyForm :

Win7玩英雄联盟出现句柄无效怎么解决

  Win7玩英雄联盟出现句柄无效的解决方法. 步骤如下: 处理方法:此警告音是否由于安装了第三方软件后提示的,如果是建议卸载掉不要使用,或查看是不是游戏本身遇到了问题,可以卸载重新下载安装. 系统不能加载用户配置, 但能加载默认配置. "句柄无效"通常是编程的错误,但你的情况显然不可能是编程的问题,应该是丢失或更改了某些系统文件.我猜可能是你的dircetx错误,或者是丢失了某些动态连接库的DLL文件.你重新下载一个directx9.0c,安装试试.如果还不行,就重装操作系统,这样做

Win 7关联句柄轻松删除“正在使用文件”

  相信大家经常会对文件.文件夹执行删除操作,这本是一件很简单的事,但有些时候却会遇到麻烦,系统提示文件或文件夹不能删除.诸如:"文件正在使用"."操作无法完成,因为文件已在###中打开"等. 此时,如果在重启系统后,仍然因为同样的原因而无法删除需要删除的文件资源,大家也许会在网上去找一些文件删除工具来达到删除的目的.其实,如果你使用的是Win7操作系统的话,那么无须使用额外的工具即可完成被占用文件资源的删除工作,步骤如下: 先在开始菜单的搜索对话框中输入"

window操作系统下的句柄机制说明

  WORKAREA_ADDRESS(这个字段在V$SQL_WORKAREA_ACTIVE和V$SQL_WORKAREA 中都有),表示Address of the work area handle,也就是说,它是SQL工作区域这个对象的句柄(相当于是该对象在oracle系统级别上的一个标识符(identity),类似,一个人,在中国范围内,有一个唯一的区别于别人的身份证号.也类似锁是对象的中介一样.是一种表示地址的句柄)的值.Each SQL statement stored in the s

如何获得已打开目录的目录句柄?

问题描述 如何获得已打开目录的目录句柄? 我想用ReadDirectoryChangesW()来获取文件操作信息,但是其中的一个参数是监控目录的句柄,都说用createfile函数来得到目录的句柄,但是如果是已经用鼠标打开的目录,又该怎样获得其句柄呢? 解决方案 你用CreateFile()一样可以获取到对应的句柄,用共享读的方式等,用鼠标打开,不会影响

文件句柄-如何通过一个打开的文件夹句柄获得文件夹的完整路径

问题描述 如何通过一个打开的文件夹句柄获得文件夹的完整路径 我在msdn上看到了一个例子,可以从一个打开的文件句柄获取到文件名,但是 那种方法对于文件夹的句柄是没有用的,msdn示例的链接地址:http://msdn.microsoft.com/zh-cn/library/windows/desktop/aa366789(v=vs.85).aspx 我期望能够从一个文件夹句柄得到该文件夹的完成路径,不知道谁可以帮助我! 解决方案 问题已解决,使用NtQueryObject()解决的. 解决方案二