トップページ⇒tech
1001コメント309KB

Win32API質問箱 Build120©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net2015/04/09(木) 18:16:02.24ID:Rhj0QTuK
Win32APIについての質問はこちらへどうぞ。

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。
 英語版( http://msdn.microsoft.com/en-us/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで

■過去スレ
Win32API質問箱 Build118
http://peace.2ch.net/test/read.cgi/tech/1407006123/
Win32API質問箱 Build11 (119らしい)
http://peace.2ch.net/test/read.cgi/tech/1418181169/
0175デフォルトの名無しさん2015/04/24(金) 03:54:40.79ID:cnXdh8tn
ちょっと、質問し直します。

メニューを追加すると既存のボタン類は自動的にメニューの高さ分下に移動しますが、ウインドウサイズは変わりません。
ウインドウサイズも自動的に大きくはならないのですか?
0176デフォルトの名無しさん2015/04/24(金) 04:33:58.09ID:xfJFJ7Nc
>>175
処理が完了するまでウィンドウが動かないものとして
メニュー追加前のクライアント座標0, 0をウィンドウ座標に変える
→メニュー追加後のクライアント座標0, 0をウィンドウ座標に変える
→その差分ウィンドウサイズを変更する
じゃダメなん?
01771682015/04/24(金) 04:41:10.43ID:vwT5rXE6
>>175
参考になるか?
ttp://sumishiro.blogspot.jp/2010/03/blog-post_13.html
0178デフォルトの名無しさん2015/04/24(金) 05:13:29.62ID:cnXdh8tn
ん〜、意図がなかなか伝えられなくてすみません。
GetSystemMetricsなどでメニューサイズの取得やSetWindowPosでのウインドウサイズの変更方法などは分かっているのですが、
最初に書いたようにダイアログベースのウインドウをリソースエディタで作成すると
メニューの有無でボタン類の位置は勝手に上下に動きますが、ウインドウサイズは変わりません。
これは、プログラムでサイズ変更するしかないのかというのが質問です。
0179デフォルトの名無しさん2015/04/24(金) 06:13:30.70ID:vwT5rXE6
>>178
vs2013の自動生成コード利用して、ABOUTBOXダイアログに、メニューの追加でサンプルを作ってみたが、
RCのダイアログって、クライアントサイズは固定で、メニュの有無で、ウインドサイズは異なるので正常だと思うが、
ダイアログのウインドサイズを固定で作りたいの?
ダイアログのクライアントサイズを固定で作りたいの?
メニューの追加って、RCのプロパティでmenuってとこで設定するようにしてるよね?
0180デフォルトの名無しさん2015/04/24(金) 06:44:25.47ID:6TulMhAx
出来るか出来ないかで言えば当然出来る訳だが
糞仕様
0181デフォルトの名無しさん2015/04/24(金) 08:29:32.10ID:ci039+n8
>>178
「メニューの有無で」の部分をもっと正確に言わないと回答つかないのでは?
エスパーして例を挙げるなら、表示されているウィンドウにSetMenuなどで
メニューを付けてあげる場合は勝手にリサイズされないから自前でやる必要がある。
0182デフォルトの名無しさん2015/04/25(土) 08:59:49.51ID:QgsvYozO
言語バーの作成方法って作り方分かる人いませんか?
0183デフォルトの名無しさん2015/04/25(土) 09:06:53.19ID:QgsvYozO
ドッキングウィンド関連探せばいいのだろうか。。?
0184デフォルトの名無しさん2015/04/27(月) 21:27:22.01ID:QwoO9IPF
基本的なこと申し訳ありませんが、教えてください。

メッセージループは1つのアプリケーションに一つ?
それともそのアプリケーション内のウィンドウごとにおのおの存在するの?
0185デフォルトの名無しさん2015/04/27(月) 21:35:52.54ID:6f9FfEFl
一つ
0186デフォルトの名無しさん2015/04/27(月) 21:39:44.80ID:eeUDpTg4
ぶっちゃけスレッドごと
ドラッグで範囲選択するときのWM_LBUTTONDOWNなどで独自にループすることもある
0187デフォルトの名無しさん2015/04/27(月) 21:47:49.17ID:nicG1Io0
メインスレッド以外をCreateThreadしてから
そのスレッド内でGetMessageすれば新しいメッセージループが作られるけど
取り立てて役だったことはない
0188122015/04/28(火) 01:05:17.00ID:/B/rl701
とても遅くなりましたが、>>26さんの方法で実装出来ました!
大変助かりました。ありがとうございます。
0189デフォルトの名無しさん2015/04/28(火) 18:13:27.82ID:W6RHswum
SendInput()関数と同様の動作をするタブレットをタッチするAPIって何かありますか?
01901892015/04/28(火) 18:26:37.13ID:W6RHswum
InjectTouchInput functionっていうの見つけたんですが、WM_TOUCHで分岐で、自分でタッチしているタッチIDを、タッチアップ状態にすることができるのかな?
01911892015/04/28(火) 23:01:18.23ID:W6RHswum
windows8で、タッチパネルを操作している時に、マウスが内部で連動して動きます。
タッチ操作中に、マウスを動かさない方法ってありますか?
一部の処理で、マウスカーソルの位置をアプリ側で操作する処理で障害になります。
WM_TOUCHでタッチ処理をしているのですが、GetCursorPos();で調べると値が変化しています。
01921892015/04/29(水) 02:05:01.53ID:S40E4Ihk
グローバルフックで試してみますぅぅ。。
0193デフォルトの名無しさん2015/04/29(水) 12:08:54.67ID:No5D67KY
意識しなくてもCreateできるウィンドウクラス BUTTONとかはどこに定義されてるの?
0194デフォルトの名無しさん2015/04/29(水) 12:53:06.13ID:pThgOoLO
リソース
0195デフォルトの名無しさん2015/04/29(水) 13:15:05.63ID:UdtGh3gm
user32.dll
0196デフォルトの名無しさん2015/04/29(水) 14:16:13.91ID:No5D67KY
ありがとう
0197デフォルトの名無しさん2015/04/29(水) 16:24:35.52ID:1y0sk+YZ
すみませんがCOM作成にあたり分からない点があり、もう一度質問させてください。

DelegateExecute等から呼び出させるCOMを作成する際、既存COMの動作を
適宜実行させたい場合、どうするべきなのでしょうか。
既存COMのDLLを参照して、コクラスの継承とかが出来るのかと思いましたが、
よくわからないでおります。

HKCU\Software\Classes\Folder\shell\open\commandの場合、
ExecuteFolder(ExplorerFrame.dll)が既存アクションのようなのですが、
こいつをどう呼び出す/継承させるかがわからずにいる状態です。
(そもそもスタンスがあってるのかさえ。。)
0198デフォルトの名無しさん2015/04/29(水) 18:05:09.67ID:lb5eDrrL
CoCreateInstance( ExecuteFolderのCLSID ... できたら
IExecuteCommand IInitializeCommand IObjectWithSelection IObjectWithSite
ここらへんのインターフェイスのメソッドで正しい情報を与えてやってExecuteFolderをエミュレートすればできそうな気がするけど

面倒くさそうだから自分なら既得のsiteからIShellBrowserをQueryInterfaceして
IShellBrowser::BrowseObjectで普通にフォルダ開かせちゃうのがいいと思うがどうか
0199デフォルトの名無しさん2015/04/29(水) 18:38:32.74ID:Bg6ZLegt
今時COMなんて・・・
10年ぶりに聞いたなw
0200デフォルトの名無しさん2015/04/29(水) 19:59:29.55ID:Ih1x52O1
モーダルダイアログボックスを表示すると
メッセージループがぐるぐる開始する。
ダイアログ中のプッシュボタンをマウスで押すと
このメッセージループがWM_LBUTTONDOWNを受け
WM_LBUTTONDOWNのハンドラ中で別のメッセージループを開始する。

メッセージループはいくつある。
0201デフォルトの名無しさん2015/04/29(水) 20:23:23.77ID:MPDoLmFP
今時って言われても Excel とか細かく制御するなら COM しかないし
0202デフォルトの名無しさん2015/04/29(水) 20:58:21.71ID:Bg6ZLegt
つドトネ
0203デフォルトの名無しさん2015/04/29(水) 21:22:01.08ID:pThgOoLO
DirectX
0204デフォルトの名無しさん2015/04/29(水) 23:20:13.57ID:zwED2fT3
.netもCOM呼んでるだけだから
02051972015/04/30(木) 00:27:47.26ID:IOp/sxLA
>>198
IShellBrowser::BrowseObject実装して、今のところ既存の動きを再現できました。
ありがとうございます!
IShellBrowser::BrowseObjectなんぞ知りも知らなかったので、
ここらへん辿れるようになりたいですね。
0206デフォルトの名無しさん2015/04/30(木) 07:57:48.27ID:75MO5jun
シェルインターフェイスは掘ると楽しいぞ
0207デフォルトの名無しさん2015/04/30(木) 11:21:09.79ID:ztKwqMYg
ウインドメッセージの一覧って、winuser.hに書かれていない内容はどこで調べればよいですか?
0x91,0x92,0x93のメッセージは何をやっているかわかりません。
Vs2015ってSpyツールありましたっけ?
02082072015/04/30(木) 11:23:04.24ID:ztKwqMYg
VS2013の間違いです。。
02092072015/04/30(木) 11:25:21.36ID:ztKwqMYg
スパイ見つけました。。\Common7\Toolsにあるとは。。
0210デフォルトの名無しさん2015/04/30(木) 13:51:06.64ID:iDcC+qzm
VS2013なら、メニューの「ツール」から起動できるだろ。
0211デフォルトの名無しさん2015/04/30(木) 21:45:33.01ID:acewAU+4
>・.NET やWin32 デスクトップアプリもストア配布可能に。エンタープライズ向けの仮想化技術を応用した
>サンドボックス環境で動き、ネイティブデスクトップアプリの力をそのままにシステムへの影響を減らす。
>アンインストール時にゴミを残さない。ステージでは PhtoShop Elements をデモ。

サンドボックス化は歓迎だけどこんなんストアがマルウェアの万国博覧会になりそうなんだけど
0212デフォルトの名無しさん2015/04/30(木) 22:36:39.51ID:z7JbgbHO
別に一元化なんて望んでねえけどな
パッケージマネージャーつけろとは前々から思っていたが

chocolatey?
おもちゃに用はないよ
0213デフォルトの名無しさん2015/04/30(木) 22:54:56.41ID:uI857xi4
Nugetは?
0214デフォルトの名無しさん2015/05/01(金) 01:12:16.84ID:/Mtkjhpa
ファイルに関連付けられたアイコン (エクスプローラで表示されるやつ) の、
大きいのが取得したいんだけど、どうすればよい?
ExtractAssociatedIcon と IExtractIcon を試したんだけど、
両方とも48x48が最高みたい。
256x256の綺麗なアイコンはどうやったら取得できますか?
02152142015/05/01(金) 01:30:39.80ID:/Mtkjhpa
ごめん。
解決しました
0216デフォルトの名無しさん2015/05/01(金) 16:17:44.56ID:mcLYTm8y
複数行richeditで一行の高さをピクセルで得たいのですが、
CHARFORMAT構造体のdw.yHeightはtwip単位。
twipからpixelへの間には各環境のdpiが絡んでらっしゃると。
てことはGetDeviceCapsとかを呼んでアレコレするしかないってことなんでしょうか。
現フォントの大きさ高さをピクセル単位で保存してるプロパティ的なものって
ないんでしょうか。
昔はだいたい96dpiだったと知りましたが、実際計ってみると確かに
96dpiではおかしい大きさで表示しとりますです。
0217デフォルトの名無しさん2015/05/02(土) 18:04:37.67ID:wQLon+fD
gw真っ只中ですが、教えてください
Ctrl+FunctionKeyを捕まえたいのですが、どんなメッセージ飛んでくるのですか?
0218デフォルトの名無しさん2015/05/02(土) 18:43:22.99ID:wQLon+fD
できました
0219デフォルトの名無しさん2015/05/02(土) 19:22:52.25ID:P8FpGVi1
XPから久々にWindowsネイティブアプリ作ろうとしたら
グローバルフック周り地味に面倒になってそうだな・・・
0220デフォルトの名無しさん2015/05/03(日) 01:12:27.12ID:DpPxqG4c
ツールチップを好きなタイミングで複数表示したり非表示にしたいと思っています
しかし、CreateWindowでtooltips_class32を指定したものをShowWindowで表示してみても影しか表示されません
何かしら抜けている手順があったら教えてください
0221デフォルトの名無しさん2015/05/03(日) 01:20:14.65ID:DGVNwvpl
つShowWindowsAtAnyTime
0222デフォルトの名無しさん2015/05/03(日) 08:38:00.25ID:y99enrox
グローバルフックなどで、ウインドメッセージの内容を書き換えて適用させようと思ったらどうすれば良いですか?
ウインドメッセージ、WM_WINDOWPOSCHANGING:の値を書き換えたいのですが、ご教授お願いします。
0223デフォルトの名無しさん2015/05/03(日) 10:46:37.20ID:jQdh0BE6
ローレベルインプット系のグローバルフック以外は書き換えできないよ
やりたいなら対象プロセスに潜り込んでWndProcを上書きするしかない
対象プロセスに潜り込む方法はグローバルフックでもいいけどね
0224デフォルトの名無しさん2015/05/03(日) 10:50:29.30ID:jQdh0BE6
他にもメッセージを変更可能なフックはあったような気がするが
確実にWH_CALLWNDPROCではない
ジャーナル何とかだったかな
0225デフォルトの名無しさん2015/05/03(日) 11:04:16.54ID:p3er52Mk
とりあえずWH_DEBUGで受け取れるか見てみたらいいんじゃね
0226デフォルトの名無しさん2015/05/03(日) 11:47:58.30ID:y99enrox
対象ウインドを、グローバルフックで、case WM_SYSCOMMAND:、case SC_MOVE: の開始のタイミングで、
CreateRemoteThreadとか使う感じになるのでしょうか?

case SC_MOVEのタイミングで、SetWindowSubclass(p->hwnd, SubclassProc, 0, 0);だとダメでした。
自分のウインドのみは書き換えは成功していたみたいです。
SetWindowLongは試してないですが、古いAPIなので、使うと不具合ありそうですねよね?
SetWindowLongは、動作しているスレッドが違う場合ので動かないのかな?

WH_CALLWNDPROC 読み出しのみっぽいのでダメ
WH_CBT+HCBT_MOVESIZE 動かしたい内容に近いが、ダメでした。
WH_DEBUG 試してない
WH_GETMESSAGE WM_WINDOWPOSCHANGING:読み出しできず
WH_MOUSE、WH_MOUSE_LL ウインド移動ではだめっぽい。

このあたりは読みましたが…解決してないです。
https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/05e13534-8964-4626-b056-06e93a2154d5?forum=vcgeneralja
0227デフォルトの名無しさん2015/05/03(日) 11:58:39.70ID:DpPxqG4c
>>221
ググってもヒットしないんですが、それは何なんでしょうか?
0228デフォルトの名無しさん2015/05/03(日) 18:17:35.43ID:LlABLTEl
>>226
なんか不穏な感じ
0229デフォルトの名無しさん2015/05/04(月) 05:27:30.11ID:LYeSXt0A
コードに不吉な臭いが所々ありそう
0230デフォルトの名無しさん2015/05/04(月) 08:56:17.68ID:80QzrQPL
呪いのプログラム
0231デフォルトの名無しさん2015/05/04(月) 09:36:46.19ID:sKsouBLL
悪魔召喚プログラムの方が好きです
02322262015/05/04(月) 18:02:24.32ID:q56zhT2A
グローバルフック中のSetWindowLong だと問題なく動きますねぇ。
SetWindowSubClassだとうまく動きませんねぇ。なんでだろ?

Win7以降向けで、CreateRemoteThreadEx+LoadLibrary で、サブクラス化のテストはしました。
XPだとCreateRemoteThreadじゃないとだめですね。
とりあえず、CreateRemoteThreadExだと、カスペル先生とかが誤動作しそうなので、
グローバルフック中にSetWindowLongのを使おうかと考えています。

ウインド移動前提で、サブクラス化した場合、
SetWindowLong(サブクラス化)の解除のタイミングは、WM_DESTROY 以外だと、
どのメッセージがよいでしょうか?

WM_EXITSIZEMOVE,WM_DESTROY で破棄コードを動かすようにはしています。
02332262015/05/04(月) 18:26:03.85ID:q56zhT2A
動いているアプリの、ウインドハンドルが64Bitか32Bitの判断ってどうすればよいでしょうか?
なにかAPIありましたっけ?
02342262015/05/04(月) 18:35:31.12ID:q56zhT2A
多分自己解決、これでいいのかなぁ?
DWORD processID;
DWORD thID;
BOOL bIsWow64 = FALSE;
thID = GetWindowThreadProcessId(hWnd,&processID);
IsWow64Process(processID, &bIsWow64);
は。。64ビットめんどくさー
02352262015/05/04(月) 20:26:27.96ID:q56zhT2A
IsWow64Processの第一引数、HANDLEだったorz
0236デフォルトの名無しさん2015/05/04(月) 20:58:25.12ID:VqP+6wea
32bitOS上でもIsWow64Process関数はFALSEを返すが大丈夫か?
作っているアプリ自体が64bitっていうなら良いけど。
02372262015/05/04(月) 21:25:39.18ID:q56zhT2A
>236
32Bitの環境は、IsWow64Process関数が存在するかどうか調べて判断すれば。。と思ったんですが、甘いかなぁ。。
この辺り参考にしようかとは思ってますがどうなんでしょう。
http://blog.monoweb.info/blog/2009/09/13/64bit-hook/
0238デフォルトの名無しさん2015/05/04(月) 21:53:00.00ID:MYTXHyrO
32bitOS上に64bitアプリは存在しないんだから result が FALSE なら 32bit アプリということで
事足りるんじゃないの?
0239デフォルトの名無しさん2015/05/04(月) 23:36:23.21ID:VqP+6wea
>>237
Windows XP SP2以降はこの関数が存在しているらしい。
「関数が存在していなければ32bitOS」という判断は出来るが「関数が存在していれば64bitOS」という判断は出来ない。
また実機(WindowsXP SP2)でも過去に検証済み。

MSDN
https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms684139.aspx

>If the process is running under 32-bit Windows, the value is set to FALSE.
>If the process is a 64-bit application running under 64-bit Windows, the value is also set to FALSE.

そのサイトに書かれている方法は以下の文が肝。
>始めに利用者が起動するのは32bit版のプログラムです。
32bitアプリ実行環境においてIsWow64ProcessがFALSEを返すということは、ネイティブで実行されている。
逆にIsWow64ProcessがTRUEを返したならそれはWOW64の下で動いているということになる。
だから「必ず最初は32bitアプリを起動させて・・・」という方法を取れるならそのブログのようにIsWow64Processだけで判断も出来る。

>>238
result が FALSEってのがどのレベルで言っているのか分からんが
( IsWow64Processの戻り値ということなら)64bitOSで64bitアプリケーションでも IsWow64Process はFALSE を返す。

つまり32bitOSか64bitアプリなら関数はFALSEを返すので
アプリが何bitかを判断するにはOSが何bitかを知らないといけない。
0240デフォルトの名無しさん2015/05/04(月) 23:45:54.58ID:VqP+6wea
というかあれだな。
32bitアプリを作っているなら「最初に起動するのは32bitアプリ」なのは当然か。
フック対象が64bitならフックしないか、64bit版を起動させるっていうブログの方法で問題ないな。

ただ「関数が存在するかどうか」だけじゃ不十分だから気をつけてね。
0241デフォルトの名無しさん2015/05/05(火) 00:15:04.99ID:HP7XiSqu
あれ?なんか違うな。
>>240は若干訂正。

自分が32bitアプリだとしても、
・相手が32bitOSで32アプリ → IsWow64Process はFALSEを返す
・相手が64bitOSで32アプリ → IsWow64Process はTRUEを返す
・相手が64bitOSで64アプリ → IsWow64Process はFALSEを返す

OSが何bitかを知りたいだけならそのブログの方法だけでいいが、
相手が何bitかを知りたいなら組み合わせないとダメだな。

自分が32bitアプリだから、自分にIsWow64Processを使いFALSEなら32bitOSでTRUEなら64bitOS。
32bitOS環境なら相手も当然32bitアプリ。
64bitOS環境だと相手が32bitアプリか64bitアプリかの判断が必要なので相手もIsWow64Processで調べる。
FALSEなら64bitアプリ、TRUEなら32bitアプリ。

「動いているアプリの」ってのが相手のことならこうしないとダメだな。
あとは相手が64bitアプリならフックしないか、64bitアプリを立ち上げてフックするか。
0242デフォルトの名無しさん2015/05/05(火) 00:55:10.80ID:JPFk61nl
64bit cpuで
int a = 0xffffffffffffffff;

でなぜ警告がでるの?
0243デフォルトの名無しさん2015/05/05(火) 01:08:32.87ID:WXcigvGr
今Windowsで使えるメジャーなC/C++コンパイラは
intを32ビットで扱っているから

整数型のサイズはCPUのビット数に合わせなければならない
とかいう規定があるわけではない

shortのサイズ以上であればintが2048ビットでも
24ビットでもそれはコンパイラの自由なんだよ
0244デフォルトの名無しさん2015/05/05(火) 01:16:06.47ID:q10zsNFn
intの上限が 0x7FFFFFFF だから
0245デフォルトの名無しさん2015/05/05(火) 01:21:24.52ID:AH7UBQjv
>>242
sizeof(int) がいくつになるか試してみたら
0246デフォルトの名無しさん2015/05/05(火) 05:07:51.68ID:V9xQwQO9
デスクトップってダブルバッファリングは行っていないんでしょうか?
マウス入力などを遮らないアニメーションをデスクトップ上に表示したいんですが
0247デフォルトの名無しさん2015/05/05(火) 09:29:14.26ID:8cBYwRXK
DWM compositionが有効な限り常時バッファリング描画やで
02482262015/05/05(火) 09:29:18.47ID:20DP2R/2
>>241
サンキュー助かります。
最初に32ビット版で起動して、64ビットOSであれば、
64ビット版を起動して、ウインド情報を調べてフックするようにするつもりです。
実行ファイル2つと、DLLが2つになるのは仕方ないですね。
メモリー共有って32ビットと64ビットの混合ってできましたっけ?
32ビットウインドと64ビットのウインド間のメモリー共有って
CreateFileMappingでできるのかな?
SendMessage(WM_USER や WM_COPYDATAでやりとりしたほうがいい?
0249デフォルトの名無しさん2015/05/05(火) 10:51:06.10ID:V9xQwQO9
>>247
ありがとうございます
確かにAeroの処理を考えるとダブルバッファリングが必須ですね
よく考えたらやりたいこととダブルバッファリングはあまり関係がありませんでした

すでに知っているのはGetDC+BitBltで書き換えるやり方ですが、
描画した画像の下に無効リージョンが発生すると
勝手に塗り直されてちらつきが発生するのでそれを防ぐ方法が知りたいです

デスクトップの内部バッファが後は反映するだけというところまで描画を終える
↓
そこにすかさず割り込んで表示したいアニメを描き足す
↓
その後OKサインを送ったらようやく実際にデスクトップが描画される

具体的に書くときっとこういう流れになると思うんですが、特に真ん中を実現するためのAPIがあったら教えてください
0250デフォルトの名無しさん2015/05/05(火) 10:59:46.29ID:qvOIJ9mb
これってさ自前でダブルバッファリングやってるのもさらにダブルバッファリングかかるわけ?
02512262015/05/05(火) 11:04:35.43ID:20DP2R/2
>>249
自分でダブルバッファーしてるんであれば、あとはやることといえば、NULLブラシの設定くらいか?
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);を
wcex.hbrBackground = (HBRUSH)NULL;にしてみたら?改善しないか?
0252デフォルトの名無しさん2015/05/05(火) 11:17:14.87ID:kyGf+mJm
WM_ERASEBKGNDは?
0253デフォルトの名無しさん2015/05/05(火) 11:21:04.64ID:V9xQwQO9
>>250-252
これが実現できるならダブルバッファリングは一回で済むんじゃないかと思います

自分ではウィンドウは作らずにデスクトップに直描きしたいってことです
理由は最前面になっている他のウィンドウを非アクティブにしたくないのが一つと
カーソル下にウィンドウがあるときにマウス入力が遮られて邪魔になるのが一つ
(例えばスタートボタンの上に画像が被さっていても意に介せずホバーやクリックの反応をしてほしい)

協力してくださってありがとうございます
02542262015/05/05(火) 11:24:14.70ID:20DP2R/2
HANDLE hShare = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,0, sizeof(MyShareData), strShareName);
LPDATA pData = MapViewOfFile(hShare, FILE_MAP_WRITE, 0, 0, sizeof(MyShareData));
32/64ビット間のメモリー共有ですが、特にコードいじることなく共有できました。
0255デフォルトの名無しさん2015/05/05(火) 12:56:34.32ID:kyGf+mJm
>>253
デスクトップのハンドルからプロシージャのアドレス得て>>252だけ捕まえるとか
02562262015/05/05(火) 13:46:31.14ID:20DP2R/2
>>253
デスクトップの直書きって、WM_PAINT直後に描画するてこと?
試してないけど、デスクトップのウインドハンドルをフックしたとして、
WM_PAINTを先に描画させて、任意の画像を上からBitBltとかする感じかな?
普通にちらつきそうではあるが。。?
0257デフォルトの名無しさん2015/05/05(火) 14:07:36.70ID:q10zsNFn
アニメーションコントロール作ってAVI再生させたほうが早いかも (笑)
0258デフォルトの名無しさん2015/05/05(火) 14:39:05.37ID:3fPyNIFJ
フックして、プロセス開いて本来のこーどの
wm_paintのendpaintの直前に描画命令を割り込ませられれば。。。あるいは。。。
0259デフォルトの名無しさん2015/05/05(火) 16:58:43.47ID:PARG4dys
素直に透過ウインド作ったほうがよくね?
02602262015/05/05(火) 18:36:30.71ID:20DP2R/2
>>253
これ通るか不明ですが。
case WM_PAINT:を動かす時って、通常、hdc = BeginPaint(hWnd, &ps);EndPaint(hWnd, &ps);がセットですよね?
と、いうことは、hWndのhdcの値を任意の情報に書き換えられれば、バッファリングできるかもしれないですよね?
だめで元々と思ってください。
予め、自分のウインドハンドルに、hdc=GetDC(hWnd);でHDC取得して、 バッファに、SelectObject(hdc,hMyBmp);で関連付けしておく
それと、ダブルバッファ用のメモリーDC(myDC)を作っておく
んで、GetDesktopWindow() とか必要に応じて、グローバルフック+サブクラス化して、 WM_PAINTの本来受け渡す、HookPrc( hWnd,rParam,lParam); のhWndを書き換えてバッファリングして描画するっていう方法はどうでしょうか?
case WM_PAINT:
myWndDC =GetDC(hMyWnd); // 自分のウインドハンドルのDCを取得
// myBmpはCreateCompatibleBitmapで本来のhWndのDC, 所属のhBitmapなどからサイズとか取得したほうが良いと思う
hdc =GetDC(hWnd);myBmp = 略;ReleaseDC(hdc);
oBmp=(HBITMAP)SelectObject(myWndDC,myBmp); // myWndDCにバッファ用のビットマップをセット
// 先に描画、描画対象を自分のウインドのhDCに描かせることが成功すればチラツキは抑えられるはず?
HookPrc(hMyWnd,wParam,lParam);
hdc = BeginPaint(hWnd, &ps);
BitBlt(myDC,略,myWndDC,略); // 背景として、本来の描画内容をmyDCに転送(バッファリング)
SelectObject(hMyDC,oBmp); // 本来のビットマップに戻す
ReleaseDC(hMyWnd, myWndDC); // リリース
DeleteObject(myBmp); // myBmpを破棄
FillRect(myDC,略)など // ここで自分で上書き描画
BitBlt(hdc,略,myDC); // 実際のウインドに描画する
EndPaint(hWnd, &ps);return 0;
02612262015/05/05(火) 18:38:32.93ID:20DP2R/2
書いててふと思ったんですが、DirectXやら、OpenGLとかで動いてるアプリには、上記の方法は効果なさそうですね
0262デフォルトの名無しさん2015/05/05(火) 23:47:02.11ID:V9xQwQO9
>>260
とても親切に説明していただいて恐悦至極です。ありがとうございます!
BeginPaintが返却するhdcを自分のメモリDCに挿げ替えるなんてのは思いつかなかったので非常に参考になりました

背景, アニメABCDコマがあるとすると(背景はGetDC(NULL)で取得できる内容そのもの)

1, 背景が描画される(表示状態:背景のみ)
↓
2, Aコマを描画する(表示状態:背景+Aコマ)
↓
3, 次のコマを表示するために背景を再描画させる(表示状態:背景のみ)
↓
4, Bコマを描画する(表示状態:背景+Bコマ)

となり、AコマとBコマの間に一瞬だけ背景のみの状態になることがちらつきの原因と思われるので、
1と2,3と4を同一のタイミングで描画するための何かしらの方法を探していましたが、
皆さんの書き込みを拝見する限りではBeginPaintやEndPaint等のAPIフックが必須っぽいので、
それで試して上手く行かなかったらそのときは諦めようかと思います
ありがとうございました
0263デフォルトの名無しさん2015/05/06(水) 22:24:13.55ID:OlUhBFHF
VS2013のC++で
MessageBoxIndirectを使ってダイアログを表示する際に、例えば
IDCANCELボタンを表示すると、日本語Windows7なら[キャンセル]、
英語Windows7なら[Cancel]と表示されますが、それをOSの言語と関係無く
自分で好きな文字列を指定して表示させたいのですが、どうやっても
出来ません。どうにかして出来ませんか?
0264デフォルトの名無しさん2015/05/06(水) 22:35:05.51ID:ROM3ZfOK
>>263
(1)自分でダイアログを自作する。
(2)メッセージボックスをフックする。
0265デフォルトの名無しさん2015/05/06(水) 22:46:36.25ID:OlUhBFHF
>>264
レスありがとうございます。
(2)の方法でやりたいのですが、どうすれば自作のcallback関数に
置き換えられるのか分りませんでした。
0266デフォルトの名無しさん2015/05/06(水) 22:51:27.95ID:ROM3ZfOK
>>265
SetDlgItemText
0267デフォルトの名無しさん2015/05/06(水) 22:55:01.18ID:lk9KI/Ea
::SetWindowsHookEx(WH_CBT, CBTProc,...);

LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  if(nCode == HCBT_ACTIVATE)
  {
    HWND hWnd = reinterpret_cast<HWND>(wParam);
0268デフォルトの名無しさん2015/05/06(水) 23:54:06.74ID:OlUhBFHF
>>266>>267
情報ありがとうございました。
試してみたいと思います。
0269デフォルトの名無しさん2015/05/07(木) 00:56:21.78ID:CSFF77Jn
自分が分かることは得意げに書くけど、
分からないことはヤフレカスってのは常套手段ですねw
0270デフォルトの名無しさん2015/05/07(木) 01:05:23.21ID:xpfh09H0
自分がわからないことをヤフレばわかるって、どの口から言えるんだろうな
0271デフォルトの名無しさん2015/05/07(木) 03:35:20.66ID:+yI4RSPE
しばらく誰も検索しろなんて言ってないような気がするが…
どこのスレで口喧嘩に負けてきたんだ?
荒らしてきてやるから書け
0272デフォルトの名無しさん2015/05/07(木) 22:56:17.61ID:uDHc9Yu6
例えば、自作のC++アプリの中から、他のアプリの中にあるButtonのhwnd
が取得出来たとして、
Postmessage(hwnd, , ,) ;
で何かメッセージを送って、そのボタンの背景色を赤色に変えるなど
できますか?
0273デフォルトの名無しさん2015/05/07(木) 23:10:50.13ID:XdEP7Lb2
例えば ツリービューコントロールの TVM_SETBKCOLOR みたいなメッセージが
用意されていればいいのだが、あいにくボタンにはそういうメッセージがない。

なので、他のアプリのボタンの背景色を変えようと思えば、そのボタンのスタイルを変え、
なおかつプロシージャを乗っ取って WM_DRAWITEM なりを処理する必要があると思う。

ゆえに答えは否。

自分の作ったアプリのボタンの背景色を変えるにはどうすればいいか。
まずはそのあたりを考えてみるといいよ。
0274デフォルトの名無しさん2015/05/07(木) 23:17:47.32ID:uDHc9Yu6
>>273
レスありがとうございました。

>他のアプリのボタンの背景色を変えようと思えば、そのボタンのスタイルを変え、
>なおかつプロシージャを乗っ取って WM_DRAWITEM なりを処理する必要があると思う。
なかなかややこしそうですね。

>ゆえに答えは否。
そうですか。困った。

>自分の作ったアプリのボタンの背景色を変えるにはどうすればいいか。
>まずはそのあたりを考えてみるといいよ。
その場合は、
SetBkColor
でやるんですよね?
■ このスレッドは過去ログ倉庫に格納されています