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

Win32API質問箱 Build80

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/06/04(木) 04:25:40
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。
「知らないならレスしないで下さい。ウザイだけです。 」なんて言わないでねっ!

過去スレ、関連リンクは>>2-10くらい。

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

- Win32API質問箱 wiki
http://wiki.livedoor.jp/program1/d/FrontPage

Win32API質問箱 Build79
http://pc12.2ch.net/test/read.cgi/tech/1240411224/
0175デフォルトの名無しさん2009/06/19(金) 23:31:53
話がそれたが、回答としては出尽くしたのか?
他にアイデアがあれば書いといてあげて。
0176デフォルトの名無しさん2009/06/19(金) 23:33:14
自演してんなよ
0177デフォルトの名無しさん2009/06/19(金) 23:36:28
おれは175=165だけど?
0178デフォルトの名無しさん2009/06/19(金) 23:57:57
れぎおん
0179デフォルトの名無しさん2009/06/20(土) 02:31:11
無理。
0180153 ◆D9KRK95MhY 2009/06/20(土) 10:55:44
皆さん回答ありがとうございます。
164さんのビットマップから作る方法を検討してみます。
0181デフォルトの名無しさん2009/06/20(土) 13:46:04
IMEの制御について詳しい方いらっしゃいますか?
漢字仮名まじりの文をIMEを使って全部ひらがなに逆変換したいんですが、
漢字仮名まじりの文をIMEに設定する関数 ImmSetCompositionString(himc, SCS_SETSTR, str, length, NULL, 0)が
MSIME2002では成功するのにATOK2006では失敗します。
一応MSIMEでは動くものが作れたんですが、ぶっちゃけクソ変換なので、できればATOKを活用したいのです。

何か別の方法がないでしょうか?
ネットで調べても変換操作をしたあとの再変換の方法ならあるんですが、
漢字仮名まじりの文をIMEに設定して逆変換する方法で、ATOKで成功するものが見つけられないんです。
0182デフォルトの名無しさん2009/06/20(土) 13:51:17
大抵の企業でATOKなんてわざわざ入れてないのでおk
0183デフォルトの名無しさん2009/06/20(土) 13:59:03
世間一般の企業がどうとかは関係なくて、自分のところのデータ変換処理に必要なんです。
ATOKだと文脈を理解して適切な読み仮名に変換してくれるはずなので、それに期待してるのです。
0184デフォルトの名無しさん2009/06/20(土) 14:04:21
「詳細なテキストサービスのサポートをプログラムのすべてに拡張する」がONならOFFにしてみるとか?
これでうまくいっても、PGでの対応方法は知らないけど。
0185デフォルトの名無しさん2009/06/20(土) 15:39:29
>>184
それはOFFになってましたね。
試しにONにしてみると、MSIMEでも逆変換できなくなってしまいました。。。
「詳細なテキストサービスをオフにする」のチェックも変えましたが、こちらは変化なしでした。

Immで始まるIME制御APIは自分が試した大部分でATOKとMSIMEの間で互換性がありました。
しかしIMEとは無関係のところからもってきた文を逆変換することに関してだけは互換性が無いようなのです。
ATOK12ではできたという話がネット上にありましたが、ATOK2006はその方法ではダメでした。
難しいですね。
0186デフォルトの名無しさん2009/06/20(土) 16:34:41
コントロールの座標をクライアントから見たい座標で取得する方法でいいのないな?

今はコントロールとクライアントの二つをGetWindoxRectでスクリーン座標から強引に求めてるが
どうも違う
0187デフォルトの名無しさん2009/06/20(土) 16:43:25
>>186
MapWindowPoints関数を使え。
0188デフォルトの名無しさん2009/06/20(土) 16:59:52
ウェブのMSDNって「戻り値」の説明だけごそーり消えてるんだけどなんなんだあれ?
直す気ないのかな?
0189デフォルトの名無しさん2009/06/20(土) 17:00:31
関数とprintfとかとAPIはどっちが遅いの?
0190デフォルトの名無しさん2009/06/20(土) 17:01:21
>>181
ImmGetConversionList でいけるはず
0191デフォルトの名無しさん2009/06/20(土) 17:26:14
>>190
IME2003以降では使えないけどな
0192デフォルトの名無しさん2009/06/20(土) 17:47:12
>>189
自分で調べろ
0193デフォルトの名無しさん2009/06/20(土) 17:48:37
FF11 のいずれかを含むページは 10752 ページ中、 164 ページ見つかりました。
0194デフォルトの名無しさん2009/06/20(土) 17:48:59
誤爆した
0195デフォルトの名無しさん2009/06/20(土) 18:01:34
>>189
OSで応答する分APIが遅い
0196デフォルトの名無しさん2009/06/20(土) 18:52:31
>>187
有難うございます!!
0197デフォルトの名無しさん2009/06/20(土) 18:54:46
>>195
は?
0198デフォルトの名無しさん2009/06/20(土) 19:11:46
システムフックするソースとか見ると、DLL側で良く

