中获取字符串我想解码从qCollector返回的消息。如何从已注册的窗口消息的lParam
http://www.mechtrading.com/developers/QCollectorDeveloperGuide_2.1.htm
在我的WndProc似乎收到了应有的lParam为一个字符串的消息,但它看起来像一个整数。也许它是一个指针?
我试过使用Marshal.PtrToStringAnsi(m.LParam))(见下面)但它没有任何变化给我一个非空的字符串。
Output:
50483: QCOLLECTOR_CLIENT_PORTFOLIO_LIST_REQUEST
50484: QCOLLECTOR_PORTFOLIO_LIST_REQUEST_COMPLETE
50485: QCOLLECTOR_CLIENT_DATA_REQUEST
50486: QCOLLECTOR_DATA_REQUEST_COMPLETE
50487: QCOLLECTOR_CLIENT_REALTIME_SYMBOL_LIST_REQUEST
50488: QCOLLECTOR_REALTIME_SYMBOL_LIST_REQUEST_COMPLETE
50489: QCOLLECTOR_CLIENT_PORTFOLIO_ITEMS_REQUEST
50490: QCOLLECTOR_PORTFOLIO_ITEMS_REQUEST_COMPLETE
50491: QCOLLECTOR_CLIENT_REMOVE_REALTIME_SYMBOL_REQUEST
50492: QCOLLECTOR_CLIENT_CLEAR_REALTIME_SYMBOLS
50493: QCOLLECTOR_LAST_RECORD_UPDATE
50494: QCOLLECTOR_REGISTER_FOR_LAST_RECORD_UPDATE
50495: QCOLLECTOR_UNREGISTER_FOR_LAST_RECORD_UPDATE
50496: QCOLLECTOR_FILE_UPDATE
50497: QCOLLECTOR_ALL_FILES_UPDATED
50498: QCOLLECTOR_REGISTER_FOR_FILE_UPDATES
50499: QCOLLECTOR_UNREGISTER_FOR_FILE_UPDATES
50501: QCOLLECTOR_DELETE_PORTFOLIO_ITEM
SENT to: 13381044 From: 2438012 2438012
Ans: 1
Message:
HWnd: 2438012
LParam: 49440
WParam: 0
Msg: 50484
String:
如果您创建一个简单的表单应用程序有一个按钮,然后使用此代码:
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace ApiMessageTest2
{
public partial class Form1 : Form
{
[DllImport("user32.dll", EntryPoint = "FindWindow")]
private static extern int FindWindow(string sClass, string sWindow);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern uint RegisterWindowMessage(string lpString);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
TestQC();
}
int nWinHandle;
bool msgSent = false;
List<string> AtomsList = new List<string> {
"QCOLLECTOR_CLIENT_DATA_REQUEST",
"QCOLLECTOR_CLIENT_PORTFOLIO_LIST_REQUEST",
"QCOLLECTOR_PORTFOLIO_LIST_REQUEST_COMPLETE",
"QCOLLECTOR_CLIENT_PORTFOLIO_ITEMS_REQUEST",
"QCOLLECTOR_PORTFOLIO_ITEMS_REQUEST_COMPLETE",
"QCOLLECTOR_CLIENT_REALTIME_SYMBOL_LIST_REQUEST",
"QCOLLECTOR_REALTIME_SYMBOL_LIST_REQUEST_COMPLETE",
"QCOLLECTOR_DATA_REQUEST_COMPLETE",
"QCOLLECTOR_CLIENT_REMOVE_REALTIME_SYMBOL_REQUEST",
"QCOLLECTOR_DELETE_PORTFOLIO_ITEM",
"QCOLLECTOR_CLIENT_CLEAR_REALTIME_SYMBOLS",
"QCOLLECTOR_REGISTER_FOR_FILE_UPDATES",
"QCOLLECTOR_UNREGISTER_FOR_FILE_UPDATES",
"QCOLLECTOR_FILE_UPDATE",
"QCOLLECTOR_ALL_FILES_UPDATED",
"QCOLLECTOR_REGISTER_FOR_LAST_RECORD_UPDATE",
"QCOLLECTOR_UNREGISTER_FOR_LAST_RECORD_UPDATE",
"QCOLLECTOR_LAST_RECORD_UPDATE"};
Dictionary<string, uint> Atoms = new Dictionary<string, uint>();
public void RegisterAtoms()
{
foreach (var atom in AtomsList)
{
Atoms.Add(atom, RegisterWindowMessage(atom));
}
}
public void ShowAtoms()
{
var sortedAtoms = Atoms.OrderBy(x => x.Value);
foreach (var pair in sortedAtoms)
{
Console.WriteLine(pair.Value.ToString() + ": " + pair.Key);
}
}
public void TestQC()
{
RegisterAtoms();
ShowAtoms();
System.Diagnostics.Process proc = Process.GetCurrentProcess();
try
{
nWinHandle = FindWindow("QCDataInterfaceWndClass", null);
}
catch (Exception err)
{
throw;
}
if (nWinHandle == 0)
{
throw new Exception("Duff");
}
msgSent = true;
int ans = SendMessage((IntPtr)nWinHandle, Atoms["QCOLLECTOR_CLIENT_PORTFOLIO_LIST_REQUEST"], IntPtr.Zero, this.Handle);
Console.WriteLine("SENT to: " + nWinHandle + " From: " + proc.MainWindowHandle + " " + this.Handle);
Console.WriteLine("Ans: "+ans);
}
protected override void WndProc(ref Message m)
{
if (msgSent)
{
if (Atoms.ContainsValue((uint)m.Msg) || m.LParam == new IntPtr(nWinHandle))
{
Console.WriteLine("HWnd: " + m.HWnd.ToString());
Console.WriteLine("LParam: " + m.LParam.ToString());
Console.WriteLine("WParam: " + m.WParam.ToString());
Console.WriteLine("Msg: " + m.Msg.ToString());
Console.WriteLine("String: " + Marshal.PtrToStringAnsi(m.LParam));
}
}
base.WndProc(ref m);
}
}
}
哪个消息具体? – IInspectable
@IInspectable我会将它添加到问题 – ManInMoon
是的,它是一个整数,一个* atom *。你必须[捏住这个](http:// pinvoke。net/default.aspx/kernel32/GlobalGetAtomName.html)来获取与之关联的字符串。 –