トップページ⇒tech
995コメント264KB

Win32API質問箱 Build87

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

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

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

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

Win32API質問箱 Build86
http://pc12.2ch.net/test/read.cgi/tech/1265350980/
0082デフォルトの名無しさん2010/04/06(火) 23:32:12
WMIのWin32_IP4PersistedRouteTableでも使えば
0083デフォルトの名無しさん2010/04/07(水) 04:30:11
アプリの実行環境がコンソールかGUIかってのはAPIとは直接関係ないだろ。
どっちでも同じAPIを呼んで同じ情報が取得できるはず。
0084デフォルトの名無しさん2010/04/07(水) 16:36:08
mmsystem.hをインクルードすると大量のエラーが出てコンパイルできません。
コンパイラはicl 11.0、OSはWindows XP 64bitです。
0085デフォルトの名無しさん2010/04/07(水) 19:09:19
デスクトップのディスプレイの明るさを変えるapiはありませんか?ノートPCならIOCTLのブライトネストでかえれるらしいのですが。osはxpです
0086デフォルトの名無しさん2010/04/07(水) 19:29:55
VGAの色補正ならドライバをリバースエンジニアリングすれば出来ない事もないけど
ディスプレイの調整は、そのインターフェースがあるなんて聞いた事無い
0087デフォルトの名無しさん2010/04/07(水) 19:42:22
ある
0088デフォルトの名無しさん2010/04/07(水) 20:21:20
>>85
Vista以降ならある。
0089デフォルトの名無しさん2010/04/08(木) 08:30:15
ありがとうございます。xpにはやはりなさそうですか。助かりました。
0090デフォルトの名無しさん2010/04/08(木) 12:05:40
FindNextFile() でCドライブ配下の全てのファイルをカウントするだけのプログラムを作成してみました。
PC起動時の初回と2回目以降に実行し他場合、処理速度が100倍ぐらい違うのですが、どうしてでしょうか?
0091デフォルトの名無しさん2010/04/08(木) 12:11:31
Cache
0092デフォルトの名無しさん2010/04/08(木) 12:52:23
WinMainでDialogBoxを呼び出してモーダルダイアログを出します。
そのモーダルダイアログのボタンを押したときモードレスダイアログを出したいのですが、
メッセージループが表面上にないので、IsDialogMessage() 関数を追加する方法が分かりません。
どうようにすればいいでしょうか?
0093デフォルトの名無しさん2010/04/08(木) 13:47:10
メッセージループを追加する
0094922010/04/08(木) 15:51:22
#include <windows.h>

INT_PTR CALLBACK SubProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
switch (msg) {
case WM_CLOSE:
DestroyWindow(hWnd);
return TRUE;
}
return FALSE;
}

INT_PTR CALLBACK MainProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
switch (msg) {
case WM_INITDIALOG:
CreateDialog((HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), "SubDLG", hWnd, SubProc);
return TRUE;
case WM_CLOSE:
EndDialog(hWnd, TRUE);
return TRUE;
}
return FALSE;
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hprev, LPSTR cmd, int show) {
DialogBox(hInst, "MyDLG1", NULL, MainProc);
return EXIT_SUCCESS;
}

>メッセージループを追加する
どこに追加すればいいでしょう…
0095デフォルトの名無しさん2010/04/08(木) 15:55:17
ダイアログプロシージャ内
それで問題があるならスレッドを起動する
0096922010/04/08(木) 17:15:01
いやその。。。
ダイアログプロシージャ内に入ったときはDispatchMessageが呼ばれているし、
スレッド立てたらメインスレッドのメッセージは読めないと思うんですが。。。

0097デフォルトの名無しさん2010/04/08(木) 17:51:17
>>96
> WinMainでDialogBoxを呼び出してモーダルダイアログを出します。

これを止めて
モードレスダイアログ MainProc側 生成 → メッセージループ (EndDialog() 呼び出しの確認だけ ちょこっと工夫)

メッセージループ内
 MainProc側
  何らかのトリガーで SubProc側生成
0098デフォルトの名無しさん2010/04/08(木) 20:20:06
リモートのIPアドレスからコンピューター名を得る方法ありますか?
自分も相手もWindows(XP以降)です
正しくはコンピューター名じゃなくてUNC名ですが
0099デフォルトの名無しさん2010/04/08(木) 20:21:33
>どこに追加すればいいでしょう…

どこでもいい
君のプログラムにとって必要な場所に追加する

>ダイアログプロシージャ内に入ったときはDispatchMessageが呼ばれているし、