#pragma data_seg(".ShareForHook")
HHOOK MouseHook = NULL;
#pragma data_seg()

を眼にするんだが、何でこれをする意味が良く分からない。
単純にHHOOK MouseHook = NULL;じゃ駄目なの?
0199デフォルトの名無しさん2009/06/20(土) 19:15:11
#pragma data_segってのはプロセス間での共用メモリスペースを作るオプションでな
その中で宣言された変数はどこのプロセスで変更しても全てのプロセスに伝わるわけだ

何で必要なのかはCallNextHookExの第一引数見れば分かる
2000以降は要らないんだっけかな
0200デフォルトの名無しさん2009/06/20(土) 19:15:12
理由もちゃんと書いてあるだろ
0201デフォルトの名無しさん2009/06/20(土) 19:26:23
>>197
ライブラリの関数は同じ実行ファイル内にリンクされるのでコストは自分と定義した関数と同じ
APIの場合は、IPCを通じてOS内部にある関数本体のアドレスに引数を渡して結果を受け取るためコスト増
0202デフォルトの名無しさん2009/06/20(土) 19:31:04
ああこいつ馬鹿か
0203デフォルトの名無しさん2009/06/20(土) 19:34:53
素直に頭が悪くて理解できないと言えよw
0204デフォルトの名無しさん2009/06/20(土) 19:36:31
printfもOSのAPI内部で呼ぶっつーの馬鹿
0205デフォルトの名無しさん2009/06/20(土) 19:37:02
自分で定義した関数で、想定されうるあらゆるデバイスに対して出力できる処理かいてるのか
0206デフォルトの名無しさん2009/06/20(土) 19:38:39
>>199
有難う!
MSDNでのSetWindowsHookEx関数では
>グローバルフックは共有リソースであり
と書いてあった
正直まだ解せない部分もあるけど、システムフックの最低限必要のマナーなのね
02071992009/06/20(土) 19:43:48
ああ、理解力なさそうだね
0208デフォルトの名無しさん2009/06/20(土) 20:15:17
>>189=>>195=>>201=>>203
0209デフォルトの名無しさん2009/06/20(土) 21:39:29
>>190
ImmGetConversionListを使う方法を教えていただき、どうもありがとうございました。
結論からすると、やはり逆変換はMSIME2002ではできて、ATOK2006ではできなかったです。
ソースコードは下記をそのまま使いました。
http://athomejp.com/goldfish/api/yomichange.asp

ATOKの2006は鬼門バージョンなんですかねw
0210デフォルトの名無しさん2009/06/20(土) 21:54:53
まぁ、そんなもんじゃね?

