小编Joa*_*ira的帖子

我无法理解如何使用SendMessage或PostMessage调用

我需要在第三方应用程序中模拟按键.假设我有一个需要向Calculator应用程序发送"8"的C#应用​​程序.我不能使用.Net的SendKeys或win32 api的keybd_event,因为它们都要求窗口是最活跃的窗口,这在我的情况下不是这种情况.

这样我就可以调用sendMessage和postMessage.我在过去的三个小时里一直试图获得一些结果,但现在我完全没有希望了.

我有以下内容:

        [DllImport("user32.dll")]
    public static extern int FindWindow(string lpClassName,string lpWindowName);
    [DllImport("user32.dll")]
    public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

    [return: MarshalAs(UnmanagedType.Bool)]
    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool PostMessage(int hWnd, uint Msg, int wParam, int lParam);

    private void button1_Click(object sender, EventArgs e)
    {
        const int WM_KEYDOWN = 0x100;
        const int WM_SYSCOMMAND = 0x018;
        const int SC_CLOSE = 0x053;

        int WindowToFind = FindWindow(null,"Calculator");

        int result = SendMessage(WindowToFind, WM_SYSCOMMAND, SC_CLOSE, 0);
        Boolean result2 = PostMessage(WindowToFind, …
Run Code Online (Sandbox Code Playgroud)

c# postmessage keypress handler sendmessage

7
推荐指数
1
解决办法
4万
查看次数

当我通过tcp发送数据包时,它被分成两个数据包

我正在使用服务器 - 客户端模型在C#中开发应用程序,其中服务器将带有位图的字节数组发送到客户端,客户端将其加载到屏幕中,向服务器发送"OK",然后服务器发送另一个图像,等等.

图像缓冲区的长度变化,通常在60kb到90kb之间,但我看到它并不重要.如果我将客户端和服务器放在同一台计算机上,使用localhost,一切正常.服务器执行beginSend,客户端执行endReceive并传输整个缓冲区.

但是,我现在正在无线网络中对此进行测试,结果如下:

  • 服务器发送图像.
  • 调用客户端上的回调函数data_received,但只读取1460个字节(MTU - 为什么?不应该只在UDP中?)
  • 再次调用客户端上的回调函数data_received,现在使用缓冲区的其余部分(1000字节或100千字节)...

总是这样,收到第一个包含1460字节的数据包,然后第二个数据包包含其余数据包.

我可以通过加入收到的两个字节数组来解决这个问题,但这似乎不对.我甚至不确定为什么会这样.这是对网络的一些限制吗?为什么C#不等待传输整个数据?我的意思是,它是TCP,我不应该担心它,对吧?

无论如何,任何帮助都会很棒!
干杯

c# tcp packets mtu

6
推荐指数
2
解决办法
6074
查看次数

标签 统计

c# ×2

handler ×1

keypress ×1

mtu ×1

packets ×1

postmessage ×1

sendmessage ×1

tcp ×1