Cześć, ma ktoś może pomysł dlaczego odebranie msg WM_COPYDATA (aplikacja WinForms, Windows 10) działa podczas uruchomienia z Visual Studio, a odpalone z EXE już nie?
0
1
na przykład dlatego że visual studio masz uruchomione z podniesionymi uprawnieniami i dane chyba nie przejdą z innej aplikacji o uprawnieniach admina do zwykłej.
Co masz w copy data? W jaki sposób odbierasz? Jak definiujesz strukturę? Być może masz błąd w strukturze i zadziała tylko na 32/64 bitach
0
Próbowałem podnosić uprawnienia, sprawdzałem 32/64 bit, skończyły mi się pomysły.
0
Msg akurat jest przez plugin pythona:
import os
import ctypes
from ctypes import wintypes
WM_COPYDATA = 0x4a
def sendM(msg):
try:
FindWindow = ctypes.windll.user32.FindWindowW
hwnd = FindWindow(None,"PLUGIN")
if (hwnd==0):
return False
sender_hwnd = 0
buf = ctypes.create_string_buffer(bytes(msg,encoding='utf-8'))
copydata = COPYDATASTRUCT()
copydata.dwData = 2
copydata.cbData = buf._length_
copydata.lpData = ctypes.cast(buf, ctypes.c_void_p)
ctypes.windll.user32.SendMessageA(hwnd, WM_COPYDATA, sender_hwnd,ctypes.byref(copydata))
return True
except:
return False
class COPYDATASTRUCT(ctypes.Structure):
_fields_ = [('dwData', ctypes.c_ulonglong),
('cbData', ctypes.wintypes.DWORD),
('lpData', ctypes.c_void_p)]
C#:
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
public struct COPYDATASTRUCT
{
public uint dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_COPYDATA)
{
COPYDATASTRUCT copyData = (COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(COPYDATASTRUCT));
int dataType = (int)copyData.dwData;
if (dataType == 2)
{
string msg = copyData.lpData;
Console.WriteLine(msg);
}
else
{
MessageBox.Show(String.Format("Unrecognized data type = {0}.", dataType), "HMI", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
base.WndProc(ref m);
}
}