あとは、実際の動作をエミュレートするかだな。
0211デフォルトの名無しさん2009/06/20(土) 21:56:13
プログラム書いていていつも思うのは
LeftとRightとかBeginとEndとか
長さが違うのが無性に腹立つんだが
欧米人には美的感覚ってものが無いのか?
0212デフォルトの名無しさん2009/06/20(土) 22:02:25
>>211
まずプログラミング言語ありきってか
0213デフォルトの名無しさん2009/06/20(土) 22:12:34
外人さんのデモ見てると、プロポーショナルフォントだったりするしな・・・
02141902009/06/21(日) 00:06:52
>>209
2006ではだめですか。ATOK2005は確か出来たはずなんですが… 残念です。
0215sage2009/06/21(日) 01:02:46
自分は漢字の読み仮名の取得には
IFELanguageを使ってるが。
0216デフォルトの名無しさん2009/06/21(日) 13:30:24
DLして読めるWin32APIのドキュメントってどこにあるんですか?
MSDNだとインターネット接続していないと読めないので
0217デフォルトの名無しさん2009/06/21(日) 13:45:41
>>216
英語でよければ
http://ghirai.com/hutch/files/win32hlp_big.zip
0218デフォルトの名無しさん2009/06/21(日) 14:05:47
>>216
ローカル版のMSDNライブラリ
http://www.microsoft.com/downloads/details.aspx?familyid=7BBE5EDA-5062-4EBB-83C7-D3C5FF92A373&displaylang=ja
0219デフォルトの名無しさん2009/06/21(日) 14:11:22
>>218
2627.9 MBって大変だな。
0220デフォルトの名無しさん2009/06/21(日) 15:30:10
αRGBをunsigned longに入れた配列を画面に描画したいんですけど
一番高速な方法はどんなものでしょうか?
0221デフォルトの名無しさん2009/06/21(日) 15:42:17
透かしを入れないのであれば、素直にBitBltをすれば。
アルファブレンドをするのであれば
http://d.hatena.ne.jp/n7shi/20080323/1231278248
0222デフォルトの名無しさん2009/06/21(日) 16:39:09
このスレ的にはAlphaBlendだろ? しかも>>221のリンク先計算式間違いすぎ
0223デフォルトの名無しさん2009/06/21(日) 16:46:00
前に見たやり取り
0224デフォルトの名無しさん2009/06/21(日) 20:22:41
WZC API(KB918997)だがリファレンスが見つからない
どこにあるかご存知の方おられますか?
0225デフォルトの名無しさん2009/06/21(日) 20:43:27
>>224
site:microsoft.com wzcでググったらこれが見付かったんだけど違う?

Wireless Zero Configuration Reference
http://msdn.microsoft.com/en-us/library/ms706593.aspx
0226デフォルトの名無しさん2009/06/21(日) 20:54:18
>>225
ありがとう、MSDNは見たはずなんだが抜かってたか・・・
0227デフォルトの名無しさん2009/06/21(日) 21:42:41
ステータスバーをオーナードローしてるんだが
プログラム起動時に、メインウィンドウとステータスバーのスタイルを弄ると
WM_DRAWITEMの通知の際、CtrlTypeがODT_MENUになるんだが何故?
今まではswitchのdefaultでステータスバーを描画してたが
今はCtrlIDで分岐して描画してる。綺麗な方法じゃないけどね
0228デフォルトの名無しさん2009/06/21(日) 22:00:34
SDKのリファレンスだと、CtrlTypeは未定義だと書かれているな。
CtrlIDで分岐するのはむしろ正解っぽい。
0229デフォルトの名無しさん2009/06/21(日) 22:27:16
>>228
そうなのかっ
ODT_TABとか色々使ってるから、今更IDで判断なんて面倒すぎだぞ…
とりあえずステータスバーだけIDで判断する。有難うね。
0230デフォルトの名無しさん2009/06/21(日) 22:30:03
dllの暗黙のリンクの場合関数が存在するかどうかはアプリ起動時にチェックされる?
それとも関数を呼び出すところで初めてチェックされる?
0231デフォルトの名無しさん2009/06/21(日) 22:37:00
静的リンクだよね?起動時じゃないか?
Win2k以降のAPIを静的リンクしたEXEを98で実行したら速攻でエラー落ちした
0232デフォルトの名無しさん2009/06/21(日) 22:42:33
やはりそうかthx
自分も書き込んだ後実験して起動時に落ちたわ
0233デフォルトの名無しさん2009/06/21(日) 22:53:56
>>230
dllを遅延ロードにすると、初めて読んだところで例外が発生する。
0234デフォルトの名無しさん2009/06/22(月) 00:16:13
>>231
静的リンクと呼びたくなるのは分かるが、それは静的リンクじゃなくて暗黙(的)リンクが正しい。
0235デフォルトの名無しさん2009/06/22(月) 00:41:20
だからAPIが遅い
0236デフォルトの名無しさん2009/06/22(月) 01:26:00
API"も"遅い
0237デフォルトの名無しさん2009/06/22(月) 01:55:58
MSDN Express LibraryってExpressじゃないのとどう違うか分からんのだが
日本語の項目が少ないとかそういうのか?
0238デフォルトの名無しさん2009/06/22(月) 02:16:13
一部省略されている情報があるようだ。仔細に調べたわけじゃないが、俺が気づいた範囲では、
.NETのSocketクラスが載ってなかったりした。
0239デフォルトの名無しさん2009/06/22(月) 09:30:50
hDCBuffer = CreateCompatibleDC( hDC );
hBitmap = CreateCompatibleBitmap( hDC, 200, 200 );
SelectObject( hDCBuffer, hBitmap );

