C# Winform 控件或窗体失去焦点时,获取键盘输入数据(我用winform获取另一个窗口的数据)

当我最小化winform窗口时,我想接受记事本或文本编辑器输入的数据!
当winform或其控件失去焦点时,winform中的textbox能接收到键盘输入的数据

全局键盘钩子,如下,你再把键盘钩子的数据弄到textbox就可以了。
using System;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Threading;
using System.Windows.Forms;
using System.Diagnostics;
using System.Collections.Generic;
namespace HookGlobal
{
/// <summary>
/// 这个类可以让你得到一个在运行中程序的所有键盘事件
/// 并且引发一个带KeyEventArgs和MouseEventArgs参数的.NET事件以便你很容易使用这些信息
/// </summary>
/// <remarks>
/// 修改:lihx
/// 修改时间:04.11.8
/// </remarks>
public class KeyBordHook
{
private const int WM_KEYDOWN = 0x100;
private const int WM_KEYUP = 0x101;
private const int WM_SYSKEYDOWN = 0x104;
private const int WM_SYSKEYUP = 0x105;
//全局的事件
public event KeyEventHandler OnKeyDownEvent;
public event KeyEventHandler OnKeyUpEvent;
public event KeyPressEventHandler OnKeyPressEvent;
static int hKeyboardHook = 0; //键盘钩子句柄
//鼠标常量
public const int WH_KEYBOARD_LL = 13; //keyboard hook constant
HookProc KeyboardHookProcedure; //声明键盘钩子事件类型.
//声明键盘钩子的封送结构类型
[StructLayout(LayoutKind.Sequential)]
public class KeyboardHookStruct
{
public int vkCode; //表示一个在1到254间的虚似键盘码
public int scanCode; //表示硬件扫描码
public int flags;
public int time;
public int dwExtraInfo;
}
//装置钩子的函数
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
//卸下钩子的函数
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
//下一个钩挂的函数
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
[DllImport("user32")]
public static extern int ToAscii(int uVirtKey, int uScanCode, byte[] lpbKeyState, byte[] lpwTransKey, int fuState);
[DllImport("user32")]
public static extern int GetKeyboardState(byte[] pbKeyState);
[DllImport("kernel32.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
//先前按下的键
public List<Keys> preKeys = new List<Keys>();
/// <summary>
/// 墨认的构造函数构造当前类的实例并自动的运行起来.
/// </summary>
public KeyBordHook()
{
Start();
}
//析构函数.
~KeyBordHook()
{
Stop();
}
public void Start()
{
//安装键盘钩子
if (hKeyboardHook == 0)
{
KeyboardHookProcedure = new HookProc(KeyboardHookProc);
//hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
Process curProcess = Process.GetCurrentProcess();
ProcessModule curModule = curProcess.MainModule;
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, GetModuleHandle(curModule.ModuleName), 0);
if (hKeyboardHook == 0)
{
Stop();
throw new Exception("SetWindowsHookEx ist failed.");
}
}
}
public void Stop()
{
bool retKeyboard = true;
if (hKeyboardHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
hKeyboardHook = 0;
}
//如果卸下钩子失败
if (!(retKeyboard)) throw new Exception("UnhookWindowsHookEx failed.");
}
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
if ((nCode >= 0) && (OnKeyDownEvent != null || OnKeyUpEvent != null || OnKeyPressEvent != null))
{
KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
//当有OnKeyDownEvent 或 OnKeyPressEvent不为null时,ctrl alt shift keyup时 preKeys
//中的对应的键增加
if ((OnKeyDownEvent != null || OnKeyPressEvent != null) && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
{
Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
if (IsCtrlAltShiftKeys(keyData) && preKeys.IndexOf(keyData) == -1)
{
preKeys.Add(keyData);
}
}
//引发OnKeyDownEvent
if (OnKeyDownEvent != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
{
Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
KeyEventArgs e = new KeyEventArgs(GetDownKeys(keyData));
OnKeyDownEvent(this, e);
}
//引发OnKeyPressEvent
if (OnKeyPressEvent != null && wParam == WM_KEYDOWN)
{
byte[] keyState = new byte[256];
GetKeyboardState(keyState);
byte[] inBuffer = new byte[2];
if (ToAscii(MyKeyboardHookStruct.vkCode,
MyKeyboardHookStruct.scanCode,
keyState,
inBuffer,
MyKeyboardHookStruct.flags) == 1)
{
KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]);
OnKeyPressEvent(this, e);
}
}
//当有OnKeyDownEvent 或 OnKeyPressEvent不为null时,ctrl alt shift keyup时 preKeys
//中的对应的键删除
if ((OnKeyDownEvent != null || OnKeyPressEvent != null) && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP))
{
Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
if (IsCtrlAltShiftKeys(keyData))
{
for (int i = preKeys.Count - 1; i >= 0; i--)
{
if (preKeys[i] == keyData)
{
preKeys.RemoveAt(i);
}
}
}
}
//引发OnKeyUpEvent
if (OnKeyUpEvent != null && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP))
{
Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
KeyEventArgs e = new KeyEventArgs(GetDownKeys(keyData));
OnKeyUpEvent(this, e);
}
}
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}