DispatchMessageから呼ばれたプロシジャの中でDispatchMessageを呼んではいけないという規則は無い
自分でイベントループを回すとはそういうこと

>スレッド立てたらメインスレッドのメッセージは読めないと思うんですが。。。

読める
0100922010/04/08(木) 20:28:31
お陰さまで、解決しました。
WinMainのモーダルダイアログを、モードレスにし、自分でメッセージループを回すことで、
サブ側もタブストップ効くようになりました。

ありがとうございました。


0101デフォルトの名無しさん2010/04/08(木) 20:35:06
メッセージループとイベントループってどっちが正しいの?
0102デフォルトの名無しさん2010/04/08(木) 21:14:40
>>101 用語の話ってことなら、win32的にはメッセージループじゃね?
で、そのメッセージって何?って聞かれたなら、それは各種イベントって感じ
0103デフォルトの名無しさん2010/04/08(木) 22:17:25
>98
IPアドレス→MACアドレス→マシン名
ARPとNetBIOS(NBT)とか?
0104デフォルトの名無しさん2010/04/08(木) 22:17:56
イベントループなんて聞いたことないな

イベントで思いつくのはイベントハンドラだな。
0105デフォルトの名無しさん2010/04/08(木) 22:40:33
自己解決しました
0106デフォルトの名無しさん2010/04/08(木) 23:20:09
>>105
解決したときはどうやって解決したか書いておくと
後の人のためになるよ。
0107デフォルトの名無しさん2010/04/08(木) 23:27:10
2chでの「自己解決しました」だけの書き込みは99.9%赤の他人。
0108デフォルトの名無しさん2010/04/09(金) 04:45:12
   ┌─┐
   │●│
   └─┤
   _   ∩
  ( ゚∀゚)彡
┌─┬⊂彡
│●│ おっぱい!おっぱい!
└─┘      おっぱい!おっぱい!
0109デフォルトの名無しさん2010/04/09(金) 05:08:12
SetLayeredWindowAttributesでクライアント領域を透過させて
そこに表示する文字もSetBkModeで透過させることができたんですが
CreateFontで作成した文字列だと文字の周りにデフォルトの背景色が出てしまって
透過できないんですがどうすればいいですか
0110デフォルトの名無しさん2010/04/09(金) 07:35:47
自己解決しました。
0111デフォルトの名無しさん2010/04/09(金) 08:28:52
デフォルトの背景色をα値にするとか
0112デフォルトの名無しさん2010/04/09(金) 09:29:03
http://wisdom.sakura.ne.jp/system/winapi/win32/win21.html
0113デフォルトの名無しさん2010/04/09(金) 09:44:12
ヘルパーAPIでPersistent Routesのリスト取得や追加や削除を教えてくださいよ
0114デフォルトの名無しさん2010/04/09(金) 10:14:13
http://msdn.microsoft.com/en-us/library/aa366071(v=VS.85).aspx
0115デフォルトの名無しさん2010/04/09(金) 10:24:54
いや
何度も書かれている
お前の目が節穴だっただけ

大抵の人はフィルタを通して物(この場合スレの書き込み)を見てしまう
大事なことが書かれていてもそれに気付くためには
本人がそれを受け入れるための準備が必要なんだ
0116デフォルトの名無しさん2010/04/09(金) 10:54:45
>>113 お前まだそれやってたのか
まさか全部人に聞かないと書けない=コピペしか出来ない奴なのか
0117デフォルトの名無しさん2010/04/09(金) 12:10:03
ソケット通信でUDPを使っているのですが
そのときに、ポートを5000を使って送信する時に
srcポートとdstポートが同じになってしまいます。
これをsrcは自動?割り振りでdstが指定したポート番号になる方法を教えてください。
オープンはこんな感じで行っています。
struct sockaddr_in sa;
SocketHandle = ::socket( AF_INET, SOCK_DGRAM, 0 );
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = INADDR_ANY;
sa.sin_port = ::htons( iPort );
::bind( SocketHandle, (struct sockaddr *)&sa, sizeof( sa ) );
0118デフォルトの名無しさん2010/04/09(金) 13:55:33
Yahoo!知恵袋でも聞いているのですが返事がこなさそうなのでこちらでお聞きします。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail.php?qid=1239071767

