Win32API質問箱 Build43
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/05/19(金) 11:25:09やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは>>2-5くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn.microsoft.com)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvencedWindowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで。
0685デフォルトの名無しさん
2006/06/13(火) 21:48:23SetErrorMode()
0686デフォルトの名無しさん
2006/06/13(火) 22:02:05SetErrorMode(SEM_FAILCRITICALERRORS);
で出来ました。ありがとうございます。
MFCはデフォルトでこの状態なんですかね。なんか恐ろしい。
0687デフォルトの名無しさん
2006/06/13(火) 22:26:510688デフォルトの名無しさん
2006/06/13(火) 23:57:250689デフォルトの名無しさん
2006/06/14(水) 00:07:450690デフォルトの名無しさん
2006/06/14(水) 00:23:060691デフォルトの名無しさん
2006/06/14(水) 00:47:260692デフォルトの名無しさん
2006/06/14(水) 01:53:38CreateWindowExでEDITコントロールを貼り付けたんですが、表示されなくて困っています
どうすればよいでしょうか?
0693デフォルトの名無しさん
2006/06/14(水) 02:49:100694デフォルトの名無しさん
2006/06/14(水) 07:24:110695デフォルトの名無しさん
2006/06/14(水) 08:11:24try, catch throw
例外処理
http://pc8.2ch.net/test/read.cgi/tech/1142667446/
template
【初心者歓迎】C/C++室 Ver.28【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1149815331/
0696デフォルトの名無しさん
2006/06/14(水) 14:01:360697デフォルトの名無しさん
2006/06/14(水) 14:02:370698デフォルトの名無しさん
2006/06/14(水) 14:18:12それだけの内容だと「ソースがおかしいんじゃね?」としか言えない。
って言うか、ちゃんと表示する様に指示しているか?
0699デフォルトの名無しさん
2006/06/14(水) 18:25:57処理したいのですが、どうすればいいですか?
ListBoxに LBS_NOTIFY を指定しても、 WM_NOTIFY メッセージが
送られてきていないようなのでちょっと困っています。
# ListViewなら普通に処理できそうなんですけどねぇ。。。
環境はMSVC++2005 ExpressEditionにPlatformSDKいれてやっています。
0700699
2006/06/14(水) 18:50:57WM_COMMAND で捕まえられるんですね。
0701デフォルトの名無しさん
2006/06/14(水) 21:23:05listboxでLBS_NOTIFY指定して、
WM_COMMANDでENTER捕まえることは可能ですか?
上手くいかない・・・
0702デフォルトの名無しさん
2006/06/14(水) 23:01:50現在キーボードエミュレートをするツールを開発しているのですが、キー(ファンクション)
の長押しを実装方法が分からないので質問にきました。
PostMessage(hwnd, WM_KEYDOWN, VK_F1,0)
PostMessage(hwnd, WM_KEYUP, VK_F1,0)
現在はこのようにPostMessage()を並べているのですが、これをどのように書き換えれば
F1キーを長押し(リピート)しているように見せかけられるのでしょうか?
UWSCのスクリプト内では私が求めているような挙動は以下のようにして得られています。
KBD(VK_F1,DOWN,30)
KBD(VK_F1,DOWN,30)
KBD(VK_F1,CLICK,40)
どうぞよろしくお願い致します。
-------------------
使用OS: windowsXP
開発環境:Bccコンパイラ
使用言語:C++
-------------------
0703デフォルトの名無しさん
2006/06/14(水) 23:34:38namespace Win{
#include <windows.h>
}
ってやったら便利かな?
インテリセンスでローカル識別子と一緒にAPI関数がズラズラ入っちゃうのを防げる。
0704デフォルトの名無しさん
2006/06/14(水) 23:50:26それでうまく動いてるんだったら、
PostMessage(hwnd, WM_KEYDOWN, VK_F1,0)
PostMessage(hwnd, WM_KEYDOWN, VK_F1,1)
PostMessage(hwnd, WM_KEYDOWN, VK_F1,2)
PostMessage(hwnd, WM_KEYDOWN, VK_F1,3)
PostMessage(hwnd, WM_KEYDOWN, VK_F1,4)
PostMessage(hwnd, WM_KEYUP, VK_F1,0)
で4回リピート。
0705デフォルトの名無しさん
2006/06/15(木) 00:04:49Win::CreateWindowの名前をリンカが解決できると思う?
0706702
2006/06/15(木) 00:12:00さっそく試してみましたが長押しだと認識しませんでした。
考えられることは
(1)Postmessage()では長押しは実現できない?
(2)Postmessage()以外にキーボードイベントを模索するべき?
(3)その他
このくらいしか思い浮かばないのですがどなたかアドバイスお
願いできないでしょうか?
0707デフォルトの名無しさん
2006/06/15(木) 00:21:020708702
2006/06/15(木) 00:24:29はい。その通りです。以下のサイトにそのように書いてあります。
ttp://wisdom.sakura.ne.jp/system/winapi/win32/win30.html
しかし、実際にはどのように引数としてLPARAMの内容を決定すれば
よろしいのでしょうか?
0709デフォルトの名無しさん
2006/06/15(木) 00:32:25解決してるみたいだけど
0710デフォルトの名無しさん
2006/06/15(木) 00:33:430711デフォルトの名無しさん
2006/06/15(木) 00:33:46そのサイトに書いてあるじゃん
>30ビット目は直前のキーの状態を意味します
>直前に発生したキーイベントが離されたものであれば0
>押された状態のものならば1であり、キーを離した時の状態はつねに1になります
>直前のキーストロークが押しつづけて発生したオートリピートの監視に使えます
>最後の31ビット目は、キーが押されたものであれば0、離されたものであれば1になります
>これは、WM_KEYDOWNでは0、WM_KEYUPなら1になっています
LPARAMの 0-15ビット目をなんか適当な数 30ビット目を1 31ビット目を0
にすりゃいいんでないの?試してないけど
0712デフォルトの名無しさん
2006/06/15(木) 10:46:02(親のウインドウにフォーカスいかなくなるような)
どのように実装したらいんでしょうか?
参考になりそうなソースなどご存じでしたら紹介してください。
0713デフォルトの名無しさん
2006/06/15(木) 10:52:140714デフォルトの名無しさん
2006/06/15(木) 11:38:21CreateDialogは駄目なの?
CreateDialogでダイアログ生成(仮:DialogA)
親WindowをEnableWindowで無効
↓
処理が終わったらDialogAをDestroyWindow()で消去前に
EnableWindow()で親Windowを有効に戻す
俺はこうやってるけど参考にならなかったらシカトしてくれ
0715702
2006/06/15(木) 11:39:31>>710さん
keybd_event()はwindowsXPではSendInput()推奨になっているようですね。
ただSendInput()のサンプルになりそうなプログラムってネットに転がってな
いようですね。。。ちなみにkeybd_event()でも試してみましたが、動作しませ
んでした。
>711さん
PostMessage(hwnd, WM_KEYDOWN, VK_F1, 0x3B0001);
for(int count=0;count<30;count++){
PostMessage(hwnd, WM_KEYDOWN, VK_F1, 0x203B0001);
}
PostMessage(hwnd, WM_KEYUP, VK_F1, 0);
こんな感じでビットの内容を指定したのですが動作しませんでした。
ちなみに走査コードは実際にF1キーを入力したときに確認した値を
代入しています。
まだ考えられる方法はあるでしょうか?
0716デフォルトの名無しさん
2006/06/15(木) 12:10:34その入力先がゲームとかじゃないだろうな。
DirectInputでキー拾ってるアプリだとキーメッセージ投げても反応しないぞ。
0717712
2006/06/15(木) 12:20:33>713、714
表示したいダイアログが、Layerウインドウでアルファーチャンネルを持ったウインドウなんですが、
可能でしょうか?、childで指定でダイアログに貼り付けて、親のダイアログのVisibleをオフにするとか?
何か情報ありましたらお願いします。
0718デフォルトの名無しさん
2006/06/15(木) 12:27:28ATLやMFC(MFCは使ったことが無いけどたぶん)
では、Win32 APIがグローバルな名前空間にあるという前提の元コードが書かれているので、
問題になる。
0719デフォルトの名無しさん
2006/06/15(木) 14:07:490720デフォルトの名無しさん
2006/06/15(木) 14:10:34ウインドウハンドルに対してIsWindowをかけるとか
0721719
2006/06/15(木) 14:27:05できた!
ありがとう!
0722デフォルトの名無しさん
2006/06/15(木) 15:45:40extern "C"が指定されているから、問題ない。
0723デフォルトの名無しさん
2006/06/15(木) 18:36:08そうなんだ。extern "C"するとnamespaceって完全無視なの?
0724デフォルトの名無しさん
2006/06/15(木) 18:52:48HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
の中をのぞくとDisplayName,UninstallStringの2つしかないアプリがありますが
「プログラムの追加と削除」プログラムは該当アプリのアイコンを何の情報を元に取得しているのでしょうか?
0725デフォルトの名無しさん
2006/06/15(木) 19:07:39そういうこと。
だから関数名は問題ない。
でもWinMainとか些細な問題はまだいくつかあるはず。
実際に703のようなことをやってみたことはないから、
俺はほかにどんな問題があるかも知らない。
0726デフォルトの名無しさん
2006/06/15(木) 19:15:46やらない方がいいと思うんだが。
つーか、俺なら叩くなw
0727デフォルトの名無しさん
2006/06/15(木) 23:54:25これだとエミュレートは出来ないと思います。
>>716
>>702を見ると、スクリプトではうまくいくそうだから、
何らかの方法があるはず。
ところで、ファンクションキー以外のキー(例えば A )は上手く行くの?
0728デフォルトの名無しさん
2006/06/16(金) 09:57:18キーボード入力のフェイクは、SendInputでやること。
DirectInputにも対応したかったら、SendInput必須
スキャンコード指定すればDirectInputでもおk。
//keybd_event()でもできないことはないが、ドキュメント化されていないのでお勧めしない
Vistaだと、自分より権限が高いウインドウには、送れないようになるらしいけど。
0729デフォルトの名無しさん
2006/06/16(金) 10:00:54> Vistaだと、自分より権限が高いウインドウには、送れないようになるらしいけど。
HIDフィルタドライバー経由でいけそうな気もしないではないけど…
そこまでやったことないな。
0730デフォルトの名無しさん
2006/06/16(金) 13:37:590731デフォルトの名無しさん
2006/06/16(金) 15:16:050732デフォルトの名無しさん
2006/06/16(金) 17:11:59そうか!だから「98」だったのか
0733デフォルトの名無しさん
2006/06/16(金) 17:20:340734デフォルトの名無しさん
2006/06/16(金) 17:23:530735デフォルトの名無しさん
2006/06/16(金) 17:33:59ドライバ辺りはまったくの素人だからわからないのだけれど、
それをするには管理者権限が必要になるんじゃないのかな?
Vistaは、管理者が実行しても、デフォルトでは一般ユーザ権限で実行されるのだけれど。
権限をしっかり考えていなかったコードが、
必要以上の権限を要求したりしていることがよくあるから、
その辺の互換性は大丈夫なのか心配になるけど。
0736702
2006/06/16(金) 18:09:24>>716さん,>>727さん,>>728さん,>>729さんレスありがとうございます。
>>716さん
入力先はゲーム(DirectX使用)です。DirectInput関数でキーを拾うと反応
しないなんて知りませんでした。他のレスではSendInput()だと拾えるような
ことが書いてありますね。どっちが正しいのか試してみます。
>>727さん
GetAsyncKeyState()ですか。ということは今のところDirectInputとGetAsyncKeyState()
の2種類は物理的に信号を発生させないと無理かもしれないということですね。
ちなみにWM_CHARに関しては入力を正しく受け付けています。
>>728さん
716さん、727さんのおっしゃっている関数でSendInputを拾えるかどうかを確認
してみます。むしろDirectInput()については結論がでているようですが、これも
勉強のうちなので。
>>729
Vistaですか。ますますエミュレートするのが困難になるわけですね。。。
0737デフォルトの名無しさん
2006/06/16(金) 20:07:25ドライバとスクリプト駆動アプリ間の インターフェース DLL を ちゃんと真面目に作れば
スクリプト駆動アプリ はユーザー権限のままでいける
問題は インターフェース DLL をちゃんと作るのが大変っぽいのよね…
0738デフォルトの名無しさん
2006/06/16(金) 22:39:510739デフォルトの名無しさん
2006/06/17(土) 02:29:540740デフォルトの名無しさん
2006/06/17(土) 02:31:41D言語スレがありますので、そちらでどうぞ。
0741デフォルトの名無しさん
2006/06/17(土) 11:22:01サーバーソケット(?)へクライアントが接続したかどうかを知る方法はありますでしょうか?
やりたい事は「***がサーバーに接続しました」と表示することです
よろしくお願いします。
0742デフォルトの名無しさん
2006/06/17(土) 11:39:390743デフォルトの名無しさん
2006/06/17(土) 11:41:56ドライバでも書いとけ。
0744デフォルトの名無しさん
2006/06/17(土) 11:45:370745デフォルトの名無しさん
2006/06/17(土) 12:01:55これでいいんじゃない?
0746デフォルトの名無しさん
2006/06/17(土) 12:22:31そうです
>>743
いや、自プロセスの報です
>>745
>>285
0747デフォルトの名無しさん
2006/06/17(土) 12:32:26それが出来ずにいったいどうやってクライアントの接続を処理してるのか気になる
0748デフォルトの名無しさん
2006/06/17(土) 12:45:33puts("***がサーバーに接続しました");
0749デフォルトの名無しさん
2006/06/17(土) 13:02:46あれ、もしかしてacceptが接続されるまでループしてくれるのかな
おかげ様で解決できそうです、ありがとうございました!
0750デフォルトの名無しさん
2006/06/17(土) 13:13:560751デフォルトの名無しさん
2006/06/17(土) 14:05:13accept
recv
まで書いて実行してみたところ、固まって
んで、接続もされてないのにrecvループしてるのが原因なのかと勘違いして
とりあえず答え求めてgoogle検索して出てきたソースで試してみたところ、やっぱし固まって・・・
(シングルスレッドでやってるソースしか出てきてなかったわけじゃないと思いますが、コードの一部だけをコピペして試してたので)
僕の知識では全然acceptに気づかなくて、どうしようもなく行き詰ってたんです
僕の間抜けさ故に不快にさせてしまって申し訳ないです
#追伸
こうして行き詰った理由を文章に書いたことで僕の間違いを再確認できました、
おかげで少しだけ成長できた気がします。ありがとうございました
0752デフォルトの名無しさん
2006/06/17(土) 17:09:29今後は
マルチスレッドプログラミング相談室 その4
http://pc8.2ch.net/test/read.cgi/tech/1130984585/
ネットワークプログラミング相談室 Port17
http://pc8.2ch.net/test/read.cgi/tech/1148944560/
こちらで質問してください。
2度とこないでください。
0753デフォルトの名無しさん
2006/06/17(土) 17:15:140754デフォルトの名無しさん
2006/06/17(土) 17:16:350755デフォルトの名無しさん
2006/06/17(土) 19:34:56同時発色可能な色数が発色可能な色数より少ない場合に必要なのだ、という事はわかりました。
256色モードだけで必要、と書いてはありますが、しかし、余りに面倒な気がします・・・
こんなプログラミングをどのアプリもやっているのだろうか?
適当に色合わせをしてくれるライブラリとかはないのでしょうか?
0756デフォルトの名無しさん
2006/06/17(土) 19:38:32WinXPは互換モード以外256色なんて使えねーよ?
0757デフォルトの名無しさん
2006/06/17(土) 19:39:43特に今必要じゃなかったらあとで必要になった時にまたやればいい。
0758デフォルトの名無しさん
2006/06/17(土) 19:52:510759デフォルトの名無しさん
2006/06/17(土) 20:03:15で、クラスを登録したいんですが、DEFファイルはどう書いたら良いんでしょうか?
関数と同じではダメなようなのですが・・・VBで使うので、
class __declspec( dllimport ) ClassName
は使えないみたいです。ご教示よろしくお願いします。
0760デフォルトの名無しさん
2006/06/17(土) 20:05:34パレットを使うと、(文字通り)色を調整するのが楽だという理由でパレットカラーの画像フォーマットを採用する場合もある。
#得に典型的な画像フォーマットはxpm。こいつはテキストでもありCソースの一部としても使える。
いずれにしても、このスレ的には忘れていい。
#逆に言えば、これ以上の話はスレ違い。
0761デフォルトの名無しさん
2006/06/17(土) 20:06:35俺なんか一度も使ったこと無いけど。
0762デフォルトの名無しさん
2006/06/17(土) 20:28:17Delphi Graphic Secretsでも読めよ。もう廃刊になってるかもしれんけど
いい本だよ。
0763デフォルトの名無しさん
2006/06/17(土) 20:29:200764デフォルトの名無しさん
2006/06/17(土) 20:29:39隙間の幅を指定できますか?
0765デフォルトの名無しさん
2006/06/17(土) 20:31:39EM_SETMARGIN
0766デフォルトの名無しさん
2006/06/17(土) 20:43:36VBからクラスの形で使いたければActiveXでないといけない。
0767デフォルトの名無しさん
2006/06/17(土) 20:54:07できました!ありがとうございます
0769デフォルトの名無しさん
2006/06/17(土) 21:00:15そうなんですか、関数でラッピングする方向で考えてみます
ありがとうございました
0770デフォルトの名無しさん
2006/06/17(土) 21:29:570771デフォルトの名無しさん
2006/06/17(土) 22:38:17SetWindowAttributeLayeredなんちゃら
0772デフォルトの名無しさん
2006/06/17(土) 22:40:560773デフォルトの名無しさん
2006/06/17(土) 23:34:06// STOPボタンが押された時
HANDLE handle = Thread->GetHandle();
Thread->Stop();
WaitThread( handle, INFINITE );//WaitForSingleObjectのラップ
CloseHandle( handle );
なんてコードをGUIスレッド側で書いてるのですが、
たまにスレッドの終了に時間がかかってGUIが固まってしまうときがあります。当たり前ですが。
なので、どのようにスレッドの終了を待って、クローズすればいいのか
教えてください。
というか、一々WaitForSingleObjectで待ってなくて、CloseHandleで閉じても
いいのでしょうか?
0774デフォルトの名無しさん
2006/06/17(土) 23:46:35スレッドの終了処理を必要としないならばTerminateThreadとかで強制終了しても構わない。
メモリ解放とか終了処理があるのならば、普通はスレッドのクラスに「割り込みフラグ」を持たせておいて、
スレッドの処理内部で常にその「割り込みフラグ」がtrueに設定されたか監視するようコードを書き、
スレッドを生成した側で「割り込みフラグ」にtrueを設定して終了を通知する。
まあJavaのThreadの仕組みなんだけど参考にするといいと思う。
0775デフォルトの名無しさん
2006/06/17(土) 23:47:45後者はMFCでも行われている。
0776デフォルトの名無しさん
2006/06/17(土) 23:57:33スレッドの終了処理を必要としないならばTerminateThreadとかで強制終了しても構わない。
Cのランタイムライブラリを一切使わないおつもりでしょうか?
0777デフォルトの名無しさん
2006/06/18(日) 00:06:53待つなら、MsgWaitFor〜の待機関数かタイマ。
タイマは使えない場合も有り
0778デフォルトの名無しさん
2006/06/18(日) 00:12:47>>775でも言っているけど、
あるスレッドハンドルに対してCloseHandleすると、
そのスレッドまで終了すると信じていたのは自分だけじゃないよな?
いや、Advanced Windowsにも書かれていたから、結構な人がそう信じているんだろうけど。
0779774
2006/06/18(日) 00:18:39あらっ、なんかやっぱりスレッドの強制終了ってヤバカッたの?
そこら辺までは詳しく知らなかったです。
スレッド処理で、終了時に外部ファイルなどに状態を保存しておかないと、
次の起動時に不都合がでるようなアプリ以外では、
普通にスレッドの強制終了してもよいかとオモテました。
0780デフォルトの名無しさん
2006/06/18(日) 00:46:44ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/terminatethread.asp
>If the target thread owns a critical section, the critical section will not be released.
>If the target thread is allocating memory from the heap, the heap lock will not be released.
>If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread's process could be inconsistent.
>If the target thread is manipulating the global state of a shared DLL, the state of the DLL could be destroyed, affecting other users of the DLL.
相当危険だな。
0781デフォルトの名無しさん
2006/06/18(日) 01:25:03スレッドが実行中でも、ハンドルを使わなければ閉じて構わないんですね。
この方法使います。
0782デフォルトの名無しさん
2006/06/18(日) 01:28:20質問の答えとしては>>777かな
0783デフォルトの名無しさん
2006/06/18(日) 03:31:20参考にしたいです
0784デフォルトの名無しさん
2006/06/18(日) 03:47:45【参考】ソースを公開しているWindowsプログラム
http://pc8.2ch.net/test/read.cgi/tech/1115206132/
■ このスレッドは過去ログ倉庫に格納されています