1

私はグーグルを試してみましたが、これについてこのサイトで検索しましたが、役に立ちませんでした。

Qt を使用して Windows 用のクリップボード関連アプリケーションを構築しています。正しく機能するための要件の 1 つは、Ctrl + C、Ctrl + V などの Qt アプリケーション外のキーボード イベントに登録できることです (コピー/貼り付け)。 . 私がオンラインで見つけた唯一のことは、Qt の外部プラグインを使用することですが、概念全体が適切に説明されていなかったため、行き止まりになりました。

どうすればこれを行うことができるか考えている人はいますか? 繰り返しますが、アプリケーション自体の外部で発生するアプリケーションへのショートカットを登録したいと考えています。

前もって感謝します!

4

4 に答える 4

0

これは、アプリケーションが実行されるデスクトップ環境に依存し、OS 固有です。KDE 内でアプリケーションを実行する場合は、 .desktopファイルをアプリケーションにデプロイするか、 /usr/share/kde4/apps/khotkeys に追加することで、簡単にグローバル ホットキーを登録できます。

Windows 内で最も簡単な方法は、グローバル ホットキーを登録するためにレジストリ キーをレジストリに追加することでしょう。MSDNを参照

于 2013-08-29T07:53:31.510 に答える
0

クリップボードの仕組みについて混乱しているだけだと思います。アプリケーションの外部でクリップボード関連のホットキーを登録する必要はありません。それらは他のアプリケーションによって処理されます。これらのアプリケーションが行うことは、システム全体のクリップボードと対話することです。アプリケーションは同じクリップボードと対話し、新しいクリップボード データが利用可能になったことなどに関する通知を受け取る必要があります。

「クリップボード関連」アプリケーションの意味を教えていただければ、より役立つ回答が得られるかもしれません。木製のクリップボードの販売に使用されますか? または、クリップボードのスプリングを調整しますか? または、クリップボードの在庫を管理するには? それとも、デジタル クリップボードで実行されますか? はぁ。

于 2013-08-29T18:43:46.303 に答える
-1

これにより、Windows + Qt と HotKeys をすぐに起動して実行できるようになります。

QxtGlobalShortcutで Qt eXTension ライブラリを試したことはありませんが、より多くのプラットフォームでより洗練された完全なソリューションになる可能性があるようです。(あなたの質問に対する@TimMeyerのコメントのように)

https://stackoverflow.com/a/3154652/808151

Windows で単一のシステム全体のホットキーをリッスンするために、この関数を作成しました。

#ifndef HOTKEYTHREAD_H
#define HOTKEYTHREAD_H

#include <QThread>

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

class HotKeyThread : public QThread
{
    Q_OBJECT

public:
    HotKeyThread(QObject *parent);
    ~HotKeyThread();
signals:
    void hot_key_event(int);
public slots:
    void run();
    void stop();
private:
    volatile bool m_stopped;
    DWORD m_thread_id;
};

#endif // HOTKEYTHREAD_H

.cpp ファイル

#include "hotkeythread.h"

#include <QDebug>
#include <process.h> 

#define WM_END_THREAD (WM_USER+2)

HotKeyThread::HotKeyThread(QObject *parent)
    : QThread(parent)
{
    this->m_thread_id = 0;
}

HotKeyThread::~HotKeyThread()
{

}

void HotKeyThread::stop()
{
    if(this->m_thread_id != 0)
        ::PostThreadMessage(this->m_thread_id, WM_END_THREAD, 0, 0);
}

//
void HotKeyThread::run()
{
    // store a thread id so we can exit later
    m_thread_id = ::GetCurrentThreadId();

    qDebug() << "ThreadIDs" << QString::number(m_thread_id, 16) << QString::number((int) this->currentThreadId(), 16);

    // register an atom, and a hotkey
    BOOL retVal;
    int counter = 0;
    int magic_num = 1128;
    ATOM id = ::GlobalAddAtom(MAKEINTATOM(magic_num + counter++));

    // http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
    int modifier = 0x0;// modify this line
    int key = VK_NUMPAD0;// modify this line
    if(QSysInfo::windowsVersion() > QSysInfo::WV_VISTA)
    {
        retVal = ::RegisterHotKey(NULL, id, modifier | MOD_NOREPEAT, key);
    }
    else
    {
        // No repeat is only supported in 7 and later
        retVal = ::RegisterHotKey(NULL, id, modifier, key);
    }

    if(retVal)
    {
        qDebug() << "Successfully added a HotKey!";
    }
    else
    {
        qDebug() << "Failed to add a hotkey!";
        return;
    }

    // wait on hotkeys
    MSG msg = {0};
    while (0 < ::GetMessage(&msg, NULL, 0, 0))
    {
        if(msg.message == WM_HOTKEY)
        {
            bool control = LOWORD(msg.lParam) & MOD_CONTROL;
            bool shift = LOWORD(msg.lParam) & MOD_SHIFT;
            bool alt = LOWORD(msg.lParam) & MOD_ALT;
            bool win = LOWORD(msg.lParam) & MOD_WIN;
            qDebug() << "HotKey!" << (control ? "Ctrl +": "") 
                << (alt ? "Alt +": "")
                << (shift ? "Shift +":"") 
                << (win ? "Win +":"") << QString::number(HIWORD(msg.lParam),16);
            // TODO Notify MainWindow of the event
            emit hot_key_event(msg.lParam);
        }
        else if(msg.message == WM_END_THREAD)
        {
            // exit
            break;
        }
    }

    // Clean up Hotkey
    ::UnregisterHotKey(NULL, id);
    ::GlobalDeleteAtom(id);
}

GUI での使用

 // Start HotKey Thread!
 m_hot_key_thread = new HotKeyThread(this);
 QObject::connect(m_hot_key_thread, SIGNAL(hot_key_event(int)), 
             this, SLOT(handle_hot_key_event(int)), Qt::QueuedConnection);
 m_hot_key_thread->start();

そしてあなたのプログラムが使用を閉じているとき

 m_hot_key_thread->stop();

それが役立つことを願っています。

于 2013-08-29T21:24:21.483 に答える