と
for( int i = 0 ; i < 3 ; i++ ) {
hDCBuffer[i] = CreateCompatibleDC( hDC );
hBitmap[i] = CreateComaptbileBitmap( hDC, 50, 50 );
SelectObject( hDCBuffer[i], hBitmap[i] );
}

では、最初の奴の方がメモリは少なく済むんだよね?
0240デフォルトの名無しさん2009/06/22(月) 10:04:07
メモリ1ギガもあれば誤差
0241デフォルトの名無しさん2009/06/22(月) 12:05:20
GetDC()を行った後にReleaseDC()をしなければいけないのは
分かっているんですが
GetDC()をnewした場合はReleaseDC()をした後に
deleteをしなければならないのでしょうか?
教えてください。
0242デフォルトの名無しさん2009/06/22(月) 12:23:47
お前は何を言っているんだ?

とりあえず、"GetDB()をnewする" のソースコードを書いてみろ
0243デフォルトの名無しさん2009/06/22(月) 12:24:27
GetDC()をnewするって言うのが何を指してるのかわからないが
HDC *phdc = new HDC;
*phdc = GetDC( ... );
ていうことならWin32 API以前にC++の問題。
0244デフォルトの名無しさん2009/06/22(月) 12:26:08
GetDC ⇔ ReleaseDC の対は Win32APIの要求
new ⇔ delete の対は (多分)C++ の要求
02452412009/06/22(月) 13:20:12
よく理解しないまま質問してしまってすみません。
HDC *phdc = new HDC;
*phdc = GetDC( ... );
の後に、
ReleaseDC(phdc);
delete phdc;
としなければならないか?
と言う事です。
>>244さんの返答からして必要そうな感じはしていますが。。。

0246デフォルトの名無しさん2009/06/22(月) 13:29:00
ReleaseDC( *phdc ); が正解な
もっと基本的な部分から勉強しなおした方がいいと思う。

new/deleteはAPIの動作とまったく関係ない.し、newで確保したメモリがReleaseDCで解放されることはない。
02472412009/06/22(月) 13:33:25
>>246さん
ありがとうございました。
馬鹿ですみません。
02481092009/06/22(月) 18:44:40
>>111
マイク入力を使わずにできますか?
調べましたが、そういう方法はわかりませんでした。
02491092009/06/22(月) 19:26:28
どういうソフトを作りたいかというと、たとえば
Windows上で任意のいろんなソフトが動いていて、それぞれのソフトが音を出したり出さなかったりするわけですけど、
それらすべての音をスピーカーに出力しながら音声認識して文字で表示するようなものを作りたいのです。
スピーカー出力をマイク入力に直結するようなやり方はしたくありません。
0250デフォルトの名無しさん2009/06/22(月) 19:34:33
無理
0251デフォルトの名無しさん2009/06/22(月) 19:47:18
実行状態のスレッドIDを取得できるWin32APIはありますか?
0252デフォルトの名無しさん2009/06/22(月) 20:29:08
>>249
ステレオミキサーで検索
0253デフォルトの名無しさん2009/06/22(月) 20:34:44
>>251
GetThreadId
02542512009/06/22(月) 20:42:31
>>253
Thank you!
0255デフォルトの名無しさん2009/06/23(火) 03:59:15
自作の常駐ソフトを,管理者権限でOS起動時に実行することは可能でしょうか?
今はレジストリのRunに登録して自動実行していますが,これだと管理者権限で
起動できません.かといってrequireAdministratorを設定すればOS起動時にUAC
が出てきてしまいます.
OSはVista 32-bitを使用しています.
0256デフォルトの名無しさん2009/06/23(火) 04:02:32
サービス化とかでぐぐれ
0257デフォルトの名無しさん2009/06/23(火) 04:05:14
無理
0258デフォルトの名無しさん2009/06/23(火) 07:17:57
タスクに登録
0259デフォルトの名無しさん2009/06/23(火) 10:40:55
>>255
OS起動時ならサービスに、ログイン時ならタスクで
0260デフォルトの名無しさん2009/06/23(火) 10:45:15
ポップアップメニューにポップアップメニューを追加したら
追加されたポップアップメニューを破棄すれば追加したのも一緒に破棄される?
0261デフォルトの名無しさん2009/06/23(火) 10:45:28
ああでもログイン者がアドミン権限無いならタスクじゃ無理かな。
サービスが確実。
0262デフォルトの名無しさん2009/06/23(火) 15:47:10
SetThreadPriorityをスレッド休止中に行ったらエラーになりますか?
02632552009/06/23(火) 17:15:02
ありがとうございます.

 1. 自作常駐ソフトをサービス化する
 2. 他のサービスプログラムを作り,そのサービスから自作常駐ソフトを起動するようにする

