使用指针的话,请用 unsafe关键字,指标编译器以下是非托管代码.使用windows消息,刚对窗口的WinProc方法进行重载。相关资料可以在CDDN上查到很多。
解决方案 »
- web刷新如何保持socket?
- 求C#调用打印机和调用PRODEDURE的工具类
- 高手帮忙:多线程致使工具自动关闭,运行十几个小时候后无缘由无错误的就关了
- 正则问题请教 限制字符长度与最小匹配
- 不使用FindControls,查找TemplateColumn里面的控件!
- 2个winform,如何实现从form1到form2中textbox值的传递
- treeView的接点问题
- 两种初始化方式的不同?
- 字符串的问题
- 请教学习用的简单一点服务端的框架源码
- 各位大虾:已经将xml文件导入到dataset中.如何将该dataset数据导入到数据库对应表中
- 为什么不能引用System.Windows.Forms?
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long这些够用了吧?呵呵不过,VB 和C# 如果你是在选择那当然是C#,VB之所以有市场是因为它编程快,但现在C# 更快,又有大量VB不能做的,何乐而不为之?
重载WinProc方法即可。
Option Explicit' --------- command : --------- 阿利 01.9.7
'
' Call enHotKey(Me.hwnd, ID, KeyString)
' Call deHotKey(Me.hwnd, ID)
'
' ID可随便取,deHotKey 的ID 需与enHotKey 的ID 相同
' 例:Call enHotKey(Me.hwnd, 1, "M") 则设置为附加键+M
'Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As LongPrivate Const WM_HOTKEY = &H312
Private Const MOD_ALT = &H1
Private Const MOD_CONTROL = &H2
Private Const MOD_SHIFT = &H4
Private Const GWL_WNDPROC = (-4)Private HotKeyHasRead As Boolean
Private preWinProc As Long
Private Modifiers As LongPrivate Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_HOTKEY Then Call HotKeyPoc(wParam) '将之送往原来的Window Procedure
wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End FunctionPrivate Sub StartHotKey(ByVal Obj As Long)
preWinProc = GetWindowLong(Obj, GWL_WNDPROC)
Obj = SetWindowLong(Obj, GWL_WNDPROC, AddressOf wndproc)
'定义组合键
Modifiers = MOD_CONTROL
HotKeyHasRead = True
End SubPrivate Sub EndHotKey(ByVal Obj As Long)
Obj = SetWindowLong(Obj, GWL_WNDPROC, preWinProc)
HotKeyHasRead = False
End SubPublic Sub enHotKey(ByVal Obj As Long, ObjNo As Integer, ObjKey As String)
If ObjKey <> "" Then
If Not HotKeyHasRead Then Call StartHotKey(Obj)
Obj = RegisterHotKey(Obj, ObjNo, Modifiers, Asc(ObjKey))
End If
End SubPublic Sub deHotKey(ByVal Obj As Long, ObjNo As Integer)
Dim ret As Long
'取消Message的截取,而使之又只送往原来的Window Procedure
Call UnregisterHotKey(Obj, ObjNo)
End SubPublic Sub chkUserEndHotKey(ByVal Obj As Long)
With fm_Main
If .chk_hk_1 = 0 And .chk_hk_2 = 0 Then
Call EndHotKey(Obj)
End If
End With
End SubPublic Sub PrjQuitDeKey(ByVal Obj As Long, ByVal MaxHotKeyID As Long)
Dim i As Integer
For i = 1 To MaxHotKeyID
Call deHotKey(Obj, i)
Next
Call EndHotKey(Obj)
End SubPublic Sub HotKeyPoc(ObjKey As Long).....
他们都可以直接调用API,那还有什么作不到的!
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;class DynamicJumpTableDemo{ public static Type BuildMyType()
{
AppDomain myDomain = Thread.GetDomain();
AssemblyName myAsmName = new AssemblyName();
myAsmName.Name = "MyDynamicAssembly"; AssemblyBuilder myAsmBuilder = myDomain.DefineDynamicAssembly(
myAsmName,
AssemblyBuilderAccess.Run);
ModuleBuilder myModBuilder = myAsmBuilder.DefineDynamicModule(
"MyJumpTableDemo"); TypeBuilder myTypeBuilder = myModBuilder.DefineType("JumpTableDemo",
TypeAttributes.Public);
MethodBuilder myMthdBuilder = myTypeBuilder.DefineMethod("SwitchMe",
MethodAttributes.Public |
MethodAttributes.Static,
typeof(string),
new Type[] {typeof(int)}); ILGenerator myIL = myMthdBuilder.GetILGenerator(); Label defaultCase = myIL.DefineLabel();
Label endOfMethod = myIL.DefineLabel(); Label[] jumpTable = new Label[] { myIL.DefineLabel(),
myIL.DefineLabel(),
myIL.DefineLabel(),
myIL.DefineLabel(),
myIL.DefineLabel() }; myIL.Emit(OpCodes.Ldarg_0); //Ldarg_0 作用是将索引为 0 的参数加载到计算堆栈上
myIL.Emit(OpCodes.Switch, jumpTable);
....这就是IL 的汇编语言用法,你参考一下 OpCodes 类就知道了,指针与之相比呵呵