UnhookWindowsHookExがいくらやっても失敗します。
http://ir9.jp/prog/ayu/datlog/tech_win32api/1069339866/1069339866_02.html
の411のかたも同じ状況だったようですが解決されなかったようですね。
メインプロセスからSetWindowsHookExを呼んで、同プロセス内でUnhookWindowsHookExを解除するところで失敗します。
エラーコードを吐かせてみたところやはりフックハンドルが無効というものでした。
しかし、フックハンドルの値もint型にキャストして吐かせてみたところ、
Set〜から最後までずっと同じ値をとっていました。
フックは正常に作動しているので解除できないと気持ち悪いです。

しかし失敗のメッセージが表示されたあとは、フックが解除されているんです。
さらにキーフックが起こっていない状態でUnhookすると成功するんです。
なんなんでしょうか。。。。
0119デフォルトの名無しさん2010/04/09(金) 14:04:46
>>118
マルチ乙
返事がこなさそうって失礼にも程がある

0120デフォルトの名無しさん2010/04/09(金) 14:08:30
まぁ来ないけどね
0121デフォルトの名無しさん2010/04/09(金) 14:39:57
ahoo!知恵遅れ袋で聞くってアホとしか
01221182010/04/09(金) 14:57:11
フック関連のは何度か質問してるんですがYahoo!知恵袋は一度も返事が来ません。
私の質問履歴にないのは全部そのまま消えていくからですorz
なんでしょうかね。めんどくさいのかわからないのか。
マルチなんぞに返答をくれる方お願いします。

キーイベントが発生したときのみエラーが起きているので、フックプロシージャかなんかに問題でもありますかね?
キーイベントの有無による違いはそれくらいだと思うんですが。
0123デフォルトの名無しさん2010/04/09(金) 15:52:19
>>118
開発環境は?
hHookはどこでどう宣言してる?
0124デフォルトの名無しさん2010/04/09(金) 16:01:20
ぐだぐだほざいてないでさっさと教えやがって下さいよ
0125デフォルトの名無しさん2010/04/09(金) 16:21:32
雑魚しかいないから教えれる奴がいないんだろw
0126デフォルトの名無しさん2010/04/09(金) 16:25:23
なんか数日前から騙って踊れるキチガイが1匹わいてるな
0127デフォルトの名無しさん2010/04/09(金) 16:38:54
16:25:23 にも基地外が沸いてるね
0128デフォルトの名無しさん2010/04/09(金) 17:31:09
ここまで俺の自演
0129デフォルトの名無しさん2010/04/09(金) 17:51:33
↑
2ちゃんの画一的なコメント 乙
0130デフォルトの名無しさん2010/04/09(金) 18:01:47
別の症状だと思うがsmss.exeなど入力のないシステムプロセスにフックしたまま解除不能になった事ならある
case DLL_PROCESS_ATACH:
if (!GetModuleHandle("USER32.DLL") return FALSE;
0131デフォルトの名無しさん2010/04/09(金) 18:07:58
>>118
WM_KEYHOOKのプロシージャでResetHookを呼んでいるんだろうけど
SendMessageしたらいかんだろ。
0132デフォルトの名無しさん2010/04/09(金) 19:05:15
>117
1) bindのsin_portを0にする
2) bindやめてconnect呼ぶ。(後続するsendtoはsendに変える)
1,2の好きな方を選んだら?
0133デフォルトの名無しさん2010/04/09(金) 20:08:04
WM_KEYHOOKを受け取ったウィンドウプロシージャで
何をやってるか示さないと答えようがないわけだが
まぁ>>131の可能性が高そうだけど
0134デフォルトの名無しさん2010/04/09(金) 23:24:48
ドライブレターからフロッピードライブか否かを判別する方法はないですか?
GetDriveTypeではリムーバブルって返って来るだけで、フロッピーではないかも知れませんし、
SetupDiEnumDeviceInfoとSetupDiGetDeviceRegistryPropertyでQueryDosDeviceで得た文字列と同じものを探して関連付けようと試みましたがヒットしないです...。

QueryDosDeviceでは"\Device\Floppy0"が返って来ましたが、SetupDiGetDeviceRegistryPropertyではフロッピー系は"\Device\FloppyPDO0"が見つかっただけでした
0135デフォルトの名無しさん2010/04/09(金) 23:41:09
フロッピーはAドライブだろ常考
01361182010/04/09(金) 23:58:31
>>135
ん?ドライブレター変えたらどうすんの???
責任取れるの?

0137デフォルトの名無しさん2010/04/10(土) 02:26:34
>>136
なんだてめぇ
01381342010/04/10(土) 03:20:14
なんかDeviceIoControlとIOCTL_DISK_GET_MEDIA_TYPESで簡単に識別できるみたいです ノシ
0139デフォルトの名無しさん2010/04/10(土) 08:58:46
思いつきの裏技だがシェルアイコンのインデックスで判定するとかw
0140デフォルトの名無しさん2010/04/10(土) 14:15:55
HKEY_LOCAL_MACHINE\SYSTEM\MountedDevicesを開いて
\DosDevices\〜からパス取り出して
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enumからそのパスを開いて
ClassGUIDとかで区別できると思うけど