現在管理者権限で起動したい常駐ソフトが2個ほどあるので,1の方法より汎用性が高い2
の方法を検討しているのですが,サービスから起動するプロセスは管理者権限を得られる
のでしょうか?
0264デフォルトの名無しさん2009/06/23(火) 18:23:57
ツールバーのボタンの文字列を得るにはどうすればいいんでしょうか
0265デフォルトの名無しさん2009/06/23(火) 18:49:54
GetWindowText
0266デフォルトの名無しさん2009/06/23(火) 20:42:09
>>263
|| [最上位の特権で実行する] チェック ボックスをオンにすると、
|| タスク スケジューラは、最小限の特権 (UAC) トークンではなく
|| 管理者特権トークンを使用してタスクを実行します。

ってあるじゃん。わざわざ作るまでもなく、タスクスケジューラで OK
0267デフォルトの名無しさん2009/06/23(火) 20:47:51
スクリーンキーボード(ゲームパッド型)+コマンドコントローラーみたいなアプリって難しい?
0268デフォルトの名無しさん2009/06/23(火) 20:51:38
難しいかどうか判断が付かないレベルでは難しいね
0269デフォルトの名無しさん2009/06/23(火) 21:16:15
ドライブがフォーマットされてるかどうかを調べる関数があれば教えてください
0270デフォルトの名無しさん2009/06/23(火) 21:18:54
>>269
ファイルが読み書きできれば、フォーマットされてる。
0271デフォルトの名無しさん2009/06/23(火) 21:54:28
もっと真摯に回答しろよ・
0272デフォルトの名無しさん2009/06/23(火) 22:17:54
>>266
実行するユーザーが管理者権限無いと管理者にはならないよ、あたりまえだけど。
0273デフォルトの名無しさん2009/06/23(火) 22:43:38
dumpbinでdllのシンボルが見れるっていうんで試したんですけど、どこにも関数名が出てこないです

dll.cpp
extern "C" __declspec(dllexport) int __stdcall sq(int x);
int __stdcall sq(int x) {return x * x;};

コマンドプロンプトで
dumpbin /SYMBOLS dll.lib
0274デフォルトの名無しさん2009/06/23(火) 22:45:13
出力はこんな感じです
どこにもsqがでてきません・・・ちなみにコンパイラはVC++2008EEです

COFF SYMBOL TABLE
000 00937809 ABS notype Static | @comp.id
001 00000000 SECT2 notype External | __IMPORT_DESCRIPTOR_dll
002 C0000040 SECT2 notype Section | .idata$2
003 00000000 SECT3 notype Static | .idata$6
004 C0000040 UNDEF notype Section | .idata$4
005 C0000040 UNDEF notype Section | .idata$5
006 00000000 UNDEF notype External | __NULL_IMPORT_DESCRIPTOR
007 00000000 UNDEF notype External | dll_NULL_THUNK_DATA

String Table Size = 0x4A bytes
■ このスレッドは過去ログ倉庫に格納されています