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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0407
Bkhoクリップボード内容を取得しているとエディタの動作が不安定になる?4解決


Bkho

リンク

2010/4/7(Wed) 09:21:33|NO.31833

クリップボード内容の履歴を取るプログラムを作成していますが、
動作中はエディタ等で貼り付け操作ができなくなったり、
正常にコピーされなかったりします。
どうすれば改善できるでしょうか?

取得する方法については、
hspext.dllだとシステムエラーが発生することがあるので、
さくらさんのstdlibにあるモジュールを利用しています。

#ifdef __hsp30__ #ifndef __EXCLIPBD__ #define __EXCLIPBD__ #module #deffunc getcliptext var prm1 if vartype(prm1)!2 : return -1 //OpenClipboard hwnd IsClipboardFormatAvailable CF_OEMTEXT ret=stat : if ret==0 : CloseClipboard : return -1 if ret!0 { OpenClipboard hwnd GetClipboardData ret : lngHwnd=stat if lngHwnd==0 : CloseClipboard : return -1 GlobalSize lngHwnd : ls=stat GlobalLock lngHwnd : lngMem=stat sdim strClipData,ls+1 lstrcpy varptr(strClipData),lngMem GlobalUnlock lngHwnd CloseClipboard prm1=strClipData : sdim strClipData,0 } return 0 #global #endif #endif


記録するタイミングについては、以下のように
過去内容と比較して一致しなかったときに記録しています。

a="":b="" getcliptext a *lp getcliptext a if a!b:{ b=a //記録処理を行う } wait 5:goto *lp



この記事に返信する


Bkho

リンク

2010/4/7(Wed) 09:24:41|NO.31834

すみません、補足です。
さくらさんのstdlibにあるモジュール、と書きましたが、
ここに載せたスクリプトは一部改変しています。
(コメントの削除, 関数名の変更, OpenClipboardの位置の変更など)

複数のサンプルスクリプトを調べた結果、
OpemClipboardやGlobalLockなどの実行順序が違ってたりしたのですが、
順序を変えて実行しても問題は解決されませんでした。



名無し

リンク

2010/4/7(Wed) 10:47:06|NO.31835

とりあえずOpenClipboard が成功したかどうかチェックするようにするというのは
どうでしょう?(失敗した場合はその回のクリップボードのチェックは諦める)

あとはOpenClipboard の引数を0にしてみるとか。



Bkho

リンク

2010/4/7(Wed) 21:22:24|NO.31845

(失敗した時は諦める/諦めない, 引数を0にする/しない)

この4パターンを試してみましたが、いずれも解決には至りませんでした。
が、引き続き調べ続けていくうちに、OpenClibboardの引数を
現在アクティブになっているウィンドウのハンドルにしたらどうか
という結論に至り、GetForegroundWindowで指定してやると
上手く動作しました。

引数に着目するというアイデア、ありがとうございました。



31835

リンク

2010/4/8(Thu) 20:24:08|NO.31859

Bkhoさんの件とは関係ないかもしれませんが、HSPの非表示状態のウィンドウの
ハンドルを引数として渡すとうまく動かないAPIとかありますね。RegisterHotKey
とかそうだったような。



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