private Keys GetDownKeys(Keys key)
{
Keys rtnKey = Keys.None;
foreach (Keys keyTemp in preKeys)
{
switch (keyTemp)
{
case Keys.LControlKey:
case Keys.RControlKey:
rtnKey = rtnKey | Keys.Control;
break;
case Keys.LMenu:
case Keys.RMenu:
rtnKey = rtnKey | Keys.Alt;
break;
case Keys.LShiftKey:
case Keys.RShiftKey:
rtnKey = rtnKey | Keys.Shift;
break;
default:
break;
}
}
rtnKey = rtnKey | key;
return rtnKey;
}
private Boolean IsCtrlAltShiftKeys(Keys key)
{
switch (key)
{
case Keys.LControlKey:
case Keys.RControlKey:
case Keys.LMenu:
case Keys.RMenu:
case Keys.LShiftKey:
case Keys.RShiftKey:
return true;
default:
return false;
}
}
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-03-14
失去焦点的控件添加一个Validated事件
事件里面写 txtbox1.Focus()
至于获取另一个窗口的数据
首先两个窗口同个命名空间
某窗口被获取的数据用public修饰(如public int a=0)
另外一个就可以通过 form1.a
这个是我想的 - - 没有测试过 自己试试
第2个回答  2012-02-12
C# 全局键盘钩子.
第3个回答  2012-02-11
能不能说的再明白点... 有图吗
第4个回答  2012-03-01
关键词:HOOK

C# Winform 控件或窗体失去焦点时,获取键盘输入数据(我用winform获取另...
当我最小化winform窗口时,我想接受记事本或文本编辑器输入的数据!当winform或其控件失去焦点时,winform中的textbox能接收到键盘输入的数据... 当我最小化winform窗口时,我想接受记事本或文本编辑器输入的数据!当winform或其控件失去焦点时,winform中的textbox能接收到键盘输入的数据 展开  我来答 6个回答 #热...

C# Winform 关闭主窗体获取另外一个窗体button状态怎么实现?
有两个方法。1 让这按钮成为静态按钮。这需要窗体也有静态指针。public static Form2 窗体指针;public buttxxxxxxxxxx\/\/你懂的 Form2()\/\/构造函数 { 窗体指针=this;} 在form1里 Form2.窗体指针.buttxxxxxx 就能得到。2 让这个按钮在改变状态时传送信息到form1里 在 Form1里定一个public static b...

c# winform中,怎样得到另一窗体的值
(1)在Visual Studio中创建一个“Windows 窗体应用程序”项目 (2)向项目中添加Form2 (3)在Form1上布置一个Label和一个Button (4)在Form2上布置一个TextBox和一个Button (5)窗体代码Form1.cs using System;using System.Windows.Forms;namespace WindowsFormsApplication1{ public partial c...

c#中winform的webbrowser控件在窗体中如何获取按钮或者的事件?
1、在打开的ie浏览器窗口右上方点击齿轮图标,选择“Internet选项”,如下图所示:2、在打开的Internet选项窗口中,切换到安全栏,在安全选卡中点击“自定义级别”,如下图所示:3、在“安全设置-Internet 区域”界面找到“Java 小程序脚本”、“活动脚本”,并将这两个选项都选择为“禁用”,然后点击...

C#WinForm如何在点击按钮获取数据后,将数据在按钮所在窗体上显示...
根据返回的数据行,动态计算出需要增加的高度,重新设置窗体的高度。再将数据显示到表格中即可。如果数据为空,则隐藏表格。

C#如何在一个窗体中读取另一个窗体的控件的数据
你在lform1设置全局变量这样:public static listview lv=new listview();这其他地方直接form1.lv就可以访问了。还有就是你可以设置一个全局变量来保存你在form1点击的listview的值,然后再edit中直接引用就是了!form1.???不懂得可以加我! 本回答由网友推荐 举报| 答案纠错 | 评论 1 1 其他...

C#中如何在一个窗体中调用另一个窗体控件中的数据?
1、首先在窗体上增加如下的三个控件,两个label,一个button,我们要实现的效果是label1每一秒增加一个数字,label2每点击一下button增加一下数字。2、用到了定时任务,如下是两个定时任务的代码,一个是手动定时任务,就是我们点击按钮以后执行的,另一个是自动的订单是任务,程序运行以后执行的。3、...

怎样实现C#获取另一个窗体的控件值
Form1窗体 { Button点击 { Form2 f2 = new Form2();f2.an = this.TextBox1.Text; \/\/传值给Form2定义的an变量 f2.Show();} } Form1窗体 { string an = ""; \/\/定义一个变量用来接收Form1传过来的值 窗体Load方法 { this.TextBox1.Text = an; \/\/显示Form1传过来的值 }...

winform怎么获取另一窗体的控件
方法一: 把窗体的控件做为参数 ,传递到 需要的窗体中。方法二 : 委托。

如何从c#窗体中获取另一个窗体中所有控件输入的信息,一定要获取多个控件...
在另一个窗体所属的类中定义一个函数,比如:public string GetAllControlData();功能是获取当前所有控件的数据并作为字符串返回。每次需要另一个窗体的所有控件的数据时,就在本窗体中调用这个函数。假设本窗体为f1,另一个窗体为f2,则这样调用:string data=f2.GetAllControlData();

相似回答