使用C ++,我已经花了很多时间试图解决这个问题。这段代码来自一个工作程序,我用C#重写它,但有些事情发生我不明白。
以下代码正是我按“Step Into”时运行的代码。现在如何使用包含数据的pCopyDataStruct从:: SendMessage(...)到:: OnCopyData(..)?
main.cpp
void COTP::main()
{
//string will be returned using WM_COPYDATA message
::SendMessage(hWnd, 33508, (WPARAM)GetSafeHwnd(), 11);
// WPARAM is a typedef for UINT_PTR which is an unsigned int.
}
afxwin2.inl
_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const
{ return this == NULL ? NULL : m_hWnd; }
的main.cpp
BOOL COTP::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
CString str, str2;
switch (pCopyDataStruct->dwData)
{
case JRC_COPYDATA_ID_TRACK_FILENAME:
str = (LPCTSTR)pCopyDataStruct->lpData;
break;
}
}
任何超级赞赏的帮助,我已经通过今晚所能找到的所有msdn文件,看起来好像我在某处遗漏了一些简单的东西。认为这可能是一个回调,但这似乎不对。
答案 0 :(得分:2)
代码正在向特定窗口发送消息(33508)。显然,接收窗口通过向原始WM_COPYDATA
来电中的HWND
中传递的WPARAM
发送SendMessage()
消息来处理该消息。它实际上是在实现一个回调机制。
原始消息号(33508)不是标准的Win32消息(至少不是我认识的消息),因此它可能是自定义消息。此外,它使用WM_COPYDATA
进行响应的事实表明接收窗口处于不同的进程中(即,不属于您的应用程序)。
答案 1 :(得分:1)
好吧,现在明白了。在this page和here的帮助下。以下是我目前用于C#的内容。这绝不是完成代码,但这确实有效并且有利于学习目的。
点击计算按钮,
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetActiveWindow();
private void btnCalculate_Click(object sender, EventArgs e)
{
int hwnd = 0;
hwnd = Win32.FindWindow("The App pulling from", "Window");
int s = (int)GetActiveWindow();
int s3 = Win32.SendMessage(hwnd, 33508, s, 11);
然后会发生回调并激活WndProc(参考消息m),
protected override void WndProc(ref Message m)
{
// Prevents error creating window handle message.
base.WndProc(ref m);
// WM_COPYDATA
// m.Msg = 0x4a
//msg=0x4a (WM_COPYDATA) hwnd=0x251e62 wparam=0x69063e lparam=0x1c42cca0 result=0x0
if (m.Msg == 0x4a)
{
Console.WriteLine(m);
WndProc(m.HWnd, m.Msg, m.WParam, m.LParam);
}
}
public struct CopyDataStruct : IDisposable
{
public IntPtr dwData;
public int cbData;
public IntPtr lpData;
public void Dispose()
{
if (this.lpData != IntPtr.Zero)
{
LocalFree(this.lpData);
this.lpData = IntPtr.Zero;
}
}
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public unsafe struct DataStruct
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 300)]
public string s;
public double d;
public char c;
};
protected void WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam)
{
CopyDataStruct cps = (CopyDataStruct)Marshal.PtrToStructure(lParam, typeof(CopyDataStruct));
DataStruct data = (DataStruct)Marshal.PtrToStructure(cps.lpData, typeof(DataStruct));
// data.s is what we needed.
Console.WriteLine(data.s);
}
非常感谢所有回复的人!我相信如果不是你的帮助,我会放弃。 :)