- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想我的问题相当普遍:当第二个实例运行时在我的应用程序的第一个实例中打开一个文件(例如,通过在资源管理器中打开一个关联的文件)。
我在 Windows 上实现它的方法是使用 SendMessage
Win API 并通过在 Qt 窗口中重新实现 winEvent 来接收消息。这在 Qt4 上运行良好。但出于某种原因,在我将我的应用程序更新到 Qt 5 后它完全停止工作。
我已经编写了一个重现该行为的最小测试(见下文):在 Qt 4 上也很好,但在 Qt 5 上不起作用(未收到消息)。我正在使用 mingw32
(gcc
) 以防它有什么不同。我对 Windows API 非常不熟悉,所以如果有人能解释这种奇怪的行为,我会很高兴。
非常感谢!
服务器.c:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winuser.h>
#include <windef.h>
#include <QApplication>
#include <QLabel>
#include <QDialog>
#include "winmessagelistener.h"
bool WinMessageListener::winEvent( MSG* message, long* result ) {
if( message->message == WM_COPYDATA ) {
label->setText( "Message!" );
// We process the event here
*result = 0;
return true;
}
else {
// Give the event to qt
return false;
}
}
WinMessageListener::WinMessageListener() : QDialog() {
setWindowTitle( "blah" );
label = new QLabel( this );
label->setText("no message");
}
int main(int argc, char **argv) {
QApplication app (argc, argv);
WinMessageListener listener;
listener.show();
return app.exec();
}
winmessagelistener.h:
#include <QDialog>
#include <QLabel>
class WinMessageListener : public QDialog {
Q_OBJECT
public:
WinMessageListener();
private:
// Override the default event message
bool winEvent( MSG* message, long* result );
QLabel* label;
};
客户端.c:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winuser.h>
#include <windef.h>
#include <iostream>
#include <QString>
const QString WINDOW_TITLE = "blah";
int main(int argc, char **argv) {
LPCWSTR window_title = (LPCWSTR) WINDOW_TITLE.utf16();
HWND window_handle_ = FindWindow( NULL, window_title );
std::cerr << "Window handle = " << window_handle_ << std::endl;
COPYDATASTRUCT data = { 0, 0, 0 };
SendMessage( window_handle_, WM_COPYDATA, 0, (LPARAM) &data );
}
最佳答案
由于答案比评论更能帮助他人,所以在这里。问题是在 Qt5 中,函数 bool QWidget::winEvent(MSG * message, long * result)
不再可用。它已被函数 bool QWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)
取代,如 documentation 中所述:
Note: This function superseedes the event filter functions x11Event(), winEvent() and macEvent() of Qt 4.
请注意,以更一般的方式,正如@Paul R. 在评论中所说,不要忘记使用宏 Q_DECL_OVERRIDE为了让编译器在你重写虚函数什么都不做的情况下产生错误。在那种情况下,它可以像这样使用:
bool WinMessageListener::winEvent(MSG * message, long * result) Q_DECL_OVERRIDE;
注意:这是一个 C++11 上下文关键字,因此如果您想使用它,您的编译器需要支持 C++11。如果您没有使用支持 C++11 的编译器,您将得不到任何诊断。
关于c++ - 在 Windows 和 Qt5 上使用 SendMessage 进行进程间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36796216/
我正在编写 google chrome 扩展程序,并尝试将信息从注入(inject)网页的一段代码发送到我的内容脚本。 根据 http://developer.chrome.com/extension
我正在使用 websockets 和 Jetty 7.1.6.v20100715。 我有几个问题,主要是因为缺乏有关这些方法的信息/解释。 1st)sendMessage(字节帧,字符串数据)中的字节
我正在尝试调试我的 Windows 安装问题。细节并不特别重要,但我正在寻找以下问题的答案: explorer.exe receives a WM_SETTINGCHANGE message. In
我试图了解转换十六进制整数(十进制)和 IntrPtr 的规则是什么。 我在某处读到它应该代表“更高的内存”或类似的东西。 如果有人能向我解释一下,那就太好了。 但实际上它只是关于以下内容: 我想用S
我遇到了一个问题,即 SendMessage() 函数导致脚本挂起并因此永远不会退出,尽管它正在像它应该的那样运行 SendMessage(它的任务完成)。有没有办法解决这个问题,因为我有一段时间从主
我使用 InnoSetup 在注册表中设置环境变量: [Registry] Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session
我试图理解 SendMessage 函数,这是我的实际代码: [DllImport("user32.dll")] public static extern IntPtr SendMessage(Int
我正在将 Eclipse 与 ADT 结合使用,并且正在学习本教程:http://developer.android.com/training/basics/firstapp/starting-act
在使用 C++ 时,我已经花了很多时间试图解决这个问题。这段代码来自一个工作程序,我正在用 C# 重写它,但发生了一些我不明白的事情。 下面的代码正是我按下“Step Into”时运行的代码。现在使用
不确定为什么 SendMessage 没有从我需要的类中获取文本。我以前做过,但它是 VisualBasic,我想将它移植到 C++。我没有在任何其他程序上尝试过此代码。我正在阅读一些关于它可能是 u
在开始阅读问题之前请注意我阅读了 Petzold 的书(windows 编程第 5 版)! 在 form.h 中,我声明了名为 CMessage 的自定义消息(它代表“自定义消息”,稍后调用创建按钮的
我试图在两个应用程序之间传递消息 - 其中一个是插件,另一个是独立的配置实用程序。当我的插件检测到一个事件时,我想向我的实用程序发送一条消息并提示用户重新配置。 我使用的代码如下: [DllImpor
我正在尝试使用 sendmessage 将消息从我的 C++ 应用程序传递到 C# 我的c++代码是这样的 int _tmain(int argc, _TCHAR* argv[]) { COPYDA
为什么 Windows SendMessage() 总是返回零,即使消息传递成功?有没有办法用 SendMessage() 检查消息传递失败? 编辑 忘记提及我在 C++ DLL 中使用 SendMe
当我们发送消息时,“如果指定的窗口是由调用线程创建的,则立即将窗口过程作为子例程调用”。但是“如果指定的窗口是由不同的线程创建的,系统会切换到该线程并调用适当的窗口过程。只有当接收线程执行消息检索代码
我正在尝试通过 SendMessage(..) 方法将鼠标事件发送到 windows 中的窗口。 我面临的问题是消息似乎没有传送到我发送它们的窗口,即使 SendMessage 返回 0,这(根据文档
我已经成功地使用 Windows SendMessage 方法帮助我在我的文本编辑器中做各种事情,但每次我只是复制和粘贴别人建议的代码,我真的不知道它是什么意思。始终有一个神秘的消息编号作为参数。我如
我想从 MyServerProtocol 类外部调用 sendMessage 方法并向连接的客户端发送消息。我使用 threading 来做到这一点。 当我使用这段代码时: from autobahn
我正在编写 C# 自动化工具。 由于 Microsoft UI Automation 不提供任何模拟右键单击或弹出上下文菜单的方法,因此我使用 SendMessage 来代替。我宁愿不使用 SendI
我的问题是:如何使用 SendMessage() 实现两个线程之间的线程通信,一个有窗口(GUI),另一个没有窗口? 问题是 SendMessage() 需要一个句柄 (HWND)? 关于我的项目的另
我是一名优秀的程序员,十分优秀!