HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2025
0208
ゆっくりXPテキストをD&Dできるようにしたい7解決


ゆっくりXP

リンク

2025/2/8(Sat) 16:24:24|NO.103019

inputやmesboxでテキストをドラッグ&ドロップしたいのですが、HSPでは不可能でしょうか?
(ファイルのドラッグ&ドロップではなく、テキストのドラッグ&ドロップの方です)
C言語の方ではいつくか記事が見つかるのですが、HSPやPythonでは見つかりませんでした。
Pythonでも見つからないということは、HSPでも不可能でしょうか?
AllowDropとかDragDropとかDragEnterを有効にすればできるみたいですが、可能でしょうか?
可能であれば、ご教授いただければ幸いです。
https://it-confiado.com/blog/%E3%83%89%E3%83%A9%E3%83%83%E3%82%B0%E3%82%A2%E3%83%B3%E3%83%89%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E3%81%A7%E3%83%91%E3%82%B9%E3%82%92%E6%B8%A1%E3%81%99/



この記事に返信する


正蔵

リンク

2025/2/8(Sat) 17:59:24|NO.103020

HSP単体では無理でしたが、ChatGPT(無料版)に聞いてDLLを作成したらなんとできてしまいました

以下のC++ソースをVisualStudioのダイナミックリンクライブラリで作成し、
プロパティの「C/C++」の項目から「プリコンパイル済みヘッダーを使用しない」に設定してx86でリリースビルドします
プロジェクトにReleaseというディレクトリが作成されるのでその中のDLLを「OLEDragDrop.dll」にリネームし、HSPのフォルダに入れるだけです
なおC++側のソースは一切理解できていません

・C++

// OLEDragDrop.cpp - HSP3用OLE Drag & Drop DLL #include <windows.h> #include <ole2.h> #include <shobjidl.h> #include <string> // HSP3のscreen 0ウィンドウ用グローバル変数 HWND hHspWnd = NULL; // IDropTargetの実装クラス class DropTarget : public IDropTarget { LONG refCount; public: DropTarget() : refCount(1) {} // COM参照カウント HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv) override { if (riid == IID_IUnknown || riid == IID_IDropTarget) { *ppv = static_cast<IDropTarget*>(this); AddRef(); return S_OK; } *ppv = NULL; return E_NOINTERFACE; } ULONG STDMETHODCALLTYPE AddRef() override { return InterlockedIncrement(&refCount); } ULONG STDMETHODCALLTYPE Release() override { LONG count = InterlockedDecrement(&refCount); if (count == 0) delete this; return count; } // ドロップされたデータの処理 HRESULT STDMETHODCALLTYPE DragEnter(IDataObject* pDataObj, DWORD, POINTL, DWORD* pdwEffect) override { *pdwEffect = DROPEFFECT_COPY; return S_OK; } HRESULT STDMETHODCALLTYPE DragOver(DWORD, POINTL, DWORD* pdwEffect) override { *pdwEffect = DROPEFFECT_COPY; return S_OK; } HRESULT STDMETHODCALLTYPE DragLeave() override { return S_OK; } HRESULT STDMETHODCALLTYPE Drop(IDataObject* pDataObj, DWORD, POINTL, DWORD* pdwEffect) override { FORMATETC fmt = { CF_UNICODETEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; STGMEDIUM stg; if (SUCCEEDED(pDataObj->GetData(&fmt, &stg))) { // データ取得 LPWSTR data = (LPWSTR)GlobalLock(stg.hGlobal); if (data) { SendTextToHSP(data); GlobalUnlock(stg.hGlobal); } ReleaseStgMedium(&stg); } *pdwEffect = DROPEFFECT_COPY; return S_OK; } void SendTextToHSP(LPCWSTR text) { if (!hHspWnd) return; COPYDATASTRUCT cds; cds.dwData = 1; cds.cbData = (wcslen(text) + 1) * sizeof(WCHAR); cds.lpData = (void*)text; SendMessage(hHspWnd, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&cds); } }; // DLL エクスポート関数 extern "C" __declspec(dllexport) BOOL RegisterHSPDrop(HWND hWnd) { hHspWnd = hWnd; CoInitialize(NULL); DropTarget* dt = new DropTarget(); return SUCCEEDED(RegisterDragDrop(hWnd, dt)); } extern "C" __declspec(dllexport) BOOL UnregisterHSPDrop(HWND hWnd) { return SUCCEEDED(RevokeDragDrop(hWnd)); } BOOL APIENTRY DllMain(HMODULE, DWORD ul_reason_for_call, LPVOID) { if (ul_reason_for_call == DLL_PROCESS_ATTACH) { CoInitialize(NULL); } else if (ul_reason_for_call == DLL_PROCESS_DETACH) { CoUninitialize(); } return TRUE; }

