2010-08-21 90 views
1
int x = 5; 
int y = 10; 

y = y << 16; 
int coord = x | y; 

NativeMethods.SendMessage(hwnd, WM_LBUTTONDOWN, new IntPtr(0), new IntPtr(coord)); 
NativeMethods.SendMessage(hwnd, WM_LBUTTONUP, new IntPtr(0), new IntPtr(coord)); 

使用上述代码(ref:MSDN),我可以在外部应用程序的datagridview中选择一行。我想知道如何发送一个ctrl-a和ctrl-c到相同的datagridview。Windows API和SendMessage()

仍尝试连接为什么x和y变量初始化为5,10,并且为什么y左移了16,然后|与x。

+0

您是否在勾选此“外部”应用?或者你有所有的源代码?引用外部Windows窗体应用程序的 – JustBoo 2010-08-21 22:15:24

+0

。 – Gooose 2010-08-21 22:40:05

回答

1

这个什么:

SendMessage(hwnd, WM_KEYDOWN, VK_CTRL, 0); 
SendMessage(hwnd, WM_KEYDOWN, 0x43, 0); 
// Ctrl and C keys are both pressed. 
SendMessage(hwnd, WM_KEYUP, 0x43, 0); 
SendMessage(hwnd, WM_KEYUP, VK_CTRL, 0); 

0x43是C键(见http://msdn.microsoft.com/en-us/library/dd375731(v=VS.85).aspx


编辑:如果它不工作,尝试发送WM_COPY,这应该是一个更好的主意。

SendMessage(hwnd, WM_COPY, 0, 0); 
+0

谢谢。现在测试它。 – Gooose 2010-08-21 22:23:47

+0

没有运气。我尝试了以下 SendMessage(hwnd,WM_KEYDOWN,new IntPtr(VK_CTRL),new IntPtr(0)); SendMessage(hwnd,WM_KEYDOWN,new IntPtr(0x43),new IntPtr(0)); SendMessage(hwnd,WM_KEYDOWN,new IntPtr(0x43),new IntPtr(0)); SendMessage(hwnd,WM_KEYDOWN,new IntPtr(VK_CTRL),new IntPtr(0)); 我可以看到所选的行,但是当我在记事本中做一个ctrl-v时,我没有看到复制的文本 – Gooose 2010-08-21 22:39:04

+0

我编辑了我的答案,我刚刚在MSDN上遇到了'WM_COPY',试试这个。 – 2010-08-21 23:12:38

1

您实际上可能需要Windows Subclassing。请注意,这不是C++子类。

这种技术将消息从一个特定的Window Procedure(WndProc)发送到另一个WndProc,从而实现你想要的东西。

一旦安装它就可以工作。 MSDN很重视这些信息,因此将上面的链接作为教程。

更多信息:

Subclassing Controls - MSDN

ActiveX Controls: Subclassing a Windows Control

** Subclassing Windows Forms Controls可能是最恰当的。

+0

谢谢。 1001 :-) – JustBoo 2010-08-22 22:52:24

0

“Windows Hooking”的其他链接。这是一种在外部应用程序中挂钩或捕获消息和事件的技术。

Hooking

EasyHook

MSDN Hooks很好的概述。

HTH