>>135
ねぇPC98版Windowsって知ってる?
0141デフォルトの名無しさん2010/04/10(土) 14:17:58
Windows3.x 以前のは Windows じゃないことにしておこう
0142デフォルトの名無しさん2010/04/10(土) 14:18:26
知らん。
0143デフォルトの名無しさん2010/04/10(土) 14:20:21
あと3ヶ月だねぇ。
0144デフォルトの名無しさん2010/04/10(土) 14:46:36
ユーザーにドライブの正体は何ですか
といちいち設定させるUIでも作った方が確実
アホな自動認識よりはユーザーもそっちを選ぶ
0145デフォルトの名無しさん2010/04/10(土) 14:57:10
>>141
Windows98もNTもPC98版が存在したが、いったいなにをどうしておきたいんだ?
0146デフォルトの名無しさん2010/04/10(土) 18:40:57
質問者当人の>>138で終わった話なのに何やってるんだ?
http://support.microsoft.com/kb/163920/en
0147デフォルトの名無しさん2010/04/10(土) 20:54:37
アプリの二重起動を防ぐのにMutexを使っていたけど、
これってひょっとして名前付きのカーネルオブジェクトならなんでもいいって事?

OpenJobObjectとか
0148デフォルトの名無しさん2010/04/10(土) 20:55:18
OpenじゃなかったCreateか
01491182010/04/10(土) 21:35:09
>>148
WinMainの2つ目の引数を使えばええやん
そのためにあるのだよ
0150デフォルトの名無しさん2010/04/10(土) 21:39:48
16bit時代の方ですか?
0151デフォルトの名無しさん2010/04/10(土) 21:40:08
ネタだよな。

hPrevInstance
アプリケーションの前のインスタンスのハンドルが入ります。
Win32 アプリケーションでは、常に NULL です。
0152デフォルトの名無しさん2010/04/10(土) 22:02:37
>>147
自分はそう解釈して、CreateFileMappingで二重起動時にアクティブにしたいWindowハンドル入れて使ってる。
勝手解釈なんで、有識者にほんとに問題ないか聞きたい。
0153デフォルトの名無しさん2010/04/10(土) 22:03:28
>>147
Openは使うなよ、全般的に
0154デフォルトの名無しさん2010/04/10(土) 22:11:01
さすがイミフな質問するだけあって回答も廃クオリティ
0155デフォルトの名無しさん2010/04/10(土) 22:36:14
共有セクションを入れたDLLを静的リンクして、共有セクションにある変数を見るとか
0156デフォルトの名無しさん2010/04/10(土) 22:39:50
>DLLを静的リンク
どういうこと?
0157デフォルトの名無しさん2010/04/10(土) 22:48:39
>>154
坊や何の意味がわからないのだね?
0158デフォルトの名無しさん2010/04/10(土) 22:55:54
>>156
なんかおかしくなってた
つまり、libファイルをリンクして、共有セクションのあるDLLが常にロードされるようにしておく
01591182010/04/10(土) 23:04:48
全部ダメ。0点。

レジストリにキーを作るくらいダメ解答ばかりやな。
0160デフォルトの名無しさん2010/04/10(土) 23:07:56
>>155
でもそれ同じパスにあるDLLがロードされないとだめだろ
0161デフォルトの名無しさん2010/04/10(土) 23:08:34
>>158
意味内よねw
01621182010/04/10(土) 23:31:40
にゃあ
0163デフォルトの名無しさん2010/04/10(土) 23:35:54
ダイナミックなんとかライブラリ
0164デフォルトの名無しさん2010/04/10(土) 23:49:26
共有セクションをDLLにする必要はなぜ
0165デフォルトの名無しさん2010/04/11(日) 00:52:40
EXE内にしたらコピーするだけで回避出来るぜ
0166デフォルトの名無しさん2010/04/11(日) 14:19:59
リソース無しでプロパティシート作るには?
これが出来ると vc と gcc でソース共通にできそうなのですが。
メニューバーは簡単だった。
0167デフォルトの名無しさん2010/04/11(日) 20:09:36
   ┌─┐
   │●│
   └─┤
   _   ∩
  ( ゚∀゚)彡
