首页 新闻 会员 周边

获取当前系统焦点,并模拟输入回车

0
悬赏园豆:30 [待解决问题]

A,B 两个程序,A程序是第三方提供的,B程序是自已开发的,打开A程序使A程序输入框得到焦点,B程序定义热键,按热键时从数据库读取数据落到A程序获取焦点的输入框中,并模拟回车,每当A程序重新获取焦点,再重新读取数据。

现在的问题是如何控制A程序焦点并向其输入数据。请大神指点。

ssh800的主页 ssh800 | 初学一级 | 园豆:17
提问于:2015-02-27 08:11
< >
分享
所有回答(3)
0

用windows.api唄,当然,仅仅是我的建议

_Vegetables | 园豆:586 (小虾三级) | 2015-02-27 10:03
0

先找到A的指针,然后用SetForegroundWindow提到前面,再模拟SendKey就可以了。。。

XiaoFaye | 园豆:3087 (老鸟四级) | 2015-02-27 10:04

能说的具体点吗?比如A指针怎么获取

支持(0) 反对(0) ssh800 | 园豆:17 (初学一级) | 2015-02-27 10:15

@ssh800: 

Process p = Process.GetProcessByName("A的名字");
IntPtr h = p.MainWindowHandle;

SetForegroundWindow(h);

支持(0) 反对(0) XiaoFaye | 园豆:3087 (老鸟四级) | 2015-02-27 10:32

@ssh800: 句柄也可以呀,网上找找,其实句柄就是windows的指针,用windows api 应该可以搞定你的需求了

支持(0) 反对(0) _Vegetables | 园豆:586 (小虾三级) | 2015-02-27 11:07

@XiaoFaye:  Process[] p = Process.GetProcessesByName("123.exe");
            IntPtr h = p[0].MainWindowHandle;

返回的是数组,好象不能你呢样写啊

支持(0) 反对(0) ssh800 | 园豆:17 (初学一级) | 2015-02-27 11:35

@ssh800: 

都说到这份上了你还不会,赶紧去补基础知识吧。。。

支持(0) 反对(0) XiaoFaye | 园豆:3087 (老鸟四级) | 2015-02-27 12:07

@XiaoFaye: 

Process p = Process.GetProcessByName("A的名字"); IntPtr h = p.MainWindowHandle;

SetForegroundWindow(h);

呵呵,这部份搞定了,如果这个窗口中有多个文本框,怎么使指定的文本框获取焦点,还请指教谢谢。

支持(0) 反对(0) ssh800 | 园豆:17 (初学一级) | 2015-02-28 08:31

@ssh800: 知道SPY++这个程序吗?用它的原理,找到你要的文本框,再发送一个Focus的消息就可以了。

如果文本框有相应的快捷键那更简单,直接用SendKey发送对应的快捷键就行了。

支持(0) 反对(0) XiaoFaye | 园豆:3087 (老鸟四级) | 2015-02-28 16:26
0
 1 private void Form1_Load(object sender, EventArgs e)
 2         {
 3             //注册热键Shift+S,Id号为100。HotKey.KeyModifiers.Shift也可以直接使用数字4来表示。
 4             HotKey.RegisterHotKey(Handle, 100, HotKey.KeyModifiers.Shift, Keys.S);
 5 
 6         }
 7 
 8         private void Form1_FormClosing(object sender, FormClosingEventArgs e)
 9         {
10             //注销Id号为100的热键设定
11             HotKey.UnregisterHotKey(Handle, 100);
12         }
13 
14         /// 监视Windows消息
15         /// 重载WndProc方法,用于实现热键响应
16         protected override void WndProc(ref Message m)
17         {
18             const int WM_HOTKEY = 0x0312;
19             //按快捷键 
20             switch (m.Msg)
21             {
22                 case WM_HOTKEY:
23                     switch (m.WParam.ToInt32())
24                     {
25                         case 100:    //按下的是Shift+S
26                             SendKeys.Send("aaaaaaaaaaa");
27                             //MessageBox.Show("shift+s");
28                             //此处填写快捷键响应代码         
29                             break;
30                     }
31                     break;
32             }
33             base.WndProc(ref m);
34         }
View Code
 1  class HotKey
 2     {
 3         //如果函数执行成功,返回值不为0。
 4         //如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。
 5         [DllImport("user32.dll", SetLastError = true)]
 6         public static extern bool RegisterHotKey(
 7             IntPtr hWnd,                //要定义热键的窗口的句柄
 8             int id,                     //定义热键ID(不能与其它ID重复)           
 9             KeyModifiers fsModifiers,   //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
10             Keys vk                     //定义热键的内容
11         );
12 
13         [DllImport("user32.dll", SetLastError = true)]
14         public static extern bool UnregisterHotKey(
15             IntPtr hWnd,                //要取消热键的窗口的句柄
16             int id                      //要取消热键的ID
17         );
18 
19         //定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)
20         [Flags()]
21         public enum KeyModifiers
22         {
23             None = 0,
24             Alt = 1,
25             Ctrl = 2,
26             Shift = 4,
27             WindowsKey = 8
28         }
29     }
View Code

网上找到的hotkey代码,修改了下,你可以复制到winform,运行程序,然后打开notepad之类的,按快捷键shift+s,就会自动输入aaaaa,这个给你参考。

sendkeys发送文本有很多限制,可以考虑用剪贴板,按快捷键的时候复制内容到剪贴板,并模拟ctrl+v,可以达到目的。

 

这里模拟ctrl+v也可以用这个

[DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)] public static extern void keybd_event(Keys bVk, byte bScan, uint dwFlags, uint dwExtraInfo);

jmlsaul | 园豆:247 (菜鸟二级) | 2017-09-01 16:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册