kullanarak gönderme Yerel bir C++ uygulamasına sahip olmak için, zamanının bir komut satırı dizesini ve geçerli fare imleci koordinatlarını bir WPF uygulamasına göndermesi yeterlidir. İleti gönderilir ve yalnızca iyi alınır, ancak C# 'da IntPtr
örneğini bir yapıya dönüştüremiyorum.C++ ile WPF arasındaki bir yapılandırmayı WM_COPYDATA
Bunu yapmaya çalıştığımda, uygulama ya istisnasız çökecek ya da dönüştüren kod satırı atlanacak ve döngüdeki bir sonraki ileti alındı. Bu muhtemelen ortaya çıkan yerel bir istisna olduğu anlamına gelir, ancak nedenini bilmiyorum.
İşte C++ programı. Şu an için komut satırı dizesini görmezden geliyorum ve şeylerin çalıştığından emin olmak için sahte imleç koordinatlarını kullanıyorum.
#include "stdafx.h"
#include "StackProxy.h"
#include "string"
typedef std::basic_string<WCHAR, std::char_traits<WCHAR>> wstring;
struct StackRecord
{
//wchar_t CommandLine[128];
//LPTSTR CommandLine;
//wstring CommandLine;
__int32 CursorX;
__int32 CursorY;
};
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
COPYDATASTRUCT data;
ZeroMemory(&data, sizeof(COPYDATASTRUCT));
StackRecord* record = new StackRecord();
wstring cmdLine(lpCmdLine);
//record.CommandLine = cmdLine;
record->CursorX = 5;
record->CursorY = 16;
data.dwData = 12;
data.cbData = sizeof(StackRecord);
data.lpData = record;
HWND target = FindWindow(NULL, _T("Window1"));
if(target != NULL)
{
SendMessage(target, WM_COPYDATA, (WPARAM)(HWND) target, (LPARAM)(LPVOID) &data);
}
return 0;
}
Ve bu iletiyi alan WPF uygulamasının bir parçasıdır. IF ifadesinin içindeki ikinci satır, tüm şey çökmezse, atlanır.
public IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == Interop.WM_COPYDATA)
{
var data = (Interop.CopyDataStruct)Marshal.PtrToStructure(lParam, typeof(Interop.CopyDataStruct));
var record = (Interop.StackRecord)Marshal.PtrToStructure(data.lpData, typeof(Interop.StackRecord));
MessageBox.Show(String.Format("X: {0}, Y: {1}", record.CursorX, record.CursorY));
}
return IntPtr.Zero;
}
Burada C# yapıları için tanımları bulabilirsiniz. Sürekli olarak marshalling özellikleriyle oynamış ve hiçbir yere ulaşamamıştım.
internal static class Interop
{
public static readonly int WM_COPYDATA = 0x4A;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CopyDataStruct
{
public IntPtr dwData;
public int cbData;
public IntPtr lpData;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
public struct StackRecord
{
//[MarshalAs(UnmanagedType.ByValTStr)]
//public String CommandLine;
public Int32 CursorX;
public Int32 CursorY;
}
}
Herhangi bir fikir?
, davranış aynıdır) :) geciktim. –