┌─┬⊂彡
│●│ おっぱい!おっぱい!
└─┘      おっぱい!おっぱい!
01681182010/04/11(日) 22:11:36
122以外で118名乗ってるやつ何者www

SendMessageんとことその他いろいろ変えてみたらまぁそこは解決できたっす。
しかし次の問題点。
メインウィンドウのハンドルをWM_CREATE時にDLL側に渡してるんですよ。
それがメインウィンドウがアクティブなときは大丈夫なんだけど、
アクティブじゃなくなるとそのウィンドウハンドルがどっかいくそうです。笑
WM_CREATEで一度しか渡してないのにghWndの値が勝手に変わってるみたいっす。
勝手にってのはありえないけど、実際俺はghWndの値をその一度しかセットしてないのにNULLになってるんですよ。
WM_CREATEのところはただ単に関数でghWndにウィンドウハンドルを渡すだけですので省略しますね。

HWND ghWnd;
LRESULT CALLBACK MyHookProc (int nCode, WPARAM wp, LPARAM lp)
{
if (nCode<0)
_goto ret;
else if (ghWnd==NULL)
_MessageBox(NULL, "ウィンドウハンドルがないっす笑", "DLL", MB_OK);
else if (wp==VK_ESCAPE)
_PostMessage(ghWnd, WM_KEYHOOK, (WPARAM)0, (LPARAM)0);
ret:
_return CallNextHookEx(hHook, nCode, wp, lp);
}
0169デフォルトの名無しさん2010/04/11(日) 22:27:09
DLLの使い方くらい勉強しようぜ
0170デフォルトの名無しさん2010/04/11(日) 22:33:08
頭ぶつけて死んだ方が早そう
01711182010/04/11(日) 22:43:58
>>169
わからないので具体的にお願いします。
どうすればウィンドウハンドルを保持しつづけられますか?
http://www.kumei.ne.jp/c_lang/sdk2/sdk_163.htm
とか見る限りだとグローバル変数はDLLが開放されるまで値が保持されると思うんですが。
0172デフォルトの名無しさん2010/04/11(日) 22:48:00
大抵のバグは本人が問題ないと思って省略しているところにある
0173デフォルトの名無しさん2010/04/11(日) 22:53:44
グローバル変数といえどもプロセス間では共有されないのは分かってるんだろうか
共有したいならセグメントを共有するよう指定してやる必要がある
#pragma data_seg("Shared")
HWND ghWnd = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:Shared,rws")
0174デフォルトの名無しさん2010/04/11(日) 22:59:49
>>171
サンプルに毛を生えらかした程度の事で
ハマっちゃう人の気持ちって分かる人は少ないから
全ソースうpってみたら?
0175デフォルトの名無しさん2010/04/11(日) 22:59:49
口調もコードも全てか低脳臭くて^^;
01761182010/04/11(日) 23:07:58
>>175
(建前)
わかんねえなられすすんな
俺の質問に答えてりゃいいんだよ!!!

(本音)
こいつらつかえねー
0177デフォルトの名無しさん2010/04/11(日) 23:14:17
>>176
失せろ
0178デフォルトの名無しさん2010/04/11(日) 23:19:12
>>172
すっげえわかるw
いわゆる想定外
01791182010/04/11(日) 23:22:53
>>174
そうします。
書き方がやばくて恥ずかしいのであまり晒したくなかったのですが。w
現段階でのソースです。
http://space.geocities.jp/classcircle/MonitorDown.c
http://space.geocities.jp/classcircle/test.c
test.cがDLLのソースで、MonitorDownがメインのソースです。
モニターの電源を、Escが押される、もしくは停止ボタンが押されるまで、メッセージを送り続けることで消そうとしています。
BreakPointは簡単にメッセージボックスを表示させるマクロです。
他にわからない点があったら言ってください。
ボタンが異常に小さいのはリソースからそのまま移植したからです。
0180デフォルトの名無しさん2010/04/11(日) 23:32:40
>>179
全ソース
↑意味分かる?日本語だよ
無意味な略語や隠語を使いたがる人がいるけど
そのタイプの構ってさんなのかな?
01811182010/04/11(日) 23:39:59
プロジェクト的な意味ですか?
BCCですがMakeファイルの使い方知らないんでバッチで代用してます。
http://space.geocities.jp/classcircle/MonitorDown.zip
自作のライブラリっぽいものとヘッダファイルもあわせてこれで全部のはずです。
0182デフォルトの名無しさん2010/04/11(日) 23:41:46
bccって#pragma data_segとかサポートしてたっけ?
■ このスレッドは過去ログ倉庫に格納されています