・HSP

// DLLロード #uselib "OLEDragDrop.dll" #func RegisterHSPDrop "RegisterHSPDrop" int #func UnregisterHSPDrop "UnregisterHSPDrop" int #define WM_COPYDATA 0x004A *main screen 0, 640, 480 ; メインウィンドウ title "OLE Drag & Drop HSP3" hspWnd = hwnd ; HSP3のウィンドウハンドル取得 // OLE D&Dを登録 RegisterHSPDrop hspWnd mes stat // WM_COPYDATAを受け取る oncmd gosub *on_copydata, WM_COPYDATA // 終了時にD&Dを解除 onexit *cleanup stop *on_copydata p1 = wparam ; 送信元のハンドル p2 = lparam ; COPYDATASTRUCT構造体のポインタ ; HSPのメモリ領域にデータをコピー sdim localData, 12 dupptr localData, p2, 12, 2 ; COPYDATASTRUCTのサイズ(標準は12バイト) size = lpeek(localData, 4) ; データサイズ取得 textptr = lpeek(localData, 8) ; テキストデータのポインタ ; UTF-16をSJISに変換 sdim test_wide, size*2+1 sdim text, size*2+1 dupptr test_wide,textptr,size,2 text = cnvwtos(test_wide) mes text return *cleanup UnregisterHSPDrop hspWnd end



正蔵

リンク

2025/2/8(Sat) 18:04:21|NO.103021

長くなるのでレスを分けました

ファイル以外のドラッグアンドドロップを利用するにはOLE Drag&Dropを利用する必要があります
過去ログに似た話題がありましたが未解決のままとなっていました
https://hsp.tv/play/pforum.php?mode=pastwch&num=73476

私が行ったChatGPTの会話履歴は以下から見られます
https://chatgpt.com/share/67a71d99-53a4-800d-914f-b76fe8e72773



ゆっくりXP

リンク

2025/2/8(Sat) 21:45:59|NO.103022

Visutal StudioからDLLをビルドして、ビルドしたDLLをHSP本体のフォルダに配置して、実際にやってみたところ、ほかのソフトからドラッグ&ドロップしたら上手くいきました。
inputとmesboxからドラッグ&ドロップすることはできるのでしょうか?
色々とすみません。



ゆっくりXP

リンク

2025/2/9(Sun) 19:18:20|NO.103026

なんかちょっと違いますね…。
自分がやりたいのは、inputやmesboxの入力ボックスでマウスでテキストを移動できるようにしたいのです。
↓こんな感じです。
https://x.com/i/status/1888532677634203752



shota

リンク

2025/2/9(Sun) 23:23:27|NO.103032

>なんかちょっと違いますね…。
最初に提示されたurlがD&Dされる方のテキストボックスの作り方なので普通そっちを聞いてるんだと考えますよ。

やり方としては同じようにDLLでIDropSourceインターフェースを実装して、さらにエディットコントロールを監視する実装をすればできそうですが正直めんどくさそうです。
詳しくはないですがリッチエディットコントロールが標準でD&Dでの移動に対応してるのでそっちを使えばどうでしょうか。
↓とか検索すればサンプルがいろいろ出てくると思います。
https://hsp.tv/play/pforum.php?mode=pastwch&num=85748



ゆっくりXP

リンク

2025/2/10(Mon) 17:27:38|NO.103037

ありがとうございます。
リッチエディットで使用されているとは気づきませんでした。
inputとかmesboxではできない仕様なのでしょうかね…。
HSPの場合、独自でDLLを作成して、呼び出すしかできなさそうですかね…。
とりあえず実装できたので、解決にすることにします。

お二人とも回答ありがとうございました。



shota

リンク

2025/2/10(Mon) 23:26:46|NO.103038

私の投稿103024は削除させていただきました。
質問者の希望と違うのと、よくよく見るとハンドル回り以外にもメモリリークなどほかにも不具合あるみたいで修正が不十分でしたので。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.103019への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2023(c) All rights reserved.