【问题标题】:Cannot output cursor location to debug string (WIN32)无法将光标位置输出到调试字符串 (WIN32)
【发布时间】:2016-11-17 20:16:13
【问题描述】:

由于某种原因,当我尝试使用以下代码在给定的 WIN32 窗口中输出鼠标光标的位置时:

//Global Variable
POINT cursorLocation;

// Win32 Windowing subsystem code redacted

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){

cursorLocation.x = GET_X_LPARAM(lParam);
cursorLocation.y = GET_Y_LPARAM(lParam);

 switch(message){
   case WM_MOUSEMOVE:
   // mouse movement handle
   OutputDebugString(cursorLocation.x + "," + cursorLocation.y);
   OutputDebugString("\n");
   // WM_MOUSEMOVE break
   break;
 }
}

现在,当我运行程序并移动鼠标时,控制台会记录以下文本:

较小的数据类型导致数据丢失。
如果这是故意的,您应该使用适当的位掩码来掩盖演员表的来源。
例如:char c = (i & 0xFF);
以这种方式更改代码不会影响生成的优化代码的质量。

我什至尝试将传递给OutputDebugString 的变量类型转换为LONG,因为那是POINT 类中变量的类型并且没有区别。

有谁知道如何将值通过GET_X_LPARAMGET_Y_LPARAM 传递到调试控制台? 谢谢。

【问题讨论】:

    标签: c++ winapi win32gui


    【解决方案1】:

    这不是字符串连接,而是将.x.y添加到指向","的指针中:

    cursorLocation.x + "," + cursorLocation.y
    

    请尝试例如:

    char s[256];
    sprintf_s(s, "%d,%d", cursorLocation.x, cursorLocation.y);
    OutputDebugStringA(s); // added 'A' after @IInspectable's comment, but
                           // using UNICODE and wchar_t might be better indeed                    
    

    【讨论】:

    • 完美运行。谢谢。我一直在语言之间来回切换,并没有注意到这是一个问题。
    • @xec86:如果它对您有用,则说明您使用了错误的编译器设置。绝对没有理由使用 ANSI 字符编码。所有 Windows 代码都应使用 Unicode 编写,方法是调用所有使用或生成字符串的 API 的宽字符版本,从 char 切换到 wchar_t,并在所有字符串文字前加上 L。一旦您在命令行 (/DUNICODE /D_UNICODE) 上定义了 UNICODE_UNICODE 预处理器符号,您的编译器就会将您指向需要注意的位置。
    • 感谢您的提示。我想知道为什么我保存的一些代码 sn-ps 中的前置 L 不起作用。
    • @IInspectable 谢谢,为了正确起见,我强制执行 ANSI。虽然“绝对没有任何理由使用 ANSI”对我来说听起来有点过于强烈,但我同意 UNICODE 通常是更好的选择。
    • @AlexD:Windows 的原生字符编码是 UTF-16LE。绝对没有任何理由浪费从 ANSI 到 UTF-16 并为每个 API 调用转换回来的时钟周期。使用 ANSI 编码(除了与遗留代码交互)没有任何好处。
    【解决方案2】:

    字符串连接不适用于整数。 尝试使用std::ostringstream

    std::ostringstream out_stream;
    out_stream << cursorLocation.x << ", " << cursorLocation.y;
    OuputDebugString(out_stream.str().c_str());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多