スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは
>>2-5 くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(
http://msdn.microsoft.com/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
7 :
デフォルトの名無しさん :2006/09/25(月) 13:49:22
10 :
567 :2006/09/25(月) 17:06:55 BE:382270638-2BP(0)
567が10get 567がお礼に質問に答えるよ
11 :
デフォルトの名無しさん :2006/09/25(月) 17:30:09
WindowsVistaで動作するアプリケーションを作成しています。 アプリケーションが動作している最中に権限の昇格を行いたいのですが、方法 がわかりません。例えばエクスプローラのようにファイルをコピーする際に権 限昇格を問うダイアログを表示させたいのです。 どなたか方法をご存知の方はご教授願います。
12 :
567 :2006/09/25(月) 18:24:25
あーそれは知らんな
Vistaはやったことないけど LogonUser CreateProcessAsUser あたりと思う
14 :
デフォルトの名無しさん :2006/09/25(月) 22:37:17
残りメモリを取得できるAPIとかってありますか?
>>15 はAPI的に超かいつまんで言うと、こんな感じのことが書いてある。
PrivilegeCheck
CredUIPromptForCredentials
ImpersonateLoggedOnUser
AdjustTokenPrivileges
17 :
デフォルトの名無しさん :2006/09/25(月) 23:15:22
BITMAPファイルを読むプログラムを書いてます BITMAPFILEHEADの次の ・BITMAPCOREHEADER ・BITMAPINFOHEADER ・BITMAPV4HEADER ・BITMAPV5HEADER のどれかの構造体のメンバの先頭のsizeでこの4つの構造体の区別をしています。 で質問なのですが、sizeの次のメンバ(Width,Height)の情報を読むときに if(sizeで判断){ BITMAPCOREHEADERの場合 }else{ BITMAPINFOHEADER,BITMAPV4HEADER,BITMAPV5HEADERの場合 } としています。先頭のメンバはこの4種類の構造体の相対的に同じアドレスに配置されるのは わかるのですが、2番目、3番目のWidth,Heightもした3つの場合、相対的に同じアドレスにあると考えても 問題ないのでしょうか?構造体のメンバの間に隙間が入ったりしないのでしょうか?
同じ型同じ並びなら隙間が入っても同じだろ…
>>15-16 UAC環境下でrunasしてもやっぱりUACで制限されたアカウントしか得られないんだけど。
昇格のダイアログをプログラムから呼び出すことってできないの?
requireAdministratorを指定したマニフェストを付けたexeを起動するしかない?
exeに署名してないとダメらしいんだが。
>>19 MSいわく、管理者権限が必要な場合は
その処理だけ別のプログラムに分離して
requireAdministratorを指定しろ、とのこと。
署名はなくても昇格ダイアログは表示される。
ユーザーがどう感じるかは別として…。
署名が必要なのは、昇格していないアプリから昇格しているアプリに
Windows メッセージを投げられるようにするやつ(uiAccessだっけ?)。
こっちは昇格ダイアログが表示されないので、署名が必須ってことらしい。
>>11 自分のやりたいタスクを別モジュール化して、CreateProcessAsUserで別ユーザーで呼び出しましょう。
そのときに、特権レベルを偽装してあげると、UACが働くので、ダイアログが表示される。
ただし、UACダイアログで入力したユーザー情報を取ることは不可能。
> ただし、UACダイアログで入力したユーザー情報を取ることは不可能。 CreateProcessAsUserに渡すトークンはどうやって作るの? CredUIPromptForCredentialsと昇格ダイアログで パスワード2回入力させる必要があるってこと? つーかSE_ASSIGNPRIMARYTOKEN_NAMEとSE_INCREASE_QUOTA_NAME なんて昇格しないと持ってねーよ。 昇格したいから呼び出してるんだっつーの
結局エクスプローラのコンテキストメニューの「管理者として実行」と同じことを するにはどうしたらいいわけ? Microsoftだけが非公開APIでマニフェストで明示 されていないプログラムでも出したいときにUACのダイアログを出せるの? SymantecのEUへの申し立てはむちゃくちゃだと今まで思ってたけどその通りなら 一理あるかもと思い始めてきた。
INITCOMMONCONTROLSEXが、 INIT COMMON CONTROLS EXじゃなくて INIT COMMON CONTROL SEXに見えるのは折だけか?
26 :
567 :2006/09/26(火) 09:33:46 BE:668972467-2BP(0)
やっと答えられる質問キタ
>>25 S と L に隙間があるように見えるかという質問ですね
たしかに見えるような気がします
>>24 >20 じゃダメなのか?
マニフェスト付きの別 EXEにせずに、マニフェストも無いEXE内のコード
(DLL injection されたものやプラグインかもしれない)から UAC ダイアログを
出して昇格なんかできたら UAC の意味はほぼ全て失われるような気がする。
IE の脆弱性を利用してシステムにいたずらするコードが "Internet Exproler"を
名乗る UAC ダイアログを出して昇格するとか簡単にできちゃう。
29 :
11 :2006/09/26(火) 11:54:44
ご教授ありがとうございました。 権限昇格して行う処理を別EXEにするしかないんですね。 Visut対応は大変だ・・・orz
やっぱVistaのソフトってXP以前のWindowsと下位互換性ないの? XP以前のために作られたソフトはもちろんVistaでも動きますよね?
物によっては動かないのもあるだろ 常識的に考えて
セキュリティ面で厳しくなっているようなので、 そこの作りが甘いソフトには嬉しくないかもしれない。
いや、そのへんを細かく制御してるソフトのが逆に動かなくなる可能性大。
何で自分のPCで動かすソフトでセキュリティ云々と叱られにゃならんのか 最近のOSは糞すぎる
なんかユーザ側から、このソフトは信頼できる的な設定とかできねーの? 自分用ツールとかも結構影響受けそうでブルーだ…
そんな設定作ったら自滅だな
>>28 自己解決しますた。
ShellExecute(hWnd, "runas", filename, param, NULL, nCmdShow);
でUACのダイアログが出ますた。
当然
ShellExecute(hWnd, "runas", "rundll32", " unsigned.dll,DoWhateverEvil", NULL, nCmdShow);
とか
ShellExecute(hWnd, "runas", "msiexec", "/i malware.msi", NULL, nCmdShow);
とかも余裕でできちゃって青緑のUACダイアログが出ます
(rundll32.exeやmsiexec.exeはMicrosoftの署名が付いてるから)。
これは「仕様」なのだそうです。
http://blogs.wankuma.com/jitta/archive/2006/07/19/33020.aspx ShellExecuteの先で何やってるのか相変わらず謎なのが気にくわないですが、
当初の目的(エクスプローラと同じことをやる)は達成できたのでまた暇なときにでも
調べてみます。
どうせみんなAdminで動かすだろ
どうも今晩は、質問させてください
ListViewの左端何列かを固定して、残りの右側を
通常通り横スクロールできるようにしたくて
色々調べてたんですが無理っぽいので
ListViewを左右2つ作って、スクロールを連動させるようにしようと思いました。
で、ListView自体にスクロールバーがついてると、ListViewが二つあることがばれてしまう(?)ので
スクロールバーを非表示にして、スクロールバーコントロールを追加して制御しようと思いましたが
ListViewのスタイルにLVS_NOSCROLLをセットしてもスクロールバーが表示され
しかもヘッダの部分の表示がおかしくなってしまいました
マイクロソフトのサイトで調べてみても
ttp://support.microsoft.com/default.aspx?scid=kb%3Bja%3B137520 こんな感じでなんか日本語じゃなかったのでよくわかりませんでした
ListViewで列固定を実装する方法は無いでしょうか
よろしくお願いします
>>38 VistaではAdminで動かしてもデフォルトで権限は標準ユーザーと同じ。
せめて「どうせみんなUAC切るんだろ」と言ってくれ
>>37 権限昇格が必要なメニューとかボタンには、
Vistaのシールドアイコンをキャプションの隣に付加させるべし、
というガイドラインもある。
アイコンを付加するためのAPIもあるから調べてみて。
もっとも、内輪で使うだけならアイコンはなくてもいいかもしれないけど…。
しかしそういうVista用の処理が入ったアプリを2000やXPで動かすことができるのかね?
自分では試したことがないので知らないんだけど、誰か経験者いる?
>しかしそういうVista用の処理が入ったアプリを2000やXPで動かすことができるのかね? ハァ?
IEでサブメニューの名前を付けて保存を選択した時の ダイアログFolderViewのLMV_INSERTITEMWを殺したいのですが やり方を教えてください。
>>41 > しかしそういうVista用の処理が入ったアプリを2000やXPで動かすことができるのかね?
IDI_SHIELDの取得に失敗したら自前のを使う(か無視する)だけでしょ。
Button_SetElevationRequiredの正体は単に新メッセージを送るマクロだから
古い環境では無視されるだけだし。
ちなみに
>>37 をXPや2000で実行すると「別のユーザーとして実行」のダイアログが
現れる。
IEの警告とか、ドライバインストール時の未署名の警告みたいに、 Readme.txtにUAC無効にしろって書いてあるソフト出てきそうだな。
そもそもバージョンや環境により実装されてない可能性のあるAPI使う場合はインポートライブラリ使わずにLoadLibrary/GetProcAddress使って呼び出すだろ
決め打ちでインポートして非対応環境では起動すらできないタコなコードの方が多いよ
非対応環境だし。
非対応だとうたっているなら問題ないようなw
僕のアプリはすべての環境において非対応(^O^)
51 :
43 :2006/09/27(水) 19:01:54
>>51 フックルーチンをつっこめれば、メッセージを殺すことはできるかも
>>43 殺すとはどういうことをいってるの?
自分デメッセージ処理したらいいだけちゃうの?
先生!質問です!! dllmainさえ蹴ってくれれば勝手に動くよ系のdllがあったとして あるプロセスがそのdllをloadlibraryしたあとfreelibraryとかまったく何もせずに そのままexitprocessしちゃったら もしかしてメモリリークでプギャーですか? それとも勝手に解放してくれるから気にしなくてもおk?
>>54 まずは君に日本語ランゲージパックをインストールしないと駄目なようだ。
>>51 フックオチンチンをつっこめれば、ソーセージを殺すことはできるかも
57 :
43 :2006/09/27(水) 19:57:09
>>53 ダイアログをサブクラス化して、非表示にして
POPUPメニューで保存先を選択してるのですが
選択フォルダにファイルが一杯あると、表示されるまで時間がかかるので
フォルダ内にファイルがあっても、空の状態で表示したいのですが
ヒント: 糞仕様・糞設計
そうですか
>>54 >dllmainさえ蹴ってくれれば勝手に動くよ
それなんかヤバげ。
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/dllmain.asp >The entry-point function should perform only simple initialization or termination tasks.
>Calling functions that require DLLs other than Kernel32.dll may result in problems that are difficult to diagnose.
>For example, calling User, Shell, and COM functions can cause access violation errors,
>because some functions load other system components.
日本語でおk
CreateProcessで別のプロセスを起動させてるとか?
>>60 レスサンクス
いま考えてるdllのつかいかたとしては
dllmainでお爺様のお脳をファックするだけで終わりで
あとはいい感じにボケた爺様に呼ばれるまで待って
適当に介護する感じのあれを想定してるので
その件については多分おそらく大丈夫っぽいような気がなんとなくします。ありがとう
コミュニケートする気が無いようだ。
66 :
39 :2006/09/27(水) 21:42:33
どうも今晩は。 やっぱり説明が下手で質問の内容すら伝えられなかったようなのであきらめました。 どうもありがとうございました。
>>57 なんでわざわざダイアログをサブクラス化したりしてるのか謎い。
IEをつかわせつつ、IEの機能を限定してるとかって事?
だったら、create系メッセージから全力でメッセージ殺しまくればいいんじゃね?
要はダイアログが自分の初期化してるから、カレントディレクトリとか読んで重くなるってことだろ?
初期ディレクトリをファイルのないダミーディレクトリにして初期化させるとかって手もあるかも。
というか、保存先は自分が解ってるのに、なんでダイアログを初期化させてんの?
ますます解らん。w
根本の思想が理解できないし、そもそも何やりたいのさ。
質問してる奴も言葉足らずなのばっかりだけどさ 読めない読めない言う奴って何がしたいの? つーか読めないなら黙ってればいいじゃん。いやマジで。 読めないから質問を変えろ、俺が読めないから諦めろ、みたいな事いう奴もいるし 俺様が回答できる質問以外は人類未踏とでも言わんばかりのキチガイっぷり晒してる事にいい加減気付け
69 :
57 :2006/09/27(水) 22:22:05
>>67 元々は、IEの名前を付けて画像を保存などを選択した時に
保存しようとしているファイルのパスを取得して
独自の保存先選択POPUPメニューで保存したかったのですが
パスの取得が出来なかったので
現在は、IEの保存ダイアログを利用して独自POPUPメニューでダイアログに保存先をセットして
ダイアログのOKボタンを自動で押して保存しています
IEの保存ダイアログの、ディレクトリを表示前に変更出来るんですか?
要するに究極的にはIEの保存ダイアログをやめて 自前のポッポアッポ型インターフェースに置き換えたいって事だよね インポテーブルをハクってゲトズザーじゃだめなのかな
71 :
57 :2006/09/27(水) 23:36:18
73 :
57 :2006/09/28(木) 00:29:19
>>72 試したことがあるんですが、
HPによっては正確に取得できない場合があったので
やめました。
IHTMLDocumentからの取得もやったのですが
IEにやってもらうのが、一番正確で楽だったので
この方法でやってます。
74 :
デフォルトの名無しさん :2006/09/28(木) 03:13:23
WindowsXPでマイコンピュータをクリックして出るウィンドウ。 一番下にネットワークドライブの欄がありますよね。 ここに「切断されたネットワークドライブ」とあるのをクリックすると、 切断状態が解除され接続状態になりますけど、 これらの操作をAPIで行うのはどうやればいいのでしょうか? ネットワークドライブのリストアップと、見つかったドライブのうち なんらかの方法で接続状態に持っていく方法がわかればと思っています。
WNetEnumResources, WNetAddConnection2
76 :
デフォルトの名無しさん :2006/09/28(木) 06:55:31
しょぼい質問で恐縮ですがよろしくお願いします。 症状:矢印キーでコントロール間のフォーカスがエディットの部分だけ動かない リソーススクリプト抜粋 BEGIN EDITTEXT IDC_EDIT1,4,23,117,14,ES_RIGHT | ES_AUTOHSCROLL | WS_EX_STATICEDGE | WS_TABSTOP | WS_GROUP EDITTEXT IDC_EDIT2,3,62,117,14,ES_RIGHT | ES_AUTOHSCROLL | WS_EX_STATICEDGE PUSHBUTTON "決定ボタン",IDC_BUTTON1,196,17,79,25,WS_TABSTOP | WS_GROUP PUSHBUTTON "終了ボタン",IDC_BUTTON2,195,49,79,25 CHECKBOX "チェック1",IDC_CHECK1,6,9,119,14,WS_TABSTOP | WS_GROUP CHECKBOX "チェック2",IDC_CHECK2,6,47,119,14 END EDITTEXTのコントロール間だけ、矢印キーを押してもフォーカスが移動しません。 グループ化して矢印キーでIDC_EDIT1とIDC_EDIT2間を移動させたいのですが、どの部分が問題なのかが 判明しません。グループ化も出来ていると思うのですが‥
そりゃ矢印キーはエディットコントロールが使うから。
>>77 なるほど。
なんでもグループ化すればそのコントロール間で作用すると思い込んでいました。
別の方法で打開策を考えようと思います。
ありがとうございました。
>>78 別の方法で打開しない方がいいぞ。それはWindowsの一般的な挙動だ。
普通はコントロール間のフォーカス移動はタブキーを使う。
タブはコントロール間ではなくタブグループ間の移動だが。
81 :
デフォルトの名無しさん :2006/09/28(木) 12:31:46
CreateFile関数の質問です。 現在こうゆう風にパラメーターを使ってます。 CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, .....); ファイル読み込み中も他のプロセスが書き込みできるように FILE_SHARE_WRITE付けたのですが、この場合、もしファイルを 読み込んでいる途中に他のプロセスがファイルの上書きを 始めて、そっちの方がスピードが速かったら、読み込むデータも 途中から新たに上書きされたものになってしまうのでしょうか? 例: 現在のファイルの内容: AAAAAAAAAA 他のプロセスが上書きする内容: BBBBBBBBBB FILE_SHARE_WRITEを付けると、読み込むファイルがこうなる可能性がある? AAAAABBBBB
WinMainの第一引数のHINSTANCEとGetModuleHandle(NULL)の戻り値は常に同じ? HINSTANCEをグローバル保存しておくソースを見るんで置き換えてグローバル減らしたいんですが
GetWindowLong( hWnd, GWL_HINSTANCE);もずっと同じ でもその1つのグローバル変数減らしてなんか得することあるの? g_hInstance とかで保存したほうがぱっと見て内容がわかるから使いやすいと思うんだけど。 これは人それぞれか。
>>85 ありがとう
得することは、多分、ないですけどね…
g_hInstance は事実上不変の定数だから管理とかないし
俺は、<windowsx.h>のGetWindowInstance派。 でもATL/WTL使い出したら、ATLが内部でグローバルにインスタンスハンドルを持っていたので、 今はそれを使っている。
88 :
567 :2006/09/28(木) 23:07:28 BE:159279825-2BP(0)
オレは両方派 main.c内では static HINSTANCE g_hInstance; で他のファイルでは GetWindowLong( hWnd, GWL_HINSTANCE); これが一番でしょ
リッチエディットボックスで右クリックメニューが出ないんですが、 エディットボックスと同じメニューを出すにはどうしたらいいですか?
90 :
デフォルトの名無しさん :2006/09/29(金) 13:10:42
コンボボックスの表示について質問なんですが、どうしてもコンボボックスの項目が追加できなくて困っています。 リソースで #define IDC_COMBO1 4000 IDD_COMBO DIALOGEX 50,25,281,87 FONT 9, "MS ゴシック" STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_SYSMENU BEGIN COMBOBOXIDC_COMBO1,4,23,117,14,CBS_DROPDOWNLIST | WS_VSCROLL END ソースファイルにて DialogBox関数でDiaProcをプロシージャとして登録し、 そのDiaProcの中で switch( msg ) { case WM_INITDIALOG: if( SendMessage( GetDlgItem( hwnd,IDC_COMBO1 ),CB_ADDSTRING,0,(LPARAM)"test") == CB_ERR) return FALSE; SendDlgItemMessage( hwnd,IDC_COMBO1,CB_ADDSTRING,0,(LPARAM)"test"); SendMessage( GetDlgItem( hwnd,IDC_COMBO1 ),CB_INSERTSTRING,1,(LPARAM)"test"); SendMessage( GetDlgItem( hwnd,IDC_COMBO1 ),CB_INSERTSTRING,2,(LPARAM)"test"); SendMessage( GetDlgItem( hwnd,IDC_COMBO1 ),CB_INSERTSTRING,3,(LPARAM)"test"); SendMessage( GetDlgItem( hwnd,IDC_COMBO1 ),CB_INSERTSTRING,4,(LPARAM)"test"); return TRUE; みたいなことをしてなんとか文字を出そうと試みてるんですが、実行してみるとコンボボックスのみが表示されてその項目が全く表示されません。 プレークポイントを使って確認した所確かに通っているし、エラーで終わっている様子もありません。 項目追加のメッセージなどを送って文字列を表示させてるつもりなんですが‥
88のmain.cに泣いた
93 :
90 :2006/09/29(金) 13:21:58
すみません。やっと分かりました。 自分はてっきり一行の高さを設定するだけでドロップダウンが機能して全て表示できるものだとばかり思ってました。 なにげにほとんど見えない項目をクリックしたらその文字が表示されました。 ここに質問として書いてちょっと間をあけたから頭の切り替えが出来たのかもしれません。 どうもお騒がせしました。
DLL/EXE 共用でなんとかしようとすると、グローバル変数(のようなもの) じゃないと苦しいね。 DLL 内のコードで GetModuleHandle(NULL) すると、Loadされたアプリケーション側のインスタンス返すし # それでも初期化するのに、エントリポイントいじくったりしないと都合が悪くなることも…
95 :
567 :2006/09/29(金) 14:57:33
よぉ
96 :
567 :2006/09/29(金) 15:05:28
>>93 あー、まあいいよ俺が許す
次からは気をつけろよ
おーい
98 :
デフォルトの名無しさん :2006/09/30(土) 16:19:51
99 :
98 :2006/09/30(土) 16:20:32
VC++インクルードディレクトリを「WS_EX_NOACTIVATE 」で検索してみたのですが、やっぱり見つかりませんでした。
100 :
98 :2006/09/30(土) 16:22:07
たびたびすみません。
>>98 のMSDNを良く読むと
WS_EX_NOACTIVATE Windows 2000:
って書いてあります。
WindowsXP上で開発してるんですが、それが原因なのでしょうか?まさか〜
WINVERとか_WIN32_WINNTじゃねえの?知らんけど。
102 :
デフォルトの名無しさん :2006/09/30(土) 16:57:29
PlatformSDKには入ってるようだが。
ダイアログベースのときの話なんだけど WM_CREATEが来た時点でメイン窓のHWNDは確定してるのに、その子コントロールのHWNDが取得できない。 多分CreateWindow終わるまでは、まだ生成されてねーよってことだと思うんだけど、 この子コントロールのハンドル取得して初期化する場合に使えるメッセージってあります?
WM_INITDIALOG
WM_CREATEのデフォルトプロシージャを呼んだ後に処理すれば?
WM_CREATEの中で、自身へ向けてメッセージをポストしておくというのはどう? そうしたらそれを受け取るのはメッセージループが始まった後。
なぜWM_INITDIALOGを使わない? 同じ事をするメッセージが複数必要なのか?
CreateDialogのプロシジャの引数にNULL渡して、メッセージ処理は登録した窓クラス使うから
WM_INITDIALOGはこないのよ
そんなに
>>105 なら完全なダイアログベースにしとけってことか(´・ω・`)
素直に
>>107 か初期化専用の関数でもCreateDialog後に置いときます
>>107 も結構問題があるから気をつけろ。
ポストしたメッセージが、コントロールが作られるより早く飛んできても文句は言えない。
111 :
567 :2006/09/30(土) 21:00:59
久々に質問したいんだけどいい?
>>109 FALSE を返すだけのダミーのダイアログボックスプロシージャを指定すれば、
WM_CREATE と WM_INITDIALOG の両方が飛んでくるようになるよ。
112
送信しちまった('A`)
>>112 は面白いね 勉強になります
115 :
567 :2006/10/01(日) 07:42:04
しけてんなーここ。誰か反応しろよ
116 :
567 :2006/10/01(日) 10:47:14
頼むよー、誰か相手してくれよー。 学校じゃ俺が話しかけるとみんな逃げていくし、最近親も俺から目線そらすようになって・・・ 2chだけなんだよ、おれが自分でいられるのは。
何をいきなり。 誰か反応しろと言われてもどう反応すればいいんだ? そんな、俺は何もしないけどお前ら俺に構ってくれというような奴は 嫌われて当然じゃないのか?
118 :
567 :2006/10/01(日) 12:49:32
知りたいのはVistaでWFP回避する方法なんだよー。 あと未署名のカーネルドライバを勝手にすりこませる方法な。 実行中のIEの権限を引き上げることのできる穴もヨロシク。
ウイルスを作ろうとしているお方が現れた。 コマンド? →通報
120 :
デフォルトの名無しさん :2006/10/01(日) 13:07:03
質問なんですが、みなさんはCで書いてるんですか? それともC++で書いてるんですか? 自分は、猫でも・・の本を一通りやってうんざりして 今は、mfcってやつで色々いじってるんですが どうなんでしょうか。 初心者なんで、mfcからで良いかと勝手に思ってるんですが。 (win32APIリファレンスの本と同じ関数も多いし) やはりC++なら、APIをラッパにして、STL使ってって感じ でしょうか。 まだまだC++のレベルもクズたれですが、どうもそこら辺が 気になって質問指していただきました。 API関連の書き込みでなくて、申し訳ありません。
好きなようにすればいいと思うよ。 プログラミングスタイルなんて人によって違う。 (チーム開発だとルールを強要されるが)
>>120 何を作りたいかによるんじゃない?
例えば、ExcelやAccessでデータ管理のツールを作りたければVBAになるんだろうし。
123 :
567 :2006/10/01(日) 13:47:08
>>119 おまえ、エスパー? ウィルスだってなんでわかったの?
カーネルドライバのウィルスって最強だと思わない?
おれにしか作れないだろ。
相手にする奴も同レベル
自分でデジタル署名すればいいがな。
見えないレス番とアンカ-が多すぎます
ねたにまじれすかこういい
こんばんわ USBストレージが接続されたことを検知するにはどうすれば(どのAPI)を使えばよいのでしょうか? よろしくお願いいたします。
130 :
デフォルトの名無しさん :2006/10/01(日) 15:52:32
ビデオ信号を切断するAPIを探しています。 ChangeDisplaySettings というAPIを見つけて近づいたと思ったのですが これ以上近づけませんでした。何か良いAPIはありませんでしょうか?
NTFS などのファイルシステムが持ってるファイルの CRC 値って Win32 API 経由で取り出すことが可能ですか? 今は、自分でファイルの CRC を計算してるんですが、 ファイルシステムからとりだせれば、その分スピードがはやくなるので。
>>133 NTFSにそんなもんがあるとは聞いたことないが、情報源は?
ヒント:脳内
自分で速いコードを書けばよし
脳内から取り出すAPIが確かあったと思う
電波を受信するAPIを探しています。 この電波というのは物理層を経由しない方の電波です。
139 :
567 :2006/10/01(日) 19:36:09
そんな糞みたいな質問構わなくていいから さっさとオレの質問に答えろよ
質問してくれないと答えられない。 以前質問したことをもう1度と言うのなら、悪いがもう1度書いてくれ。
141 :
567 :2006/10/01(日) 20:34:50
>>140 前に書いてるんだから探せよ
それぐらい出来ないのか、バカかおまえ
明らかに質問者の態度じゃないことに気付いてるのだろうか? 一応釣りだと信じてる…
バカ耐性が低いのが居るな 華麗にヌルーしとけ
NULL-
ヌルってるかどうかのエラーチェックは怠るべきではありません
正常系のコードだけ書けばよい
コーディング全般な話になるけど エラーなら処理中断させる方法と、 if (args == NULL) return; ...続く 正常なら処理を継続させる方法があるよね if (args) { ...続く } どっちが好きだい?
>>147 俺は後者が癖になってるけど、後者はネストが深くなるから前者の方がいいと思ってる。
状況によりけり。
Cだとリソース解放のことを考えて後者にしていたけど、 C++を始めてからは、デストラクタで対処できるので前者にしている。
151 :
567 :2006/10/01(日) 22:33:01
どっちでもいいだろ、スレ違いな話はよそでやれや
152 :
133 :2006/10/01(日) 23:22:49
>>134 エクスプローラでファイルをコピーしようとするとたまに、
CRC エラーが出るので、てっきりファイルシステム内に
CRC 値が保存してあるのだとばかり思ってましたが、
違うんでしょうか?
たぶんHDDコントローラが吐いたエラーだな。
>>152 重要なメタデータとかならともかくファイル全体のCRCはないだろ。
CRCの計算量はそれほど大きいわけでもないが、
書き込むたびに毎回というと話は別だ。
155 :
デフォルトの名無しさん :2006/10/01(日) 23:51:40
MMCでユーザの管理スナップインなどを追加すると 「コンピュータの選択」というダイアログが出てきますが このダイアログを呼び出すAPIは何でしょう?そもそも共通になってない?
156 :
133 :2006/10/02(月) 00:19:55
>>153 >>154 てっきりファイルシステムがファイルのCRC値を
保存してるんだと思ってました。
ありがとうございました。
じゃあエクスプローラが吐く 「巡回冗長(CRC)エラー」ってなんなんだろうな
デバイスが返してくるリードエラー
じゃあ、デバイスはどこに CRC 値を保存しているんだろう? 書き込むときにどこかに保存しているから、 読み込むときに比較が可能なのではないかと思うんだが。
ディスクの構造を勉強してこい
デバイスが吐くのは毎回の転送データのCRC そもそも連中はファイルなんていう論理単位は認識してない
「なんなんだろうな」とか「思うんだが」とか散々偉そうに煽っといて 実はそれは自分の無知だったって、すごい滑稽だな。
プログラマならVistaに移行するよな? GetTickCount64 Retrieves the number of milliseconds that have elapsed since the system was started. ULONGLONG WINAPI GetTickCount64(void); Parameters This function has no parameters. Return Values The number of milliseconds. Remarks This function is limited to the resolution of the system timer. To obtain the system timer resolution, use the GetSystemTimeAdjustment function. If you need a higher resolution timer, use a multimedia timer or a high-resolution timer. Requirements Client Requires Windows Vista. Server Requires Windows Server "Longhorn". Header Declared in Winbase.h; include Windows.h. Library Use Kernel32.lib. DLL Requires Kernel32.dll.
>>163 GetTickCount()は、さほど高い精度を要求されないところで使うものだと思うが。
ゲームだったらこれまでどおり、high-resolution timerを使うはずだし。
そもそも問題は、Vista以降でしか動かない。
しばらくは、すくなくともXPもサポートしなければならないだろうし。
>>164 システムタイマが64ビットになったことで、
「windows起動後49日後に〜」
ってことを考慮する必要がなくなっただけでもありがたいんでない?
>>165 まあ、たしかに64bitだったら、オーバーフローするまえにハード自体が現存してないだろうけどね。
>>164 >>166 釣られるなって。 どう見てもまともなWin32APIの質問じゃないだろ。
「かまって君」はスルーが基本!
前世紀から指摘されてるのに今更tick 64bit化すか
FtpSetCurrentDirectory(hSession, "..") とすると戻り値がFalseになるのですが なぜでしょうか? 一応上の階層に上がっているようなのですが 戻り値だけFalseなので不思議です。
つ GetLastError
ラップアラウンド位プログラム側で対応しろと思わなくもない。 RTPのシーケンス番号なんか16bit&開始値が乱数だぞ。
むしろラップアラウンドでバグるようなコード書いてる プログラマを見てみたい。
グローバルフックでウィンドウの表示と非表示を監視するには WH_CALLWNDPROCでどのメッセージを見ればよいのでしょうか
>>173 WM_WINDOWPOSCHANGED
177 :
デフォルトの名無しさん :2006/10/03(火) 08:15:13
VistaでUACってのを出して昇格したいけど、どのAPIかわからんのです。 VistaでProgram Files配下のプログラムの上書き、新しいリソースのダウンロードからの追加がしたい。 インストーラーで入れたプログラムフォルダ内に プログラムからzip解凍してリソース展開しようとしたけど、Usersに書きこみ権限がない。 それっぽい過去ログありましたがセキュリティーホールになるから不可みたいに見えます。
フックを使ってウィンドウの×ボタンを押しても閉じずに最小化させるプログラムを作りたくて、 とりあえず、WM_CLOSEとWM_DESTROYをフックプロシージャで 捕まえて、return TRUEのように返すようにしたのですが、 うまくいかずに閉じてしまいます。 なぜか×をクリックするとWM_DESTROYが永遠とsendされ続けるようで。 なんかアドバイスお願いします。
外部リンクにしてる?
180 :
179 :2006/10/03(火) 20:09:43
ああカンチガイ。 自分自身のウィンドウの×ボタンか。 WM_DESTROYは捕獲しちゃいけないだる。
いえ、自分自身ではないです。
今は、ためしにノートパッドをグローバルフックしてみてます。
「猫でもわかる」の↓を参考に。
http://www.kumei.jp/c_lang/sdk2/sdk_163.htm WM_CLOSEを捕まえて、メッセージボックスを出すことはできるのですが
そのメッセージを破棄することができません。
それで、一応WM_DESTROYも殺そうかと思ってやってみたら、
WM_DESTROYがたくさん(次次と)来てたって感じです。
フックプロシージャで、
,,,
lp->message == WM_CLOSE ){
MessageBox(NULL , "メモ帳へWM_CLOSE","確認" , MB_OK | MB_TOPMOST );
return TRUE;
}
...
のようにしてます。
,,, lp->message == WM_CLOSE ){ MessageBox(NULL , "メモ帳へWM_CLOSE","確認" , MB_OK | MB_TOPMOST ); return TRUE; } これの何処でメッセージが殺されてるんだ
>>182 CallNextHookExで次のフックに渡さずにTRUEを返せば、
メッセージって死ぬのではないのでしょうか。
できれば、殺し方教えてください。
キーフックのときは上記のやり方でうまくいってたのですが。
>>181 The CallWndProc hook procedure can examine the message, but it cannot modify it.
The GetMsgProc hook procedure can examine or modify the message.
So use WH_GETMESSAGE.
>>183 メッセージフックでメッセージを殺す場合は、メッセージの存在を消すことは出来ないので
WM_NULLに書き換えるんだよ。
186 :
178 :2006/10/03(火) 21:07:58
なぜか、WH_GETMESSAGEだとWM_CLOSEが捕まらないです。
フック関数内でターゲットのウィンドウをサブクラス化して 乗っ取ったウィンドウプロシージャ内で破棄するという手もある。
>>186 WH_GETMESSAGEはポストされたメッセージしか捕まらない。
送信されたメッセージはWH_CALLWNDPROC
だから
>>185 か
>>187 ということだ
>>177 >>37 は見たか?
昇格のダイアログが出てユーザーに押させる必要があるのはかまわないんだよな?
なおアップデートのボタンには盾アイコンを付けるように(
>>41 )
無断で更新する必要がある場合は(ウィルススキャンソフトの定義ファイルとか)
初回のインストール時にサービスをインストールしてサービスから更新する。
当然そのサービスはどんな悪意のあるプログラムから呼ばれても問題のないように
設計されていなければならない。
190 :
デフォルトの名無しさん :2006/10/03(火) 21:32:02
はじめまして。APIの質問はここでいいんですよね?
今アプリケーションからタイムゾーンのロケールを変更するプログラムを作っているのですが、
うまくいきません。
VS2005 C#でプログラムしています。
TimeZoneInformationを使えばいいですよね?
そこで、kernel32.dllを読みこんで、
struct TIME_ZONE_INFORMATION
{
public int Bias;
public string StandardName; // StringBuilder 32
public SYSTEMTIME StandardDate;
public int StandardBias;
public string DaylightName; // StringBuilder 32
public SYSTEMTIME DaylightDate;
public int DaylightBias;
}
をHP(
http://custom.programming-in.net/articles/art9-1.asp?f=SetTimeZoneInformation )
を参考にして書いたのですが、どうやって使うかがわかりません(恥ずかしながら)
Biasって何を格納するの?とかそんなレベルです。
どなたかわかる方教えていただけないでしょうか?
お願いします。
まず MSDN その他で SetTimeZoneInformation と TIME_ZONE_INFORMATION を調べれ
192 :
178 :2006/10/03(火) 21:54:49
>>181 WM_DESTROYはDestroyWindowを呼び出した結果やってくるメッセージだから、
握り潰してもウィンドウは削除されると俺は思っていたのだが、違うのか?
USE接続されたデバイスが、どのデバイス識別子(A、C、Dなど)になったかを知るためには どうすればよいのでしょうか? よろしくお願いいたします。
すいません、訂正します。 USEじゃなくてUSBです。
>>193 WM_CLOSEを破棄できたってことでしょ
195 WM_DEVICECHANGEのDBT_DEVICEARRIVALの DEV_BROADCAST_VOLUMEのdbcv_unitmask
198 :
195 :2006/10/04(水) 00:46:03
>>197 解決しました
ありがとうございました
助かります
class A { int x ; public: static int CALLBACK Func(...) } こんな感じであるときにCALLBACK関数内からint x(プライベート変数やポインタ) を呼び出す方法はありますか?
class A { int x ; public: static int CALLBACK Func(A* pThis) { pThis->x; } } A a; A::Func(&a); とか?
・CALLBACK 関数の引数に(void* とかの)融通が利く部分があるなら (_beginthread系) class A へのポインタを渡して(キャスト等して)から参照 ・static class A* ThisPointer; をクラスで持って CALLBACK関数が呼びだされる前に this をセットしておき、ThisPointerから参照。 APIスレでこのケースとなると… WNDPROC系? ウインドウハンドル と class A のポインタのマップから 無理やり該当オブジェクトポインタ得る とか ウインドウハンドルの拡張領域 に class A のポインタを仕込むとか
WNDPROC系なら、SetProp, GetPropとか
>>200-202 ありがとうございます。すいませんもっとしっかり書くべきでした
static BOOL CALLBACK DialogProc(HWND hWnd , UINT mes ,
WPARAM wParam , LPARAM lParam)
やりたいのはダイアログです。スレッドの場合は知っていたのですが
ダイアログの場合LPVOID型を持たせたりする
ところがないので悩んでました
>>201 さんの2番目のやり方って
>static class A* ThisPointer;
をクラス内の変数で持っておいてコンストラクタで A* A::ThisPointer = this ;
ってやるとエラーになるんですけどどうやって初期化(定義?)したらいいんでしょうか?
204 :
203 :2006/10/04(水) 03:50:35
解決しました。static変数をよく理解してませんでした classの関数の外で宣言しないといけないんですね。。。
static メンバ使う場合 クラスAの派生Bの Dialog中から さらに クラスAの派生C を生成し Dialog を呼び出したりすると 期待した動作ができなくなるので注意して # MS も CALLBACK に一通りアプリケーション作成者用の LPVOID 枠用意しとけばよかったと # 後悔しているんだろな…
MFCはどうやってるんだっけ? あれも、CWndの実体をWNDPROCに渡してるよね。
MFCはスレッド毎にHWND<->オブジェクトマップを持ってる。 ATL/WTLはサンク使ってる。
普通のダイアログならCreateDialogParamの最後の引数で WM_INITDIALOGのlparamにユーザーデータ渡せるので、そこでSetProp。 WM_DESTROYで、RemoveProp。 コモンダイアログなら、構造体メンバのlCustDataから同じく渡すことできる。
それより長い期間でクラスの実体配送を機能させようとすると WM_NCCREATE/WM_NCDESTROY の組になるね
WM_NCCREATEの前にも何か来てたような
211 :
209 :2006/10/04(水) 17:01:42
>>210 ぐぐったら見つかった WM_GETMINMAXINFO が前に来るのかー
素で知らなかったよ
212 :
デフォルトの名無しさん :2006/10/04(水) 20:58:49
Windowsプログラム初心者です。現在C#を使っています。 質問なのですが、現在アクティブになっているWebブラウザから、テキストを 抽出するプログラムを書きたいのですが、その実現方法にはどの様な方法が あるのでしょうか? (板違いだったらすいません。)
とりあえずC#スレに行けば
215 :
デフォルトの名無しさん :2006/10/04(水) 21:16:40
>214 有難う御座います。この方法だと、IEオブジェクトを新規に作成することになってしまうと思うんですが、 既に開いてあるIEをオブジェクトとして扱う(新規に作成せずに)ことは可能なのでしょうか?
GetObject
217 :
デフォルトの名無しさん :2006/10/04(水) 22:07:24
>>216 有難う御座います。
GetObjectを用いると言うことは、ブラウザにプラグインを組み込んで
利用するといった方法になるでしょうか?
その場合、プラグインがテキスト送信先のプログラムを起動し、テキストを
送信といった流れになるでしょうか?
GetObject GetActiveObject
219 :
デフォルトの名無しさん :2006/10/04(水) 22:30:28
しょぼい質問ですみません。 現在VC++6.0を使ってAPIプログラミングしています。 エディットコントロール(IDC_EDIT1)に16進数(0-9,A-F)以外 入力を受け付けなくしたいんですが、どのようにやればいいでしょうか。 よろしくお願いします。
サブクラス化でWM_CHARを見て不要なものを殺す
SHLimitInputEdit使えね〜 使えない文字を入力したときにバルーンが出るのはいいが、 「ファイル名には次の文字は使えません」 or 「ファイル名には次の文字のみを使ってください」 ファイル名前提かよ orz IItemNameLimits::GetValidCharactersしか呼ばれないし、訳判らん。 ES_NUMBER付きエディットコントロールのような動作を期待してたんだけどな。
> It might be altered or unavailable in subsequent versions of Windows. とか書いてる司法省との和解でいやいや公開系の関数だから仕方ないだろ ShellAboutなんか強制的に「Microsoft」を頭に付けられるし
だってVS2005のには書いてなかったんだもん(´・ω・`)
いやいやだろうが公開する以上はちゃんとしなきゃ
225 :
デフォルトの名無しさん :2006/10/05(木) 11:11:51
VisualStudio.NET 2003 + WindowsXP なのですが、 タイトルバーもなにもない、中身だけのウインドウをつくるにはどうすればいいんでしょうか? dwStyleをどう設定していいもんだかわかりません。
WS_POPUP
>>225 できました!ありがとう!!
MSDNは文章の意味がよくわからないよ〜
がんばるよ〜
意味が分からなかったら試せばいい。
子プロセスが32bitと64bitのどちらで動作するか、起動する前に判定するには どうしたらいいですか? GetBinaryTypeは64bit Windows上で/platform:anyな.NETバイナリを32bitと判定 しますが、実際には64bitで動作するようです。 子プロセスを起動した後ならIsWow64Processで判定できるのですが…。
231 :
デフォルトの名無しさん :2006/10/06(金) 08:25:28
>>189 すいません。質問内容をしくじりました。
>>37 のやりかたでUACダイアログがでてます。
しかしながら、ファイルを実行していいかどうかのUACダイアログであって、
許可をしても、そのexeから、Program Filesを上書きできないという質問です。
>>37 を読んでイケるとおもったんですが、実際やってみたらUACダイアログでて
許可をしても、Program Filesの内容をいじれないので、
インストール時とかにでてくるような、Program Filesをいじれるようになる
UACダイアログを出すAPIを求めているというわけです。
環境はWindowsVistaRC1です。
216ビット版OSにならなかっただけましかと。
情報が6ビット分しか無いことに驚いたのかと
絵の読み込みについて hoge.bmpがあり HBITMAP Bmp1, Bmp2; Bmp1 = (HBITMAP)LoadImage(NULL, hoge.bmp, 〜 ; とした後に、 Bmp1 の任意の範囲を Bmp2 へ もしくは、Bmp2 へ hoge.bmp の任意の範囲を Bmp2 へ 読み込ませたいのですが、どうも何を使えば良いのかわかりません。 Bitblt だと HDC が対象になるし LoadImage だと左上を起点とする範囲しか読めないし ヒントだけでも良いのでよろしくお願いします。
>>235 CreateCompatibleDC
SelectObject
BitBlt
DeleteDC
>>236 ありがとうございます。
それらをもう一度調べ直します。
>>236 (((((っ・ω・)っちゃんと戻さなきゃ駄目!
>>239 いや、必要なAPIを列挙しただけで、手順を説明したわけじゃないからw
>>232 SCS_64BIT_BINARYが書いてないし。
やっぱりmsdn2になる前の日本語版はダメすぎだ
>>231 >>37 の方法で出したUACのダイアログから起動したexeで問題なく
Program Filesの更新ができたけど?
WRPで保護されたファイルで試して上書きできないとか思ってないよね?
更新機能を持ったサードパーティー製のアプリで試してみれ。
とりあえずFirefoxはfirefox.exeを
>>37 の方法経由で起動して
1.5.0.6→1.5.0.7へ問題なく更新できた。
窓プログラミングの場合、malloc/newなんかのリーク以外にも DCの開放ミスの危険性もあるわけですけど、 _CrtDumpMemoryLeaksのようにこれを検出する方法ってありますか? いまは危険箇所がわかってればループ処理させてメモリ使用量とか見てるんですが大変
>>244 タスクマネージャのGDIオブジェクトでも見ておけ。
>>245 サンクス 単なるメモリ使用量より遥かにわかりやすいです
別アプリケーションのウインドウのある特定の座標の 色を識別したいのですが、これをWIN32APIで実現するには、 どうすればできますか? そのウインドウにはボタンや画像、テキスト領域が配置してあるとして。 つまり、昔のBASICでいう Color = Point(100, 150) みたいな事がやりたいのです。 これと同様の機能がUWSCというソフトにPeekColorというのがあります。 宜しくお願いします。
GetPixel
250 :
235 :2006/10/07(土) 12:09:23
すみません、降参します(´・ω・`)
251 :
デフォルトの名無しさん :2006/10/07(土) 13:00:46
くだらない質問で恐縮ですが、 現在選択されているフォントの情報を、LOGFONT 構造体に取得するにはどうすればいいのでしょうか? コモンダイアログでフォントを選択したいのですが、 現在のフォントをデフォルトとして、CHOOSEFONT 構造体の lpLogFont メンバに与えたいのです。 よろしくお願いします。
くだらな過ぎて答える気にもならんな
んじゃ、お前は黙ってろカス
>>252 GetObject
DCに選択されている、という意味なら先にGetCurrentObject
257 :
252 :2006/10/07(土) 18:37:17
>>255-256 ありがとうございます。
リストビューが使用しているフォントを取得したいです。
LOGFONT lf;
ZeroMemory(&lf, sizeof(LOGFONT));
HDC hDC = ::GetDC( /* リストビューのハンドル */ );
HFONT hCurFont = (HFONT)GetCurrentObject(hDC, OBJ_FONT);
::GetObject(hCurFont, sizeof(LOGFONT), &lf);
こんな感じでやってみましたが、
帰ってきたのは、System のサイズ 14 のフォントで、リストビューのフォントとは違っていました。
259 :
252 :2006/10/07(土) 18:48:57
>>258 ありがとうございます
フォントの設定を WM_SETFONT でやってんのになぜ俺は・・・orz
こんばんわ ファイルダイアログやエクスプローラーでは「画像のサムネイル表示」がありますよね。 それを自分が作ったアプリケーションに実装したいと思うのですが、 おそらくCOMのインターフェースで何かあるのではないか?と思っているのですが 実際にあるのでしょうか? ご存知な方がいらっしゃれば助かります。
IShellFolder
USBに接続してるとデバイス情報が取得できると思うのですが。 たとえば、ベンダー情報とか製品情報など その情報はどのAPIを使って取得すればいいのでしょうか?
WMIとかかな?
266 :
567 :2006/10/08(日) 16:18:27
よぅみんな元気してたか?
OSが日本語版かそうでないか判断する際、どのような手法で判断すれば良いのでしょうか。
WINDOWS_WHERE_ARE_YOU_FROM
269 :
263 :2006/10/08(日) 17:51:57
USBに接続されたならWM_DEVICECHANGEが飛んできますから デバイス情報がわかるのですが、 case DBT_DEVICEARRIVAL: if (pHdr -> dbch_devicetype == DBT_DEVTYP_VOLUME) { PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)pHdr; 元からUSBに接続されているデバイスの場合だと、WM_DEVICECHANGEが着ません。 APIから呼び出してデバイス情報を取得する方法があれば助かるのですが。
>>269 PnP Configuration Manager
cfgmgr32でググってみれ。
>>260 CLSID_ShellThumbnailDiskCache
IShellImageStore
Shell Image Store Object
あたりかと
プロセスが動的にリンクしているDLLを調べるようなAPIってないですか?
>>273 即レスどうもです。参考になりそうです。ありがとうございます!
VB6の「DoEvents」と同じ機能を持つWinAPIはなんですか?
276 :
デフォルトの名無しさん :2006/10/09(月) 11:06:58
MsgBox
278 :
275 :2006/10/09(月) 11:16:32
VB6で出来てWinAPIでできない事ってあるのですか?
APIを用いて同等の機能を実現する事は出来ますが、同じ機能のAPIはありません。
単純に置き換えれるならVBいらんわな
VB諦めて、Windowsに制御を戻すAPIはありますか?
Windows は何も制御しません。
sleep?
DoEventsでぐぐったらすぐに見つかったよ "DoEvents PeekMessage"でぐぐってみ
俺なんて一人でSEXするよ
SAXか。俺は専らDOMだな。 つーか、MSXMLは使いにくくてしょうがない
>>286 SchemeだとSAXの方が相性いいよ。
>>275 まず、Windowsプログラムの仕組みから勉強すべし。
そうすれば、メッセージポンプを動かせばいい事が判る。
ちょっとさ聞きたいんだけどさ、
C++による簡単実習3次元CG入門って本のさ、
低レベルな部分はどうやって実装されているの?
ドットを表示したりウィンドウを作成する時にさWin32Apiを
使っているようには見えないのよ。
ヘッダを見た限り。。
win.libってのも読み込んでるけど、それかなあ。
っと思ってDumpBINで調べたらそうだった。
質問する意味が無くなったから文句を言いたい。
ソースを公開しろよ。ぼけ!!小笠原祐治はケチだ。
この本の存在理由がわからない。
まあ、プログラマーにわかり易く数学を教える意味の本なのだろう。
買う価値はない。
ttp://www.morikita.co.jp/soft/84142/CG_NET.exe
で?
それで終わり。
292 :
デフォルトの名無しさん :2006/10/09(月) 15:51:01
ふーん で?
そこからが始まり。
>>294 そうか。有難う。
向こうで書いてくるぜ
DVDのセクタを読み出すのにはどうしたらいいのでしょうか。 CreateFile/ReadFileでハードディスクは読み出せたのですが、DVDは読み出せませんでした。
もしかして、GENERIC_WRITEとか、GENERIC_ALLを指定してる?
>>296 ASPI や SPTI 経由で SCSI MMC の READ CD コマンドを発行する必要がある.
これだけ特有の単語を満載したから後はぐぐればわかるだろ.
ぐぐれって何ですか?やふったけどわかりません><
>>299 試しにやふってみたら、普通に分かるじゃねーか。
302 :
: :2006/10/09(月) 20:41:40
303 :
) :2006/10/09(月) 23:51:05
>>260 GDI+のGetThumbnailImage
IExtractImage
LVM_SORTITEMSEXとLVM_SORTITEMSの違いって何ですか? ヘルプ見ると同じっぽいんですけど。
SEXかどうかじゃね?
クソ、不覚にも笑っちまった
bitbltって一部領域外になるマイナス座標とかセットして 転送するとドライバーによっては落ちたりしますか? それともちゃんとクリッピングしてくれてるんでしょう? とりあえずうち環境では落ちないんですが。そもそもマイナス座標 を使っていいかも書いてないんで。。。
>>306 比較関数に渡されるアイテムのパラメータが違う。
LVM_SORTITEMS : LVITEM.lParam
LVM_SORTITEMSEX : 現在のインデックス
>>307 ;`;:゙;`(;゚;ж;゚; )
>>309 問題無い。
マイナス座標自体、特別扱いするものではなく、
デフォルトで、偶々負の座標領域が常にクリップされる状態になっているだけ。
SetWindowOrg等を使えば、(0,0)の位置自体動かせる。
311 :
309 :2006/10/11(水) 10:31:45
312 :
空猫 :2006/10/11(水) 23:56:03
こんにちは♪
Windows 2000 SP4上で、
VC++6.0を使いWin32プログラムを書いています。
その中でEditコントロールを使おうとしているのですが、
フォーカスが一度他のコントロールに移ると、
いくらマウスでクリックしても
Editコントロールにフォーカスを戻すことが出来なくなってしまいます。
何故、その様なことが起こってしまうのか
SPY++でメッセージを眺めたり、
MSDNを読んだりしてみたのですが、
どうしても判らず、知恵をお貸しください(汗
プログラムのソースを張っておきます。
http://skynekosky.web.fc2.com/edit/index.html
他の兄弟ウィンドウがかぶさってるとか
314 :
空猫 :2006/10/12(木) 00:18:57
少しづつコントロールのサイズを小さくし、 移動させて重ならない様にしみましたが、 挙動は変わりませんでした。。 また、もしや同じCreateWindowが2回実行されてしまっているのではと想い、 if ( WND_CHAT::hEditResCtrl == 0 ) WND_CHAT::hEditResCtrl = CreateWindow( .... の様に重複して実行されないようにしてみましたが、 改善されることはありませんでした。 私は何を見落としてしまっているのでしょう。。。(汗
SetWindowPosの所を以下のように直してみてくれ。 SetWindowPos(hwndCtrl, NULL, x, y, cx, cy, SWP_NOZORDER|SWP_SHOWWINDOW); Z-ORDER周りを弄っているのが怪しい。
316 :
空猫 :2006/10/12(木) 01:48:32
アドバイス有難う御座います♪ 仰ってくださった様に、z-order関係を変えてみたのですが、 変わらずフォーカスをEditコントロールに移すことが出来ませんでした(汗 SetWindowPos(hButtonCtrl, NULL, buttonSendRect.left, buttonSendRect.top, buttonSendRect.right-buttonSendRect.left, buttonSendRect.bottom-buttonSendRect.top, SWP_NOZORDER | SWP_SHOWWINDOW); んぅ。。。(悩
MDIなのかこれ。流石に素のWin32でMDIは組んだことが無いな…… とりあえず、MSDNで'Multiple Document Interface'を参照しながら頑張れ。
319 :
デフォルトの名無しさん :2006/10/12(木) 03:12:24
WS_TABSTOP
320 :
空猫 :2006/10/12(木) 04:07:14
>>317 このプログラムは、"MDICLIENT"や、MDICREATESTRUCTを使わないで、
MDIに似た機能を実現させているプログラム・・・でしょうか。
現在は、1種類の子ウィンドウを親フレームに表示させて居りますが、
いずれ他の機能を持つ子ウィンドウを
同一の親フレーム内に表示させたい為に、
この様な形を取ることにしました。
エディットコントロールを貼り付けるまでは順調だったのですが、
エディットコントロールだけは思うように行かずに悩んでしまい、
ここで助言を仰がせて頂いた次第です。
子ウィンドウに、
「さらに子コントロールを貼り付ける。」
という形に無理があるのでしょうか。。
322 :
空猫 :2006/10/12(木) 16:22:33
>>321 はにゃ、、仕様なのですか。。。。
んぅ、、何故、そんな仕様が(汗
教えてくださった皆様、
ありがとうございますっ♪
どうもありがとうございました。 アドバイスのおかげで一応何とかそれらしい手法に辿り着きました。 しかし、以下のようなコードで転送量(BUF_SIZE)をある値以上に大きくすると 素早く返ってきてScsiStatus=0になるのですが、 ある値以下にするとえらく遅く戻ってきてScsiStatus=2になります。 遅い場合、TimOutValueを5秒とかに設定していると DeviceIoControl()がセマフォタイムアウトエラー(121)で失敗します。 いったい何が起こっているのでしょうか? 転送量が少ない方が遅いというのが謎です。 ちなみに「ある値」はコロコロ変わるようです。(0x92eだと思ったら0x7feになってた・・・) それと、そもそもScsiStatusは0だとSS_PENDINGで結果が返ってこない状態だと思うのですが、 SPTIは同期的に働くのだというのでこれも不可思議です。 しかもSS_PENDINGなのにセクタデータはちゃんとバッファに入るようです。 またScsiStatus=2でもこれはSS_ABORTEDでエラーだと思うのですが、 これもセクタデータはちゃんとバッファに入るようです。
324 :
296 :2006/10/13(金) 00:41:52
#include <windows.h> #include "devioctl.h" #include "ntddscsi.h" #include "spti.h" main(){ HANDLE hDev; hDev = CreateFileA("\\\\.\\E:", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (hDev == INVALID_HANDLE_VALUE){ printf("CreateFile() failed\n"); exit(-1); } //#define BUF_SIZE 0xc00 //素早い #define BUF_SIZE 0x10 //遅い BYTE _rgbBuf[BUF_SIZE + 0x0f]; BYTE *rgbBuf = (BYTE *)(((DWORD)_rgbBuf + 0x0f) & 0xfffffff0); memset(rgbBuf, -1, BUF_SIZE); SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER sptdwb; memset(&sptdwb, 0, sizeof(sptdwb)); sptdwb.sptd.Length = sizeof(SCSI_PASS_THROUGH_DIRECT); sptdwb.sptd.CdbLength = 12;
325 :
296 :2006/10/13(金) 00:42:22
sptdwb.sptd.DataIn = SCSI_IOCTL_DATA_IN; sptdwb.sptd.SenseInfoLength = 14; sptdwb.sptd.DataTransferLength = BUF_SIZE; sptdwb.sptd.TimeOutValue = 30; sptdwb.sptd.DataBuffer = rgbBuf; sptdwb.sptd.SenseInfoOffset = (BYTE *)&sptdwb.ucSenseBuf - (BYTE *)&sptdwb; sptdwb.sptd.Cdb[0] = 0xbe; // Read CD sptdwb.sptd.Cdb[8] = 1; sptdwb.sptd.Cdb[9] = 0x10; BOOL bRes; DWORD dwResCnt; printf("rgbBuf[0] = %02X\n", rgbBuf[0]); bRes = DeviceIoControl(hDev, IOCTL_SCSI_PASS_THROUGH_DIRECT, &sptdwb, sizeof(sptdwb), &sptdwb, sizeof(sptdwb), &dwResCnt, NULL); if (!bRes){ printf("DeviceIoControl() failed\n"); exit(-1); } printf("rgbBuf[0] = %02X\n", rgbBuf[0]); printf("sptdwb.sptd.ScsiStatus = 0x%08X\n", sptdwb.sptd.ScsiStatus); }
ドライブに対してセクタ単位以外の転送要求を出してうまくいくほうがおかしい
ファイル名を指定して実行で、ディレクトリを実行すると ("C:\Program Files" みたいな) エクスプローラが表示されますが、 ほかのプログラムを実行することはできませんか。 APIを使ってどうにかできることではないのでしょうか。
>>327 それは多分無理っぽいな
入力で
Myapp.exe C:\Program Files
見たいな事はもちろん出来るんだけど
レジストリで関連付け変えればできるがAPIでは無理かもしれんな
バッチファイル使えよ
331 :
デフォルトの名無しさん :2006/10/13(金) 14:32:02
LineTo()で線を引きたいんですが、色を変えることって出来ないんでしょうか?
>>331 :LineToのMSDN記述より
直線は現在のペンで描画されます。
ペンがジオメトリックペンである場合、現在のブラシで描画されます。
ペンの詳細については、CreatePen 関数とそれに関連する各構造体を参照してください。
:CreatePen
HPEN CreatePen(
int fnPenStyle, // ペンのスタイル
int nWidth, // ペンの幅
COLORREF crColor // ペンの色
);
レジストリですか。 すれ違いぽいのでさようなら。 ありがとうございました ノシ
勘だけで書くと
>>327 はシェルまわりのプログラミングになるのか、
ファイル名を指定して実行ダイアログのAPIかメッセージを横取りとか?
エクスプローラに引数を与えて起動させるだけじゃないのか?
IShellExecuteHook
ウインドウプロシージャで動的に確保したポインタを WM_DESTROYのところで解放して大丈夫ですかね? switch文の外だから末尾で解放するのと、 どちらが正解なんでしょうか? あ、関数ではなくnewの場合です。
ソースup もしくは日本語でおk
というかWindows API関係ないだろ・・・
リストビューがレポートスタイルで表示されているときに、リストビューのウィンドウハンドルから 特定のセルの値を抽出したいのですが、ウィンドウハンドルを取得した後 どうすればいいのか分かりません。 例えばx行y列のセルの値を取得した場合はどのようにすればよいのでしょうか。 よろしくお願いします。
342 :
341 :2006/10/14(土) 05:35:49
すいません。分かりました。
>>322 > はにゃ、、仕様なのですか。。。。
> んぅ、、何故、そんな仕様が(汗
ウィンドウのフォーカスがキーボード入力の可否を示すと同様に、
ウィンドウのアクティブはマウス入力の可否を示す。
キャプション付き子ウィンドウが非アクティブならマウスは来ない。
344 :
デフォルトの名無しさん :2006/10/14(土) 18:51:14
質問です 48×48なアイコンをSHGetFileInfoやExtractAssociatedIconのようにして 実行ファイル等から取得する事は可能ですか?
試しにやってみて出来たら可能。 出来なかったら不可能。
スレッドのサスペンドカウントを取得したい場合、 SuspendThread/ResumeThreadで実際にサスペンド/レジュームさせて、 戻り値を見るしかないのでしょうか??
ボタンウィンドウ表示したとき高速で画像更新(FPS20ぐらい) するとボタンがチラチラすのは仕様?
そこでバッファリングがダブルですよ
だな
351 :
デフォルトの名無しさん :2006/10/15(日) 09:35:07
なんか、妙な質問かもしれないですが・・ ポップアップメニューから送信されるメッセージは どのようにフックすればイイのでしょうか? spyで見ようとしても、「指定のウインドウはスパイできません。」等と 言われ、困っております・・。 何がしたいかと言うと、右クリック -> メニューにて 表示されるコマンド(例えばプロパティとか)をフックして キーバインドさせたいのですが。
>>346 フックを仕掛けて、呼び出した回数を常に別のところに保管しておくという方法も。
353 :
341 :2006/10/15(日) 12:41:35
別アプリケーションのリストビューから列名を取得しようとして以下の コードを書いているのですが、うまく取得できません。 何が足りないのでしょうか??? GetWindowThreadProcessId(hWnd, &dwProcessID); hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID); dwSize = sizeof(LVCOLUMN) + 128; plvcClient = (LVCOLUMN *)VirtualAlloc(NULL, dwSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); plvcServer = (LVCOLUMN *)VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); plvcClient->mask = LVCF_TEXT; plvcClient->pszText = (char *)(plvcServer + 1); plvcClient->cchTextMax = 128; WriteProcessMemory(hProcess, plvcServer, plvcClient, dwSize, &dwNumberOfBytes); SendMessage(hWnd, LVM_GETCOLUMN, (WPARAM)1, (LPARAM)plvcServer); ReadProcessMemory(hProcess, plvcServer, plvcClient, dwSize, &dwNumberOfBytes); VirtualFreeEx(hProcess, plvcServer, dwSize, MEM_DECOMMIT | MEM_RELEASE); VirtualFree(plvcClient, dwSize, MEM_DECOMMIT | MEM_RELEASE); CloseHandle(hProcess);
ちなみにSendMessageの戻り値はTRUEで帰ってきます。 また、widthを取得しようとするとうまく取得できています。
plvcClient->pszTextの値に惑わされている予感。
356 :
353 :2006/10/15(日) 14:30:03
>>355 まさにその通りでした。ちゃんと取れてました。
あとVirtualFreeExとVirtualFreeのサイズに0を指定しなければ
ならないのにdwSizeを指定してしまい、解放できていませんでした。
ご迷惑おかけして申し訳ありませんでした。
質問です ファイラーのようなものを作りたいと考えているのですが、 アプリケーション外の領域に対するファイルのドラッグ&ドロップの挙動を Windows標準のエクスプローラと同じものにする簡単な方法はありませんでしょうか。
だったらエクスプローラを拡張するソフトを作れば? 既に腐るほどあるけどさ。
ラッパーちゃん重いお
精神的ブラクラ注意
>>362 せめて拡張子変えとけばいいのに。。。。
ここは何のスレだ?
すみません、ウィンドウが表示されているかどうかを取得するにはどうしたらいいんでしょう? 設定するには ShowWindow でいいのですが、取得方法は、 GetWindowInfo、GetWindowLongPtr などを調べても見つからなかったです。 Windows XP です。
俺は if(GetWindowLong(hWnd, GWL_STYLE) & WS_VISIBLE) でやってるが自己流なんでなんかマズいかもしれん
IsWindowVisible
おまえあたまいいな
369 :
365 :2006/10/15(日) 18:47:42
370 :
351 :2006/10/15(日) 20:44:48
>>351 は
なんとかならんとですか?
1件見つかったんだけど、メニューへの挿入方法で
微妙に違うし、ソース公開されてなかったし・・('A`)
#32768に、なにか送りつけても意味なさげのようで。
>>370 リソースエディタで見てわからんか。
リソースとして埋め込んでない場合もあるけど。
>>366 親が最小化されている等の理由で見えないときでもWS_VISIBLEは落ちないけど
IsWindowVisible()はFALSEを返す
>>370 WH_SYSMSGFILTER?
373 :
351 :2006/10/15(日) 22:37:21
スレッドA : GetMessage() ループしている Windowなスレッド スレッドB : 窓を持たない 非Window なスレッド として、 スレッドB から スレッドA内で生成された Window に対しての SetWindowText() / SendMessage() は スレッドA が動いていない場合には スレッドB内でブロックされるのでしょうか?
何故試さない?
376 :
374 :2006/10/16(月) 12:47:28
デバッガではブロックされているように見えるんだけど 仕様なのかどうかわからないので質問してみました
仕様
379 :
374 :2006/10/16(月) 13:15:54
>>377-378 ありがとうございます。 仕様ということで理解しました。
スレッド設計見直しか…
スレッドB が定期的に SendMessage してて、スレッドA の WM_CLOSE をきっかけに
スレッドB を停止させようとしてた(停止用 event をsignalにして theaed handle が signal まで待つ)のですが、
そこでデッドロックしていたと…
すいません質問させて下さい。 ファイルを保存する際に、コモンダイアログボックスを呼び出した場合 デフォルトでファイル名の場所に、文字列を入れるにはどうしたら良いのでしょうか。 よろしくお願いします。
382 :
デフォルトの名無しさん :2006/10/16(月) 18:07:04
印刷設定ダイアログを開いてWindowsに反映させる方法を教えて下さい。 プリンタドライバの固有の設定(集約印刷)を反映させる方法が分かりません。
今回初めてwin32apiを使用するのですが ウィンドウサイズを変更したりウィンドウを移動させたりすると ウィンドウプロージャのデフォルトの部分 default: return DefWindowProc(hWnd, message, wParam, lParam); で0xC0000005のエラーを吐いてしまいます。 ウィンドウを移動したりしない場合は問題なく動作してるのですが・・・ どのような場合にこういうエラーが起こるのかアドバイスを頂ければと思います。
384 :
デフォルトの名無しさん :2006/10/16(月) 18:27:18
lineto()で閉じた図形を描いてその中を塗りつぶす方法が知りたいです。
頑張れば出来る
387 :
386 :2006/10/16(月) 18:31:43
0xC0000005のエラーってなんだ? アドレスのこと? アクセス違反か? case WM_SIZE:の下にちゃんとreturn 0入ってる?
388 :
デフォルトの名無しさん :2006/10/16(月) 18:32:39
>>387 0xC0000005 って言えば2ちゃんでも超有名なあれじゃないか。
見たことないの?
389 :
386 :2006/10/16(月) 18:34:52
>>388 いやだからアクセス違反の0xC0000005なのかアドレスを示す0xC0000005なのかと
>>386 言葉足らずで申し訳ないです。
アクセス違反の0xC0000005です。
> 0xC0000005: 場所 0xe36eeb84 を読み込み中にアクセス違反が発生しました。
391 :
386 :2006/10/16(月) 18:43:07
ふむ 関係ない変数とかをプロシージャに返してない? int message; ・・・ switch(msg){ ・・・ default: return DefWindowProc(hWnd, message, wParam, lParam); ・・・ まさかねそんなことしないよね
392 :
383 :2006/10/16(月) 18:48:34
>>386 そういうことはしてないと思います。
ウィンドウサイズを変更するとすぐにエラーが出てしまいます。
WS_PAINTの処理をしてそのあとdefaultの項に移動してそこで止まります。
ウィンドウを移動すると1秒ぐらいは問題なく移動できてその後エラーが出てしまいます。
break の入れ忘れとか
特定の case で初期化される
>>391 の message のような変数を 別の case で利用しているとか
hWnd 書き換えてしまったとか
394 :
386 :2006/10/16(月) 18:52:42
>>384 キーワード:クリッピング
ウザイからコテはずすか・・
396 :
383 :2006/10/16(月) 19:15:34
manager.Set_Paint(&hDC,&hPen,&ps); で auto変数へのポインタ設定してるじゃん。 こういう使い方って保証されたっけ? WM_CREATE で設定後スコープ脱出 WM_PAINT で設定されたポインタ参照。 参照先は上の状態で設定したスコープ内ポインタ
クラスの実体は? DeleteObjectしてるけど、ちゃんとどこかでCreatePenしてる? システムオブジェクトはDeleteObjectしちゃだめだよ
399 :
383 :2006/10/16(月) 19:30:36
添削気取り乙
>>398 あー・・・
CreatePenは最初はしてたけど途中から使わなくなったんで消してましたorz
しかし、その部分をコメントアウトしてやっても改善しないようです。
どういうことなんだろ・・・
401 :
383 :2006/10/16(月) 19:32:16
>>397 もしかして、とても変な事してますかね・・・
不愉快だ。帰る。
>>404 おこらせてしまったようです、申し訳ありません
「俺が」よくするのはバッファオーバーフローとかしてて DefWindowProcに到達するころにはhwndがぶっ壊れてる んでアクセス違反と
>>403 例えの話になるけど、auto変数確保って呼び出された時のスタックを擬似拡張してやりくりしてるわけじゃん。
そんな場所へのポインタを保持したところで、
WM_CREATE 呼び出し時のスタック状況が一致すること前提でないと正しく機能しないと思うんだけど?
>>403 auto変数(staticとかexternとかを省略した場合のデフォルト)になってるから
WndProcを抜けるとその変数のメモリ領域は開放される
だからそれを参照しようとするとまずい
ってことだと思うよ
static宣言でもつけとけばいいんじゃね
それ以前に抜け出した後、そこの内容は壊される可能性があるか。 <auto変数
412 :
410 :2006/10/16(月) 20:03:30
>>411 釣りじゃなくて素で気にしてるんだけど… 釣りに見えた?
void foo(int a)
{
static int* p=NULL;
int me;
if (a==0) p=&me else if (a==1) *p=1; else printf("%d", *p);
}
void bar()
{
int a, b, c; ..... /* a,b,c を適度に R/W */
}
として
foo(0); bar(); foo(1); bar(); bar(); foo(-1); と呼び出したらおかしくならないか?
>>412 そういう意味ね。
>それ以前に抜け出した後、そこの内容は壊される可能性があるか。
って書いてたからカンチガイした。
>それ以前に抜け出した後、そこの内容は壊される可能性がある。
ならわかった。
414 :
383 :2006/10/16(月) 20:13:45
返答ありがとうございます 色々試してみようと思います
415 :
383 :2006/10/16(月) 20:54:26
今日はもう帰宅するので明日試してみます また明日質問させて頂くかもしれませんがよろしくお願いします
そう言い残して
>>383 は帰宅のとについた・・・・
しかし・・・・
この後
>>383 に起こる悲劇を誰が予測できたであろうか。。。。
ヽ|/ / ̄ ̄ ̄`ヽ、 / ヽ / \,, ,,/ | | (●) (●)||| | | / ̄⌒ ̄ヽ U.| ・・・・・・・・ゴクリ。 | | .l~ ̄~ヽ | | |U ヽ  ̄~ ̄ ノ | |  ̄ ̄ ̄ |
お前らw
タスクトレイにあるアプリケーションの画面を表示させるにはどうすればいいのでしょうか?
タスクトレイでマウスクリックしたことにする
421 :
デフォルトの名無しさん :2006/10/17(火) 08:34:13
ウインドウハンドルから最前面表示設定されているかどうか判定するAPIってありますか? 最前面表示するSetWindowPosで設定しても、GetWindowPosみたいなのがあるかと思いましたが、 探してもみつからないので、お助けください。
423 :
383 :2006/10/17(火) 09:19:25
昨日はありがとうございました。
おはようございます
昨日の問題についてはAuto変数ををstaticにすることで無事解決したようです。
ありがとうございました。
ところで
>>412 の
foo()とbar()って互いに影響を及ぼすような物ではないように思えるのですが
foo(0); bar(); foo(1); bar(); bar(); foo(-1); の様に繰り返すとどのような不都合が発生するのでしょうか・・・?
>>423 > 昨日の問題についてはAuto変数ををstaticにすることで無事解決したようです。
原因は理解したの?
425 :
383 :2006/10/17(火) 09:46:48
ポインタにauto変数を代入してるため procが呼び出されて終了するとポインタもとが削除されてるからエラーになる… でいいのかな 毎回ポインタを再設定するかポインタ元をstatic変数にすればいいのですかね
>>421 GetWindowLongのGWL_EXSTYLEじゃないかな?
>>428 rundll32.exe printui.dll PrintUIEntry
じゃ駄目?
>>423 不都合っていうか int me; が割り当てられるスタックの中身が
書き換わる可能性があるってことだろ。
意図的に>412のコードを書いてるなら
値は未定義だとしてもちゃんと動くんじゃね?
432 :
383 :2006/10/17(火) 15:46:02
>>426 参考のコードを実行したところ
int meのアドレスとint bのアドレスが同じになってました。
つまり
static int* pの中身がbar()の実行中はint bになってしまう
(*pの中身が不定になる?)
ということで良いのでしょうか
とにかくやってはいけないことをやっているという事は良くわかりました。
ありがとうございます。
433 :
デフォルトの名無しさん :2006/10/17(火) 18:15:57
SHGetFileInfo()のSHGFI_ICONLOCATIONはパスのアイコンがしまわれてる 位置を返すのですが、大抵のアイコンはDLLに入っててインデックスが わからないのでアイコンが取得ができない…orz こいつはいったい何のためにあるのですか? それともアイコンインデックスを取得する何か別な方法があるのですか? 教えてください。
SHFILEINFO::iIconは違うのか?
・SHGFI_ICONLOCATION.....ファイルを表すアイコンを含むファイル名を返す (ファイル名はpsfiにより指定されるTSHFileInfo構造体のszDisplayNameにコピーされる)
437 :
433 :2006/10/17(火) 19:29:23
完璧見落としてました…すみません。 アイコンリソースを直接取得したかったので調べてました… ありがとうございましたm(__)m
438 :
デフォルトの名無しさん :2006/10/17(火) 19:39:34
delphiの方で教えてくれるんじゃネーの?
ウィンドウ分割するときって皆どうしてる? 猫でもわかる〜みたいに ウィンドウに子ウィンドウを貼ってる? MFCはどうやってやってるのかイマイチ和漢ね
442 :
567 :2006/10/18(水) 00:15:38
念力
WTL
モジュールの自分自身が利用しているメモリ使用量(タスクマネージャで表示されている数)を 取得する関数ってありますか?
MSDNの「TCHAR 単位で指定します。」ってのは TCHAR buf[MAX_PATH] でいうと sizeof(buf) ではなく MAX_PATH を渡せって意味?
普通に考えたらそうだろうね
トン TCHAR なのに sizeof(buf) 渡してるサンプルも結構あるからアルェ-と思ってな
>>448 APIによってバッファサイズの指定単位がばらばらだからね。
「TCHAR単位で」と明示してある場合は、sizeof(TCHAR) * 要素数。
>>499 >「TCHAR単位で」と明示してある場合は、sizeof(TCHAR) * 要素数。
違うような気がする。
>>450 うわ、素で書き間違えたww
TCHAR単位の場合は、要素数ですねorz
Windowsが終了するときに来るメッセージってありますか?
WM_QUERYENDSESSION/ENDSESSION
MSDNOnlineでDisableProcessWindowGhostingが見つからないのですが禁止ですか。 (VS2003付属のmsdnにはありました)
VS2005 と WindowsSDK for VistaRC1 のには載ってる。
クラス名もウィンドウキャプションも環境によって変化するウィンドウのウィンドウハンドルを取得したのですが どうやればできるのか教えて下さい。宜しくお願いします。
ごめんなさい ウィンドウハンドルを取得したいのですが の間違いでした。
ウィンドウキャプションを目視で確認してからウィンドウを探せばいいと思うよ まあプログラムだけでやりたいなら取得したいウィンドウの共通点みたいなのがないと難しいんじゃないかと思う ウィンドウの大きさとかウィンドウを作成したプロセスのexeファイルのパスとか
列挙するだけしといて キャプションを正規表現で刈り込んでくとか… プロセスid で刈り込んでくとか… # WindowClass 名が変化する ってのは MFCで書かれたアプリケーションか?
標準のEDITコントロールとかを探そうとしてるのか? トップレベルのWindowを探しておいて、そこのn番目の兄弟/子供から って 事前に対象を絞り込んだほうが良いと思われ
462 :
457 :2006/10/18(水) 21:24:46
>>459 それはProcessIDから調べるという事ですか?
>>460 正規表現はよくわからないのでProcessIDからどうにかならないか調べてみる事にします
お二人共有難うございました。
なんとなくEnumWindowsを使えばいいのかなぁと思ってるけど合ってるのかな
>>462 何がしたいのか具体的に言ってくれればもっとちゃんと答えられるかもしれない
>>461 そうです。Editを探してそこにテキストをセットしたいと考えています。
FindWindowで見付からないかと見てみたらクラス名もキャプションも使えそうにないので質問しました。
3行目以降何を言っているのか理解できない俺には無理なんでしょうか
自分のプログラム中でなら、概ね GetDlgItem と リソースID で対象は特定できるな
他人のプログラム中のEDITコントロールが対象なら
>>459-461 のように手間をかけねばならない。
やりたいことをはっきり示せ
466 :
457 :2006/10/18(水) 23:37:50
EnumWindowsで列挙したWindowからGetWindowTextでキャプションを取得し特定の文字列がキャプションの中に存在したら そいつが親Windowって事で見つける事ができたのですが 目的のEditコントロールが、一番上の親Windowから見てひひひひ孫くらいに存在して しかもひひ孫とひひひ孫くらいにまた可変クラスネームが存在し、 EnumChildWindowsでは追いかけきれずに目的のコントロールをプログラム中から特定する事ができませんでした。 LimeChatで外部ツールから発言させようと思っていたのですが無理っぽいです。 皆さん有難うございました。違う角度からアプローチしてみます。
>>466 >しかもひひ孫とひひひ孫くらいにまた可変クラスネームが存在し
わざわざ途中の調べなくてもよくね?
無条件で子ウィンドウ列挙してってひたすら文字列を比較でいいじゃないか
まあ動作めちゃくちゃ遅くなるだろうけど・・・
手動でもいいならLimeChat起動する度にマウスキャプチャー使って取得するって手もあるが
>>466 ウインドウ列挙だけに頼らないで他の条件からも特定していけばいいんでね
469 :
デフォルトの名無しさん :2006/10/19(木) 01:21:32
ダイアログボックスを リソーススクリプトで設定、DialogBox(...)で呼び出す場合、 文字色を変えたり 不定形リージョンを指定したり できないんですか? 既出だったらごまんなさい。
>>466 EnumChildWindowsでよくない?
見つかった子の親と孫もついでに調べて条件に合ってるか判別してくとか
471 :
デフォルトの名無しさん :2006/10/19(木) 08:51:36
自分とは別の exe ファイルの中の文字列リソースを取得するのはどうするの? DLL は、LoadLibrary → LoadString で取得できた。 CreateProcess → LoadString?
>>471 ふつうに LoadLibrary でいいと思うけど。
473 :
デフォルトの名無しさん :2006/10/19(木) 16:00:48
>>472 どもです。出来ました。
LoadLibrary って DLL だけかと思いこんでました。
ありがとうございました。
474 :
デフォルトの名無しさん :2006/10/19(木) 17:31:45
LoadLibraryExにLOAD_LIBRARY_AS_DATAFILEを指定して読み込んだ方がいいような気がする。
最前面であるかを知りたいのですが、GetWindowPosがな…、
>>421 おまいは俺か
GetWindowLongのGWL_EXSTYLEで、WS_EX_TOPMOSTとorとればいいんですね。
ありがとうございました。
477 :
デフォルトの名無しさん :2006/10/19(木) 18:22:55
DiskeeperのIO Smartみたいな機能ってどうやって実装すればいいですか? ディスクにガリガリアクセスするようなアプリで 他がHDDにアクセスしていたらその間はアプリ側の作業を止めるという物です。 プロセスのプライオリティの設定では出来ません。
479 :
デフォルトの名無しさん :2006/10/19(木) 18:30:11
>>476 そう・・・私はあなたの生き別れた双子の妹です。
480 :
デフォルトの名無しさん :2006/10/19(木) 18:30:59
481 :
デフォルトの名無しさん :2006/10/19(木) 19:59:49
コントロールを作成するとき、ウィンドウハンドル値を指定して作成できますか? または、あるコントロールに対しウィンドウハンドルを任意の値に書き換えることは出来るのでしょうか? よろしくお願いします。
どちらもできません。
>>481 できません。
ハンドルの実体はOSが内部で使用している構造体を指すポインタ。
今初めて知った
だから被ることはないわけだ
487 :
デフォルトの名無しさん :2006/10/19(木) 21:39:57
質問です。 WMPAINTで四角を表示してクリックで位置を変えるようにしたいのですが HDC hdc; PAINTSTRUCT ps; int n=10; switch (msg) { case WM_LBUTTONDOWN: n=n+10; InvalidateRect(hWnd, NULL, TRUE); return 0; case WM_PAINT: hdc = BeginPaint(hWnd , &ps); RoundRect(hdc , n , 10 , 50 , 30 , 50 , 50); EndPaint(hWnd , &ps); return 0; これでは何故だめなのでしょうか? かなり考えたのですが分からないのでどなたか教えてください
>>487 そういう n は「ローカル変数」といって、関数を抜けた時点で値は保障されない。
次に呼ばれる時には再び 10 が代入される。
static int n = 10; としておけば、関数を抜けても値は保持されるし、
一番最初にこの関数が実行されるときにだけ 10 が代入されて、思った通りに動く。
489 :
デフォルトの名無しさん :2006/10/19(木) 21:56:51
禁則?!
>>486 公開されてないし、ポインタという保証も無い。
スタティックのローカル変数と グローバル変数ってスコープが違うだけで 他の動きは同じだよね?
クラスインスタンスだと、初期化される時が違う。 グローバル変数だとmain/WinMain関数よりも前にコンストラクタが呼ばれる。 静的変数だと最初にその変数が参照されたときにコンストラクタが呼ばれる。
さすが 勉強になります
>>493 定数でない初期値がある場合、最初の1度だけ初期化が行われるように
初期化済みかどうかを覚えておくフラグと、チェックするコードが追加される。
void foo(int x) { static int n = x; return x; }
↑最初の1度だけxが代入され、その後ずっと変わらない。
497 :
デフォルトの名無しさん :2006/10/19(木) 23:43:55
#define WIN32_LEAN_AND_MEAN #include <windows.h> int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { HANDLE hHandle; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hHandle); LUID lLuid; LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &lLuid); LUID_AND_ATTRIBUTES lLuidAttr; lLuidAttr.Luid = lLuid; lLuidAttr.Attributes = SE_PRIVILEGE_ENABLED; TOKEN_PRIVILEGES Newtoken; Newtoken.PrivilegeCount = 1; Newtoken.Privileges[0] = lLuidAttr; AdjustTokenPrivileges(hHandle, FALSE, &Newtoken, 0, NULL, NULL); CloseHandle(hHandle); ExitWindowsEx(EWX_POWEROFF, 0); return 0; }
hBitmap = CreateCompatibleBitmap(hdc, fwidth, fheight) GetDIBits(hdc, hBitmap, 0, fheight, lpPixel, bi, DIB_RGB_COLORS) a = GetPixel(hdc, 100, 100) GetDIBitsでlpPixelの中に格納されている情報とGetPixelでは値が異なるみたいなのですが、 lpPixelにはRGB値が格納されないのですか? もし可能であればlpPixelに格納されている情報をRGBにしたいのですが、 どうすればできますか?
CreateCompatibleBitma() で生成せずに CreateDIBSection() で 24bit カラーのビットマップを作るしかないようなキガス
位置に対するアドレスの計算はどうやってやってるんだ?
>>499 回答ありがとうございます。少し調べてみます。
>>500 (x * 2) + ((fheight - y) * (fwidth * 2))
これでできました。
>>501 次の row を指すだめの量 = (width * 3) を DWORDでアライメントした値
w2 = (width * 3 + sizeof(DROWD)-1) / sizeof(DROWD) * sizeof(DROWD);
(height-1 - y) * w2 + (x * 3)
DROWDてなんすか?
るかわばめよにさかさ
?かすんなてDWORD
506 :
498 :2006/10/20(金) 02:09:30
SPY++でメッセージの監視が出来ないソフトって どんな方法で拒否してるんでしょうか? それと、CreateToolhelp32Snapshotでもハンドルを キャッチできないプログラムはどのような仕組みなのでしょうか? 質問2つですいませんが、教えて貰えると助かります。
>>507 ソニーの音楽CDによって提供される機能を利用しています。
509 :
567 :2006/10/20(金) 02:59:35
Λ_Λ うるさいわね! ('・ω・゛) そんなことより私の下着、返してよ! (つ/ ) |`(..イ しし'
>>492 実はDDK見ると書いてるって場合もあるけどね。
Windowsのバージョン間や9x系とNT系でまったく違うことも珍しくないし
HDROPはDROPFILESとしてSDKに載っているね。
タイトルバー上での右、中クリックの動作を拡張したくWH_MOUSEを指定してフックをしました。 目的の通り右クリックでMAXIMIZE、中クリックでCLOSEさせることができたのですが MAXIMIZE後、マウスカーソルの位置がタイトルバー以外に移動したとき WM_RBUTTONUPが呼ばれるらしくアプリケーションの右クリックメニューが出てしまいました。 そこでWM_NCRBUTTONDOWNをWM_NCRBUTTONUPに変更したところ何故かメッセージが全くきませんでした。 どうすれば目的を達成出来るでしょうか?
513 :
512 :2006/10/21(土) 09:26:31
該当部分のソースコードです。 LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) { if(nCode == HC_ACTION) { mh = (MOUSEHOOKSTRUCT *)lParam; if(mh->wHitTestCode == HTCAPTION) { switch(wParam) { case WM_NCRBUTTONUP: PostMessage(mh->hwnd, WM_SYSCOMMAND, IsZoomed(mh->hwnd) ? SC_RESTORE : SC_MAXIMIZE, 0); return 1; case WM_NCMBUTTONDOWN: PostMessage(mh->hwnd, WM_SYSCOMMAND, SC_CLOSE, 0); return 1; } } } return CallNextHookEx(g_hHook, nCode, wParam, lParam); }
WM_PAINTってwParamは使ってないとヘルプにあるのに HDCを入れるプログラムがよくあるけど、これどうなってるの?
コモンコントロールの真似してる
VCのIDEやMS-Officeのホットキーをフックで奪う常駐アプリを書いてるんですが SetWindowsHookEx(WH_GETMESSAGE, ...); でWM_SYSKEYUPを捉えてもたまに取り逃がすことがあるようです。(成功する時もある) officeのキーボードアクセラレータより早く、そして確実に検出する方法は無いもので しょうか? ちなみに開発・テスト環境ともに日本語w2k+SP4です
開発環境は?
518 :
516 :2006/10/21(土) 19:00:08
VC++6 + SP5 + PlatformSDK(Feb/2003)です。
WM_SYSKEYDOWN ↓ WM_SYSKEYUP なので WM_SYSKEYDOWN も試してみたらどうだろう。 と、試した事のない俺が言ってみる。
フックプロシージャはEXE内部にあります? それともDLL内部?
リピートがかかるとUPがこないでDOWNが連続してくるんじゃなかったっけ
522 :
516 :2006/10/21(土) 19:25:26
>>520 DLL内部にあります。その場でWM_SYSKEY*をWM_NULLに置換しちゃうだけです。
PC自体の負荷が高いと取りこぼすことがあるんだろうか・・・
>>521 はい、キーを少し長めに押して離すと
WM_SYSKEYDOWN
WM_SYSKEYDOWN
WM_SYSKEYDOWN
WM_SYSKEYDOWN
WM_SYSKEYDOWN
WM_SYSKEYDOWN
WM_SYSKEYUP
となるので、1つ目で拾えなくても2つ目以降でキャッチできるのか、WM_SYSKEYDOWN
だと(今のところ)100%キャッチできるようになりました。(
>>519 さんの方法)
配置したコントロールの画面上の位置を取得するAPIを教えていただきたく
配置したなら座標知ってそうに思えるけど GetWindowRect(), GetClientRect()あたりでできます。
これを知りたいんじゃないか? ClientToScreen()
GetWindowRect->MapWindowPoints
クライアント座標ってなんですか?
>>527 クライアント領域の(0,0)とした時の相対座標。
529 :
528 :2006/10/22(日) 18:49:53
ゴメ
>>527 クライアント領域の左上を(0,0)とした時の相対座標。
530 :
デフォルトの名無しさん :2006/10/23(月) 15:56:10
他のプロセスのウィンドウへ、キーを押したとするシミュレートをしたいです。 例えば、電卓を起動してるとき、'1'という文字を電卓に送って、電卓に1が表示されるように。 現在、電卓のメインウィンドウのハンドルを取得することはできたが、それに、 SendMessage(電卓のWindowハンドル,WM_KEYDOWN,0x31,0x00150001); とやっても、何も起きません。どうしたらいいですか
ヒント:PostMessage
533 :
デフォルトの名無しさん :2006/10/23(月) 16:50:55
単に、PostMessage にしたらでめあした。orz.orz.orz.orz.orz.orz.orz.orz.orz.orz.orz.orz. こんなことで数時間も悩んでたなんてまじっすか。orz.orz.orz.orz.orz.orz. てかなんでSendMessageじゃだめなんだこらお
SendMessage(A)
ウィンドウにメッセージを送信します。
この関数は、指定したウィンドウのウィンドウプロシージャが
処理を終了するまで制御を返しません。
メッセージを送信して直ちに制御を返すには、
SendMessageCallback 関数または SendNotifyMessage 関数を使います。
メッセージをスレッドのメッセージキューにポストして直ちに制御を返すには、
PostMessage 関数または PostThreadMessage 関数を使います。
LRESULT SendMessageA(
HWND hWnd, // ウィンドウハンドル
UINT Msg, // メッセージコード
WPARAM wParam, // wParamパラメータ
LPARAM lParam // lParamパラメータ
);USER32.DLL
ttp://yokohama.cool.ne.jp/chokuto/urawaza/api/SendMessage.html
宣伝?
過剰反応
>こんなことで数時間も悩んでたなんてまじっすか。orz.orz.orz.orz.orz.orz. 数時間でガタガタ言うんじゃねぇ。
ちょっともちつけ
悲しいけど俺も数時間停滞とかよくある 構造体メンバの初期化値がおかしいだけでした^^;; とかな ほんとAPIは地獄だぜ
リファレンスも読まないカスどもは氏ねばいいと思うよ
541 :
デフォルトの名無しさん :2006/10/23(月) 18:25:39
APIってネイティブコードですか?
Win32APIはそうだろうな。 第一Windows 95とかNT 3の頃には.NETなんてなかったし。
>>533 WM_KEYDOWN等のキーボード関係のメッセージは
メッセージループの中でウィンドウプロシージャに渡される前に
色々と処理される。
自分のプログラムのメッセージループで使っているAPIの説明を
読み直した方がいいよ。
544 :
デフォルトの名無しさん :2006/10/23(月) 21:58:17
他のプロセスのメニューハンドル(HMENU)を取得するにはどしたらいいですか? ウィンドウに割り当てられてるメニューなら、GetMenuで可能ですが、 右クリックで出てくるようなウィンドウに割り当てられてないメニュー
漏れの作ったソフトでは右クリックされてから CreateMenuしてるから 事前に取られる心配はなし。
547 :
デフォルトの名無しさん :2006/10/23(月) 22:18:16
>>546 だからウィンドウハンドルから取得できないのは分かってるってば
>>544 SetWindowsHook とか使ってメニュー関連のメッセージをモニタして
なんかのメッセージ中に含まれる HMENU を盗み見たりするしかないんじゃない?
549 :
デフォルトの名無しさん :2006/10/23(月) 23:09:53
>>548 それもあるが、それだと一回だけメニューを操作せねばならない。
メニュー操作無しで、ハンドルを取得っての。
見当として、CreateToolhelp32Snapshot でヒープリストやモジュールリストに
メニューハンドルが含まれてないかな
>>549 それじゃ後はもうAPIフックだのハンドルの実体のリストを
直接参照するだののかなり強引な技しかないんじゃね?
つか、そもそも他所様のメニューハンドルを取得してなにがしたいん?
> 見当として、CreateToolhelp32Snapshot で kernelとuserの区別も付いてないようじゃまったく見当はずれだな
552 :
デフォルトの名無しさん :2006/10/23(月) 23:49:44
やっぱ無理そうですね
>>545 みたいに右クリックするまでそもそもメニューが存在しない可能性もあるのに
確実に取れるわけない
>>553 APIフック系の技を使えば確実にできるよ。って、これはできる内に入らんか。
>>552 確か、 sysinternals の ProcessExplorer はメニューハンドルも全部表示してくれるけど、
あれは「ハンドルの実体のリストを直接参照する」技によるものだと思う。
sysinternals のプログラムってどれも一見ただの Win32 アプリだけど、
動的にドライバをインストールしちまったりとかかなりエグイ技を使うからねぇ。
556 :
デフォルトの名無しさん :2006/10/24(火) 09:38:26
MCIの質問はここでおk? MCI_OPENで音楽ファイルオープンしたときって ファイルの中身が全部メモリに読み込まれる?
試してみれば? 確か読み込まれないと思ったけど
MCIドライバの実装依存だが一般的には読み込まれない
559 :
デフォルトの名無しさん :2006/10/24(火) 11:45:09
560 :
ポロンガ :2006/10/24(火) 15:36:56
質問です。 現在リストビューの中のどれか一つを選択し、確認ボタンを押すとダイアログ で選択した項目が確認できるようなプログラムを組んでます。リストビューを 表示するにはCreateWindowEx関数を利用すればよいことはわかりました。確認 ボタンも同様にCreateWindow関数を利用すればよいことがわかりました。 そこでCALLBACK WndProc内で座標指定をしてリストビューとボタンを作ろうと しました。しかし、リストの項目は選択可能ですが、ボタンを押しても反応 しません。リストビューを作成する部分を除去してボタンだけを作るとボタン が押せます。 リストビューとボタンを一つの窓に表示する際にはどのようにプログラム すればよろしいのでしょうか?
561 :
ポロンガ :2006/10/24(火) 15:38:53
開発環境は以下のようになっています。 OS:WindowsXP コンパイラ:gcc(MinGW)
562 :
デフォルトの名無しさん :2006/10/24(火) 15:59:32
ハードディスクの回転をオン・オフする方法を教えてください。 win32APIの範疇ではないでしょうか?
563 :
567 :2006/10/24(火) 16:06:11
4ピンケーブル抜けばいいんじゃないか多分
564 :
デフォルトの名無しさん :2006/10/24(火) 16:06:18
それができると迷惑そうなソフトがつくれそうですね。期待。
スピンダウンタイムを1秒にでもすれば
566 :
デフォルトの名無しさん :2006/10/24(火) 17:07:42
タスクバーの長さを含まないデスクトップのサイズを取得するのってどのAPIでやりますか。 最大化したときになるサイズをとりたいんです。
567 :
デフォルトの名無しさん :2006/10/24(火) 17:08:20
あるソフトが排他書き込み中とかで、 エクスプローラでファイルコピー出来ないようなファイルを ムリヤリ読むソフトとか方法はありますか?
4ピンケーブル抜けばいいんじゃないか多分
>>562 昔はSTOPキーを2回押すだけでできたんだがなw
>>566 GetSystemMetricsかSystemParametersInfo
>>566 SystemParametersInfoのSPI_GETWORKAREA
572 :
デフォルトの名無しさん :2006/10/24(火) 18:46:46
573 :
デフォルトの名無しさん :2006/10/24(火) 19:39:32
質問なのですが→キーとスペースキーを2つとも押しているときの操作はできるのでしょうか? 2つとも押しているときはスペースのみの操作も→キーのみの操作も働かない方法があれば教えてください
>>567 ボリュームシャドウコピー
ムリヤリというより標準のバックアップも使ってる正規の方法だが
575 :
デフォルトの名無しさん :2006/10/24(火) 21:07:09
>>573 片方が押されていたらGetKeyStateなどでもう片方も押されているかを調べる
>>573 そもそもキーボードがハードウェア的に同時押しに対応していない可能性がある。
そうだったらどうあがいても不可能
おとなしくシフト系キーとの組み合わせにしときなさい
577 :
デフォルトの名無しさん :2006/10/24(火) 22:00:41
>>575 有難うございます やってみます
>>576 いまWINAPIでゲームを作ろうとしてましてどうしてもスペースとの同時を使いたかったのです。
公開しないんだったら自分のキーボードで動けばいいんじゃないの。 まず動かないと思うけど
>>576 興味があったので家のPCでスペースと矢印を同時に押しっぱなしにしたら
WM_KEYDOWNあたりは片方しかこないけど、GetKeyStateでは両方押されることに
なってた。 GetKeyState系APIで片方しか拾えないキーボードに出くわしたことある?
>WM_KEYDOWNあたりは片方しかこないけど 押し始めは両方来るだろ? そもそも GetKeyState って、WM_KEYDOWN 見てフラグたててなかったっけ
581 :
579 :2006/10/24(火) 23:33:21
>押し始めは両方来るだろ? これはくる。GetKeyStateの内部仕様なんて知らないw 576がまずありえないキーボードの心配をして書いたのか 普通にあることなのかが知りたかっただけ。
キー2つ同時押しが出来ないキーボードはなかったと思うが、保証はされてないのかな
キーボードの構造考えれば同時押しが保証されない事がすぐわかるだろ
584 :
579 :2006/10/25(水) 00:04:51
>>581-582 わからない。その根拠は?
同時押しが保障されないならGetKeyState()の動作も保障されないことになってしまう。
保障されていると言い張ってる訳じゃないからね。
585 :
579 :2006/10/25(水) 00:09:44
582-583の間違い
動作が保障されない、の意味がよくわからん。 ハードが同時押しに対応していない結果、 片方しか押されていない状態と言い張るのだから、 当然GetKeyStateもそれに応じた動作をするだけじゃないの?
587 :
579 :2006/10/25(水) 00:41:19
>ハードが同時押しに対応していない結果、 >片方しか押されていない状態と言い張るのだから 今の所、こう言い張ってる人はいませんよ。 576にしても可能性の話してるだけだし。 保障されてないと言い切ってるのは583だけ。
588 :
586 :2006/10/25(水) 01:03:45
ああ、すまん 言い張るのだから->伝えてくるのだから と読み替えてくれ。
フラグでも立てればいいやん
591 :
579 :2006/10/25(水) 01:44:44
>>588 了解。
>>589 そりゃ秋葉原でキーボード買っても、マニュアルに同時押しを保障しますという記述はないだろうね。
自分的には583の根拠が知りたい。PC/ATの仕様にキーボードの記述があるんだろうか。
今日はもう寝るね。
592 :
デフォルトの名無しさん :2006/10/25(水) 01:54:25
同時押し不可のキーボードがあったら「ゲームが動かないキーボード」として有名になってるはずだ。 昔、富士通のFMシリーズはそんなだったけど。
X1も駄目だったらしい。 離された事が認識できなかったFMシリーズよりはまだマシか。
595 :
567 :2006/10/25(水) 05:43:20
オレの神聖なレス番をくだらない質問につかってんじゃねーよボケ
Nキーロールオーバーかな、PCJrがそれで失敗してるね。 今はいちいち歌ってないかも。
スキャン構造の都合上、UP/DOWNイベントが同時に流せずに多少の時差が出るってことだろな
実用上同時に見えるから問題無し。
>>593 のように(UP)イベントが消えることがないしね。
# A↓ B↓ ---- B↑ で A押されてるのを忘れるんだけっけか < FMシリーズ
X68Kで同時押し認識の改善で ダイオードを入れる改造サービスとかあったな。 FMも77AVからちゃんと認識できるようになったんだっけ?
同時押しだけならMSXが妙に性能良かったな。 PC/ATの場合はキーボードのスキャンコードが8バイトを 超えると駄目になる機種とかあった気がする。
MSXのキーボードは珍しくパラレル接続だから
昔、BM98で、左シフト、Z、X、Cの同時押しが効かなかったのを思い出した。
そのキーボードでは最後に押したキーが認識されなかった。
ちなみに、別のキーボードだと大丈夫だった。
>>591 詳しいことは忘れたが、最近のキーボードは、配線減らすために、同時押し
に制限が出てたと思う。
数万円とかのキーボードは違うかもしれん。
普通に使えば、どんなに速くタイピングしても、1、Q、A、Zのうち2つが同時に押される
ことはないよね、みたいな感じ。
東プレのRealForceを使っている俺様には関係のない話だ。
604 :
579 :2006/10/25(水) 18:01:31
色々情報ありがd。
Nキーロールオーバーという言葉はしらなかった。
Ctrl + Alt + 何か
というのは時々使うから最低3キーぐらいの同時押しは
認識するのが当然だと思ってたけどCtrl,Alt,Shiftは別腹
みたいね。お騒がせしました。
ハード板にロールオーバーの実験をしてるスレがあって
いろんな環境から実に2chらしい言葉を書き込みしてあったけど
高級Keyboardを除けば2キー以下のが結構あるみたい。
http://pc8.2ch.net/test/read.cgi/hard/1089362616/l50
605 :
sage :2006/10/25(水) 18:16:58
なんか→押しっぱなしのままスペース押すと→が押されてるっていうのが認識されなくなる 自分のキーボじゃ2つのキー入力が認識されてないってことなのかな?
うちのもそんな感じ。
>>597 のことをやると後半AのWM_KEYDOWNが来ないけど
最後のWM_KEYUPはくる。GetKeyState()で見ると両方押されてることに
なってるから認識はされてるとおもった。
それは話が違うかと。
中身は違うけど実験パターンだけ分かりやすいのでぱくった
A↓ WM_KEYDOWN (A) (キーリピート期間) WM_KEYDOWN (A) B↓ WM_KEYDOWN (B) (キーリピート期間) WM_KEYDOWN (B のみ) B↑ WM_KEYUP (B) (キーリピート期間) *WM_KEYxxx は来ない A↑ WM_KEYUP (A) * となるのは Windows の仕様っぽいぞ。 KeyState は立上がり/立下りの変化点で更新しているから狂わないけどね。
もいっちょ 1キーロールオーバーだと A↓ down A B↓ up A, dwon B B↑ up B A↑ (nop)
1キーって実在するのか..... dwonBのまえにupAが来るのは面白いね。
>>611 昔の電卓がそうだった。 器用な使いまわしかたしてたな。
(最もそいつは B↓ で up A が出ない回路構成)
あ
>>610 は間違ってる。
A↓ down A
B↓ (nop)
B↑ (nop)
A↑ up A
だわ。 ワイワードOR で微妙に優先順位が付いてる
昇竜拳は?
WM_KEYUPってキーを離したときだけ来ると思ってたけど 押してない時は常にきてる?
>>616 意味わかんないとこでkeybd_event入れてたのが原因だった
押してないとき来てたら大変なことになるわな スマソ
618 :
デフォルトの名無しさん :2006/10/25(水) 20:20:42
サーバへの送信データを RFC1867 の形式に 自動的に変換してくれる API ってありませんか? つまり、Content-Type などのヘッダを生成して その後にデータを付けるような形式にです
自作アプリにIEの表示部分を埋め込むにはどうすればいいのん?
622 :
デフォルトの名無しさん :2006/10/25(水) 22:10:18
は?
ひ?
624 :
デフォルトの名無しさん :2006/10/25(水) 22:11:46
ふ?
流れを断ち切る!
626 :
再掲 :2006/10/25(水) 22:15:56
サーバへの送信データを RFC1867 の形式に 自動的に変換してくれる API ってありませんか? つまり、Content-Type などのヘッダを生成して その後にデータを付けるような形式にです
>>626 HttpSendRequestとかそのへん。
628 :
デフォルトの名無しさん :2006/10/25(水) 22:24:38
>>627 あれって自動的には変換してくれなかったような・・・
629 :
再掲 :2006/10/25(水) 22:34:37
サーバへの送信データを RFC1867 の形式に 自動的に変換してくれる API ってありませんか? つまり、Content-Type などのヘッダを生成して その後にデータを付けるような形式にです
サーバへの送信データを RFC1867 の形式に 自動的に変換してくれる API ってありませんか? つまり、Content-Type などのヘッダを生成して その後にデータを付けるような形式にです
ID無いとこういうのは減らんよな
>629 それくらい自前でやれ。
633 :
626 :2006/10/25(水) 22:44:08
>>627 レスありがとうございます
その辺をよく調べてみます
なお、
>>629-630 は自分ではありません
どっかの池沼奴による行為です
気にしないでください
どっちが池沼とかどうでもいいが どっちもうざいのは変わりないな
636 :
567 :2006/10/26(木) 05:14:44
/i /{/'⌒'} }}Y/ / ,r-、ヽ, /
ノ、|、ヾ_,,ノ ノ ノ{ ヾ {^')) }フ/ / _/
\ヽ、 彡'`、、 'ー' ノ //",,゙ """ / ヽ
ヽ-、ミ‐-、、 、,r=‐'¬ー=、、,-‐'_ ヽ、 /ノ / 『味』 ウ・ こ
ミ/ ~
>>633  ̄ノ /\ /彡 "" |/ だ ソ・ の
/ ,' u ∪ ! ヽ | i、゙ー''"彡 /| ぜ を・ 味
、、∪ / ノ / _,,,...-‐‐ニ=,ノ,,/ ヽ、,,_ \ ,イ / | : つ・ は
ニ、=!, l_. レr=-ニ二、,,,.-'" ー、==-ヽ'"/ / ヽ : い・
、(・,)>ノ⌒ ∠,(・,)_く ゙` ヽ゚ノ`ー=、_ /// ∠ : て・
 ̄/""゙ ヽ ̄ ̄ \ヽ  ̄ ̄ // ノ る・
u 〈 、 u (ヽ //  ̄ノ
ヽ -' lj >、 // /  ̄ヽ、
/ヽー‐ 、 /'"´ 'i // / ∨ヽ/
^゙"⌒ヾ、 ,i| ,"__} // / /
ー- - ヽ_人`'′ // / /
/ i'゙' /-─‐‐''/_/_
、 _/-‐ヽ、___,,,, -‐‐  ̄
ー-、、,,__,-‐'//ノゝノ ノ ヽ\
キーを押してから、有効ディレイタイムをソフト内部で持ち、 その有効期間内で同時押しを判定しちゃダメかな?
638 :
デフォルトの名無しさん :2006/10/27(金) 15:36:22
"c:\foo.txt", "c:\bar\baz.txt" 等の複数のファイルのパスをExplorerで切り取った状態にするにはどうすればいいでしょうか?
DoDragDropあたりじゃね
文字列分解をしたいのかファイル移動をしたいのか 質問の趣旨がよくわからん
642 :
638 :2006/10/27(金) 18:44:36
文字列処理ではなくExplorerでそのファイルを選択して右クリックして切り取りを実行した状態を Explorerを立ち上げることなく自前のプログラムでやりたいということです。
Explorerで右クリックして切り取りは特に何の意味もないよ
Explorer以外へ貼り付けできないっぽいから 内部的に状態覚えてるだけだろ
>>645 エクスプローラじゃなくても普通にコピーできたが?
切り取りすればコピーした後ちゃんと元のファイルも消える
>>645 クリップボードに CF_HDROP で入ってる。
あ、クリップボード見ても切り取りの動作は再現できないか。
Preferred DropEffect見て貼り付ける側で処理するわけか。 OLED&Dみたく貼り付けるタイミングをクリップボードのオーナーが知る事は出来ないのか。
CFSTR_PREFERREDDROPEFFECTを読むのに3秒位かかった
CCDDEEEEEFFFFOPPRRRRRSTT_ [゚д゚]
CreateDesktop 以外で同じような機能を実現できる方法ってないでしょうか? というのも全画面ではなくウィンドウで作りたいのです。 (あれって全画面だけですよね?) 参考になるサイトなどあったら教えてください。
ねーねー、 特定のアプリケーションの (たとえばタブブラウザのタブでのマウスイベント) を フックしたり置き換えたりするにはどうすればいいのん?
特定のアプリケーションの (たとえばタブブラウザのタブでのマウスイベント) を フックしたり置き換えたりすればいいとおもうよ
>>655 だからー
どーやってそれをするのん?
いけずしないでで教えてちょ
というかフックのやり方が知りたいのとちがうねん それはわかるのだけどそれするとグローバルになっちゃうじゃない? 特定のアプリだけでする方法がしりたいねん
:::::::::::/ ヽ::::::::::::
:::::::::::| ば じ き i::::::::::::
:::::::::::.ゝ か つ み ノ:::::::::::
:::::::::::/ だ に は イ:::::::::::::
::::: | な。 ゙i ::::::
\_ ,,-'
――--、..,ヽ__ _,,-''
>>659 :::::::,-‐、,‐、ヽ. )ノ _,,...-
:::::_|/ 。|。ヽ|-i、 ∠_:::::::::
/. ` ' ● ' ニ 、 ,-、ヽ|:::::::::
ニ __l___ノ |・ | |, -、::
/ ̄ _ | i ゚r ー' 6 |::
|( ̄`' )/ / ,.. i '-
`ー---―' / '(__ ) ヽ 、
====( i)==::::/ ,/ニニニ
>>660 知ってるもん
だから教えてほしいんだもん
マジレスすると、そんな便利なAPIは無い。 ので、フックなりBHOなりリモートスレッドなりで普通に地道に処理するしかない。 クリック時に判定するとか、ウィンドウ作成時に判定してサブクラスするとか。
663 :
567 :2006/10/30(月) 17:10:15
また変なのが沸いてるな
3日近い沈黙を破ったかと思ったらこれか
フック時にスレッド指定できるのに
666 :
デフォルトの名無しさん :2006/10/30(月) 17:39:58
ビットマップ画像を読み込んでその画像のビット情報を配列に格納したい、 がやり方がわからない。GetDIBitsを使うのか?
自分で読み込んだんなら自分で中身わかるだろ。 自分で読み込めないなら、GDI+ で読み込んで LockBits で中身を覗くのが簡単。
>>666 Windowsビットマップファイルの構造調べればすぐわかるだろう‥‥
常識的に考えて‥‥
DialogBoxでメインウィンドウを作成した場合 多重起動の防止はどのようにしたらよいのでしょうか。 教えてエロい人><
普通に
普通が分かりません><
DialogBoxと多重起動は関係ないだろ
メインウィンドウのタイトルとかクラス名で既起動のインスタンスを探しているんじゃ。
ウィンドウクラスを登録してCreateWindowでウィンドウを作成していた時は
FindWindowで多重起動を防止していたのですが、DialogBoxで作成した場合の
多重起動防止方法が分かりません>< yes
>>674
ふつーmutex
HICON型に読み込んだアイコンを HBITMAP型のビットマップに変換したいのですが。 アイコンを一旦ファイルに保存して、ビットマップとして読み込む方法以外に何かないでしょうか
>>679 ありがとうございます。
早速調べてみます。
質問です。 とある文字列の配列を、OSのファイル名ソート順にしたがってソートしたいと思っています。 とりあえず単純にstrcmpで比較して行ないました。 ですが私のPCの名前順とは若干違うようでした。 (どうやら調べたところ、Windows98までは単純な文字コード順だったようです) 私のOSはWindows2000 SP4です。 どうやら、文字コード的には '_' > '0' なのに、OSでは_の方を先に表示してしまうようです。 他にも、全角アンダーバー _ は当然0x80以上なので後ろにくるはずなのに、ほぼ先頭に来ます。 「概ね文字コード順」なのですが色々記号まわりで例外があるようです。 この順番比較を行なってくれるWin32APIはありますでしょうか? 知っていらっしゃる方、ご教授よろしくお願いいたします。 余談ですが、XPだとまたファイルソート順が2kと違うそうです…。
ご教授よろしくお願いいたしますもいいけど、 まずはCompareStringを試してみてから質問する程度の誠意は見せようよ。
IShellFolder::CompareIDsじゃないか?
>>682 質問の意図が読めませんが、一応「2kはユニコードだから、もしかしてユニコード順か?」
と思いチェックしました。
でも、半角文字ってユニコードにしてもコードかわってないんですよね。
相変わらず文字コード順とはいえない、独特な並び方に見えます<Windows2k
せめて法則性がきっちりわかれば、自分で比較関数書いてしまうのですが…
>>683-684 失礼しました。
CompareString というものの存在自体に、気づけませんでした。
検索してみたところ、それらしい説明を発見しました。
試してみたいと思います。ありがとうございます。
>>683 CompareStringを探している人間に、CompareStringを試してから質問しろって返事はおかしいだろw
>>685 質問の意図が読めませんが、ってお前頭だいじょうぶか?
おめーが質問してんだろーが。
これは恥ずかしいツッコミだ
小学生から国語をやり直した方がいいな、これは。
国語の履修漏れです。
>>686 CompareStringちょっと試してみたが、違うんじゃない?
例えば a1 a100 a2 の3つのファイル名があった場合、
Win2K以降のエクスプローラの表示順は a1 a2 a100
連続した数字を1つの塊として比較するような振る舞い。
CompareStringで a2 と a100 だけ比較してみたけど
a2 > a100 と返してくる。駄目じゃん。
名前順にソートするとそうなるもんなマジで使えない
右揃えにして比較とか
文字列長で比較後辞書順?なのか?
するってぇとCompareIDsの方か?
698 :
693 :2006/10/31(火) 22:00:25
a1 a100 a2xxxxxx の場合でも a1 a2xxxxxx a100 と数字の順になるよ。 試すのに1分もかからないんだから、試してから書き込もうよ。
試す試さないというかこの資料をM$が用意してないとすると糞だと思う
Windows Explorer のフォルダ内での整列の順序の話なら、 ShellNamespace がこの辺りをハンドルしてるわけだから、 CompareIDs() が正解なんじゃないかと思うが・・・ CMD.EXE の dir /ON が何をどうしているかは知らぬが。
文字コードだと abc・・・ABC・・・、エクスプローラは [Aa][Bb][Cc]・・・だから、 俺は全部アルファベット小文字に変換してから辞書順ソートしてる 大文字にすると、アンダーバーが下にきちゃうのでアウト
間違えた、全部小文字にしてからコード順
lstrcmp
704 :
デフォルトの名無しさん :2006/10/31(火) 22:40:23
strstr
stricmp
>>693 >>698 いや、Windows2kだが、
a1 a100 a2 の順になった。
数字を優先してソートするのは、XPからの仕様のようだ(ぐぐった)
XPでも、レジストリいじると2kスタイルにできるそうだ
IShellFolderの実体の実装依存なのでフォルダごとに違うルールでソートされる可能性すらある しかしCompareIDsだとShellオブジェクトとして存在しない文字列のソートができない点が問題
考えてみれば、IShellFolder使っちゃうと、XPと2Kと98で動作が違うアプリケーションになっちまうな。 もちろんエクスプローラー作っているのならいいが 「2kスタイルでソートしたい」 というアプリケーションの場合、IShellFolder依存ではまずい
XPスタイルのソートはshlwapi.dllのStrCmpLogicalWで実現できそうだ このAPI自体がXP以降だな
711 :
デフォルトの名無しさん :2006/11/01(水) 13:10:57
>>669 だからそれをどうやって調べんの?って聞いてるじゃん。
ペーストするごとにスタックから一行ずつ別のデータを貼り付けたいんですが クリップボードの内容をペーストしたことを検出することは可能ですか?
>>711 BMPファイルとして保存する方法を調べれば、やり方わかるはず。
win32::OLEとsamieで IEを操作しようと思うのですが、 アドレスとソースの取得はどのようにやればいいのでしょうか?
>>716 caclsを読めばわかるが楽な方法はない
質問です。 今効果音の再生にPlaySoundを使っているのですが PlaySoundだと2つ以上の音声を同時に流せないので困っています なにを使うと良いでしょうか?
googleを使って調べるといいよ
マルチスレッドでやればぁ
721 :
715 :2006/11/01(水) 20:44:00
>>717 さん、ありがとうございます。
頑張ってコーディングしてみます
>>719-
>>720 ありがとうございます
試してみます
マルチスレッドでやってみたのですが やはり先に流してたほうを中断されてしまいます googleで調べてみるとMCIでの再生が出てきたのですが PlaySoundより細かい処理ができる様ですが2つ同時再生ができるのでしょうか?
やってみろよ。 試行錯誤しないと成長できんぞ。
マルチスレッド違い
midiはPlaySoundじゃ再生できないんじゃないかな?かな?
>>724 MCI、playSoundともに同時再生は環境依存(Win95+ISAバスサウンドカードなんかは無理)
DirectSound使え。
730 :
567 :2006/11/02(木) 02:53:11
そっちのマルチスレッドかよwwwwwwwwwwwwwww
確実にローカルファイルにしかアクセスしないようにするため 一時的にブラウザがネットにアクセスしないようにすることってできますか?
734 :
731 :2006/11/02(木) 15:36:12
手動でやるしかないということですね。 ありがとうございました。
>>731 接続する前にレジストリ弄ればオフラインモードになるよ
教えてください。 CreateProcessを使って特定のプロセスに引数付で起動させたいんですが エラーが出てしまいFormatMessageで調べたところ。 「メモリロケーションへのアクセスが無効です。」 というメッセージが生成されてしまいます。 以下ソース /* ExePathは"hoge.exe Arg" */ if(!CreateProcess(NULL, &ExePath[0], NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startInfo, &procInfo)) { ErrorLine = __LINE__; goto FUNC_END; } InternetCloseHandle(hInternet); InternetCloseHandle(hHttpSession); InternetCloseHandle(hHttpRequest); SendMessage(hWnd, WM_CLOSE, 0, 0); 以上。 CreateProcessの後にSendMessageでプロセスを即座に終了させてるからいけないんでしょうかね。 とりあえず自分はもうお手上げ状態なんでレスさせてもらいました。
>というメッセージが生成されてしまいます。 どっちのプロセスで出てるの?
startInfo, procInfo の中身が変ってのがありがちじゃあるまいか
STARTUPINFO の cb にサイズを入れてないんじゃない?
すんません自分で解決して書き込もうと思ったら既に・・・・・。
STARTUPINFO startInfo;
PROCESS_INFORMATION procInfo;
上記の二つの構造体をmemsetで0x00初期化したらなおりました。
正直あs;dgljwくぁ;えlkjf;あうぇです。
二つの構造体の中身をよく理解しときます。
>>738-740 ありがとうございました。
>>741 PROCESS_INFORMATIONは初期化しなくても平気。
STARTUPINFOはFlagsさえきちんとしておけば平気。
確かこうだったと思う。
どちらにしろ構造体は最初memsetしといたほうがいい
二次元配列の初期化の仕方がわからないんだけぢ char sz[128][258] = {0}; これでいいの?
int[2][2] = { {11, 12}, {21, 22} } ;
スレタイを鑑みれば、 ZeroMemory( sz, sizeof sz );
UDFリーダーを作ろうとしているのですが、ECMAもOSTAも構造体の形式的な定義が わかりにくい感じでズラーっと書いてあって実際にどう使うのかが殆ど書いてありません。 家庭用DVDレコーダーで記録済みのDVD-RWとつきあわせて そのDVDの場合についてはわかってきましたが色々謎の部分が多いです。 ボリュームディスクリプタシーケンスが なんで複数のプライマリボリュームディスクリプタを持つのか、とか・・・ いいソースコードないでしょうか・・・
それはAPIの質問なのか?
分からないなら黙ってて
スレ違いなことも分からないなら黙っててほしいね確かに
ワイルドカードで文字列がマッチするかどうかを調べるAPIは無いですか。
ないんじゃない。たぶん。 仮にあったとしても、エクスポートすらされていないじゃないかな。 確実に必要だとは思うけど。
無いのか… 正規表現でなんとかするか。
PathMatchSpec
マルチディスプレイ環境で、プライマリディスプレイの切り替えをAPIで実行したいです。 ChangeDisplaySettingsExのdwflagsにCDS_SET_PRIMARYをつけて、 セカンダリに対して呼び出しましたが、セカンダリが非接続になるだけでした。 プライマリの切り替えをするにはどうすれば良いでしょうか。 OSはWinXP SP2で、ビデオチップはMobile Intel 945GMです。 よろしくお願いします。
インテルに聞け
メモリデバイスコンテキストは、別途作成したビットマップを選択して使うのが 普通だと思いますが、メモリデバイスコンテキストが最初に所有している ビットマップ(1×1、モノクロ)をわざわざ削除しているソースを見たことがないんですが、 削除しないままで、リソースリークが発生したりすることはないんでしょうか?
最初から持ってるビットマップは削除したらだめ メモリデバイスコンテキストを削除する前に選択しなおす
¥0はずせよ馬鹿
763 :
760 :2006/11/03(金) 19:57:22
>>761 そうなんですか…どうもありがとうございました。
記憶があいまいなので便乗。 最初から持っているビットマップはストックオブジェクトじゃなかったっけ。 9xとNTで違うのかなぁ。詳しい人よろしく。
システムメニューの「閉じる」や「移動」などの文字列を 各国語版Windowsに左右されずに取得したいと思っています。 コンソールアプリなのでウィンドウを生成して GetSystemMenu ではなく リソースから取得したく思ってます。 WinNT系では、LoadLibrary("USER32.DLL") と LoadMenu で取得できましたが、 Win9x系では USER32.DLL にメニューリソースが存在せず、 USER.EXE にそれっぽいリソースがありましたが、LoadLibrary の段階で ERROR_BAD_UNIT で失敗してしまいました。 Win9x系でのシステムメニューリソースの取得方法のアドバイスお願いします。
隠しAPIとしてLoadLibrary16というものがあるが、リソース読めるかどうかは知らん。 ほかのやり方がありそう。
内部でWaitCommEventやGetOverlappedResultなどを呼んで 待っている状態のスレッドを、外部から停止する方法を探しています。 いつも使っているループフラグのON/OFFではさすがにマズイと思いまして… 上記関数をキャンセル出来れば一番なんですが、 何か対策があれば教えていただけると幸せです。
wsprintfでintの時などは%dを使えば変数が正しく表示されるのですが floatやdoubleの%fを使っても f としか表示されません。 TextOutで描画しています。 どうすれば小数を表示できるのでしょうか?
>>768 sprintfを使えない理由でもあんの?
>>769 レアケースだけど、
標準のCRTをリンクさせずに、自前でエントリポイント用意してると、ことごとく使えなくなるね。
>>767 直接その関数で待機せずにWaitForMultipleObjectsを使って、
それに停止用イベントを含ませる。
>>769-771 有難うございます
sprintfの存在を知らなくて・・・
解決できました
wsprintf知っててsprintfしらないやついんの?
775 :
764 :2006/11/04(土) 13:25:12
出典はVS2003付属のmsdn/technical articles/GDI Objects 例のビットマップはstockobjectと同様にconstant object、殺そうとしても死なない。 XPで確かめた結果、hBitmapのstock object marker(0x80000)はONだった。
たしかMSDNの記述で、SelectObjectで元に戻すのは、shouldになっていたはず。 実際、戻してないコードが多すぎだろうから、MSも変えるに変えられないんだろう。
>>772 なるほど!
どうもありがとうございます。
質問です、DLL/EXEで呼ばれるnew/deleteを一致させたくて以下の様な関数を作りました↓ //new void* operator new[](size_t size){ return(HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, size)); } //delete void operator delete[](void* ptr){ HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, ptr); } 一応、これで動作はしているのですが何か問題が無いか心配です。 特に、[]が付いているのに何もしてないのでメモリリークあたりが起きてそうなのですが…。
そんなことするくらいなら、COMみたいに自殺してもらえば良いのに。
780 :
778 :2006/11/04(土) 17:40:52
>779 それが可能な局面ならそうやって実装するのですが、たとえばSTLのstringの様に内部でnew/deleteを用いるクラスを DLL/EXE間で受け渡しする場合には自殺関数を用意しても無意味なので…これ以外の実装法を思いつきませんでしたorz
ウィンドウのサブクラス化で、使い終わったときに元のWNDPROCを戻す必要はあるものでしょうか?
>>778 CランタイムにMSVCRT使えばいいだけでは?
イヤです
784 :
778 :2006/11/04(土) 19:04:20
一応、デストラクタは配列分だけ呼ばれているので削除されているとは思われます(自己解決) >782 プラグインの作成についてちょこちょことやっているので、相手にそうやってもらうのを期待できない感じです(汗
>>780 内部のというものも、外部と同じくnewとdeleteの呼び出されるところが同じなら問題ないはず。
もっとも、std::string自体は、newとdeleteのようにいくつもの実装があり、しかもABI非互換だから、
モジュールを跨いで受け渡すのには向いていないと思う。
std::stringは、例として挙げただけならいいんだけど。
スレ違いだけどboost:shared_prtはその辺をなんとかしてくれる deleterを使って
ここまで new/delete 使わずに HeapAlloc/HeapFree 直呼べば、いいじゃんというレスが無いのが謎
new/delete 使わずに HeapAlloc/HeapFree 直呼べば、いいじゃん
>>781 > 使い終わったとき
「ウィンドウを破棄するとき」って意味なら、戻さなくて大丈夫。
790 :
778 :2006/11/04(土) 19:59:56
>785 std::stringは仰られる通りただの例です。 実際は、std::stringがDLL/EXE間の受け渡しには使えないので、 class mystr{ public: mystr();//コンストラクタ mystr(const char* Src);//コピーコンストラクタ(1) mystr(const mystr& Src);//コピーコンストラクタ(2) ~mystr();//デストラクタ void assign(const char* Src);//割り当て(1) void assign(const mystr& Src);//割り当て(2) const char* c_str() const;//アクセス unsigned int size() const;//サイズの取得 mystr& operator =(const char* RHS);//代入演算子(1) mystr& operator =(const mystr& RHS);//代入演算子(2) bool operator ==(const char* RHS) const;//比較演算子(1) bool operator ==(const mystr& RHS) const;//比較演算子(2) bool operator !=(const char* RHS) const;//比較演算子(3) bool operator !=(const mystr& RHS) const;//比較演算子(4) protected: char* m_Data;//文字列へのポインタ unsigned int m_Capacity;//文字列のキャパシティ }; の様なクラスの受け渡しを考えています。
791 :
778 :2006/11/04(土) 20:00:27
>787-788 その考えはありませんでした(´Д`)
792 :
778 :2006/11/04(土) 20:35:51
787-788で指摘されましたので、大幅な修正を行ってみました。 class TestC;というコンストラクタの呼び出しは必要でデストラクタの呼び出しが不要なクラスの場合、 TP = new(reinterpret_cast<TestC*>(HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, sizeof(TestC)))) TestC; と HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, TP); で良いのでしょうか? ( 単純なPOD型なら、 TP = reinterpret_cast<TestC*>(HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, sizeof(TestC))); と HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, TP); で良いのでしょうか? )
どうでもいいけどスレ汚すなよ
794 :
765 :2006/11/04(土) 21:49:21
>>766 隠しAPIのLoadLibrary16で無事いけました。
LoadLibrary16("USER.EXE")
LoadMenu(〜)
FreeLibrary16(〜)
もっといい方法があってもよさそうなのですが、当初の目的が達成できましたので
こちらの方法でいきたいと思います。ありがとうございました。
WindowsのEDITコントロールを使ってみると、IMEも問題なく使えるようです。 ところが、海外のプログラムなどで、 たしかにEDITコントロールを使っているにもかかわらず、 IMEを有効にして入力しようとすると、 変換中の文字列が、変な場所に表示されたりするものがあります。 なぜこんなことが起こるのでしょうか? 自分が書いたプログラムでは、起こらないので、気になります。 なにかIMEの動作を妨げるようなコードを書いてしまうことがあるのでしょうか?
文字化けでは無く変な場所?
何かの拍子にインプレイスじゃなく画面左上に出たりすることあるね
798 :
デフォルトの名無しさん :2006/11/05(日) 02:47:56
http://msdn.microsoft.com/workshop/browser/mshtml/reference/ifaces/document2/write.asp このサンプルでは、要素としてBSTRを持つSAFEARRAYに対して、
要素のBSTRをSysFreeString()した後、配列全体をSafeArrayDestroy()しています。
しかし、SafeArrayDestroy()の説明には、
> Safe arrays of variant will have VariantClear called on each member
> and safe arrays of BSTR will have SysFreeString called on each element.
とあり、BSTRを二重にSysFreeString()してしまうのではないかと思うのですが、
この解釈は間違いでしょうか?
今、類似のプログラムを作ったところSafeArrayDestroy()で落ちていて...
memsetとZeroMemoryってZeroMemoryのほうは結局内部でmemset呼び出してるんだけど 実行の早さ的にはどっちのほうがいいのかねー
関数呼び出しのコスト分memsetの方がいいんじゃね?
もし本当にmemsetを呼び出してるだけなら どんな糞なコンパイラでもZeroMemoryは memsetにインライン化されて早さ的には同じ 移植性を考えるとmemsetを使用した方が良いな
WS_OVERLAPPEDWINDOWがstyle指定されているWindowAとWindowBがあります。 ダイアログみたいに常にWindowBをWindowAの上に表示させたいです。 方法ありましたら教えてください。
CreateDialog
CreateWindowEx() の弟9引数でWindowAを指定してWindowBを作成
ありがとうございます。 WindowBのCreateWindowExの第9引数にWindowAを指定して、 WindowBがWM_KILLFOCUSを受け取ったら SetWindowPos(WindowB, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); を実行するようにしたところ、常に前面に表示されるようになりました。 あとはダイアログみたいに、 背面のウィンドウへの操作を完全に無効にできればOKです。 現時点では移動などの操作ができてしまいます。 よろしくお願いします。
EnableWindow(WindowA, FALSE); でWindowAを無効にしたところ、目的の動作をするようになりました。 ありがとうございました。 無理矢理な感じは否めませんので、 もしもっと素直な方法をご存じな方いらっしゃいましたら お願いします。
ダイアログの複数のボタンがあり、特定のボタンにフォーカスがあるときだけ カーソルキーでのフォーカス移動を無視させたいのです。 このようなときにはどうすればいいのでしょうか。
少しは自分で調べろ
>>806 つーかモーダルダイアログじゃだめなのか
>>808 自分でやり方書いてるんだから、書いている通りやったらいいんじゃね?
初心者はフックに思い至らない
ウィンドウズはメモリ管理にガーベジコレクション使っているの?
Advanced Windows 嫁 仮想メモリ→物理メモリへのマップを含めて、最終的には page 単位で管理されている。 ガベージコレクションは、メモリ管理APIを呼び出す側で実装ってところだな。
>>799 ZeroMemoryってmemsetのマクロだよ
winbase.h→winnt.h
ZeroMemoryはRtlZeroMemoryのマクロ。 んでRtlZeroMemoryはmemsetのマクロかもしれないし、 kernel32のRtlZeroMemoryかもしれない。
kernel32じゃなくてntdll
kernel32にもあるけど…
少なくともうちのWinXPのkernel32.dllからはエクスポートされてない。 dependency walkerで確認
本質的な問題ではないな
Rtl系がkernelにあるなんて初耳だw
kernel32のエクスポートテーブルに載ってるけど、実体はntdllっすね。スマソ
いやこっちこそスマソ 確かにntdllへforwardしてるだけだが > エクスポートされてない ってのは明らかに嘘だった。 RtlFillMemory RtlMoveMemory RtlUnwind RtlZeroMemory の4つがあった
結局RtlZeroMemoryとmemsetどっちがいいんだよ
RtlZeroMemoryは(ユーザーモードアプリには)非公開ってことになってるんだから たとえ実体はRtlZeroMemoryへの#defineにすぎなくてもZeroMemoryにしときなさい。
なんでわざわざAPIで用意されてるんだろ。 memsetでええやん。 構造体の初期化は HOGE hoge = {0}; が楽だな。
俺も疑問 全くの初心者には可読性もZeroMemoryの方が可読性が良い とかそんな理由しか思いつかない
memsetはinline展開されるよ
CやC++の標準ライブラリを一切使わずに組むために、最低限の物は APIでも用意してあるんでしょ。 エントリポイントから自分で書くときはCRTの初期化がされないから なるべくAPIだけで済ませたいし、そもそもアセンブラだけで書く人とかは CRTも利用できないし。
質問です。 大きなファイルの一部を読み込むためにSetFilePointerを使用していますが、 実行に時間がかかり、ReadFileで読み飛ばしているのとあまり変わらないようです。 他に高速にファイルポインタを指定する方法はないでしょうか? 目的 ・zipファイルの梱包ファイル名を列挙する ・超巨大なBMPファイル等の一部を表示する 現在使用している手法 ・CreateFile("ファイル名", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ・SetFilePointer(ファイルハンドル, 相対アドレス, NULL, FILE_CURRENT); 比較対象 ・Lhaz等のアーカイバは一瞬に近い速度でファイル名を列挙している ・動画再生ソフトのシークタイムはもっと早い よろしくお願いします。
本当にSetFilePointerの実行に時間がかかってるにか?
>>830 SetFilePointerがReadFileと変わらないってことはないけどねー。何か
変なことしてるんじゃない?
FileMappingとか使えば速くなるかもね。
・アーカイバは(おおよそ)データ先頭にアーカイブしたファイル一覧のテーブルを置いて高速化している ・動画のシークは部分的にオンメモリでやってるんじゃない? (結果的には FileMapping してるのかもしれんが)
局所的なデータを読むのにSetFilePointer&ReadFileを繰り返して「遅 い」とか言っているんだと想像。 たとえば、SetFilePointer→ReadFileで20バイト読み→SetFilePointer で12バイト後ろに→ReadFileで20バイト読み→SetFilePinterで12バイ ト後ろに…、とか。
>>830 FILE_FLAG_RANDOM_ACCESSとか指定してファイル開くのはどうだろ?
836 :
デフォルトの名無しさん :2006/11/06(月) 14:54:15
あー、それだな
バカかおまいら。834でFAだろこんなの。
838 :
830 :2006/11/06(月) 14:56:34
多くのレスありがとうございます。 問題点を整理するため、次のようなテストコードを試してみました。 #include <windows.h> int main( int argc , char *argv[]) { HANDLE hfile; DWORD buf, size, sized; int n; if(argc != 2)return 0; hfile = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL); if(hfile == INVALID_HANDLE_VALUE)return 0; size = GetFileSize(hfile, NULL); for(n=0; n<300; n++) { SetFilePointer(hfile, (size-4)*n/100, NULL, FILE_BEGIN); ReadFile(hfile, &buf, 4, &sized, NULL); } CloseHandle(hfile); return 0; }
>>834 おっしゃるとおりです。
1回のSetFilePointerで時間がかかっているわけではないようです。申し訳ありませんでした。
zip形式のファイル構造を調べなおしてみましたが、データとファイル名のセット以外に
ファイルの末尾にファイル名の一覧を記述しておく領域が加えてあることが多いようです。
アーカイバはその領域を一括して読んでいるんだと思います。
お手数をおかけしました。
840 :
デフォルトの名無しさん :2006/11/06(月) 18:08:04
クリックしたらSendMessage使ってWM_PAINTメッセージを送る、 みたいな感じにしたいのにうまくいかないのはなぜ? SendMessage(hwnd, WM_PAINT, wParam, lParam); ・ウィンドウ起動時ではWM_PAINTのところはうまくいってる。 ・他のメッセージはちゃんと送れる。(SendMessage(hwnd, WM_DESTROY, wParam, lParam);とか)
InvalidateRectするっきゃナイト
WM_PAINT 内部で呼んでる BeginPaint() で 再描画に必要な領域を切り出したうえで hDC をくりだす。 単に WM_PAINT を Send しただけでは、 過去に描画済みで再描画の必要がないと判断し、 hDC を NULL にしてしまう。 InvalidateRect() で描画済み領域を忘れるようにすれば桶 最も WM_PAINT の先頭・末尾で BeginPaint()/EndPaint() だけやっといて、 描画コード内の hDC は別のを(GetDC とかね)使っているなら WM_PAINT を Send しただけでも 再描画するかもしんない
843 :
デフォルトの名無しさん :2006/11/06(月) 19:28:00
わかりやすい説明ありがとう。InvalidateRectを使ってみた。 でもできない… 画像ファイルを読み込みウィンドウに表示↓ ボタンを押すと画像に特定の処理をする↓ その画像をファイルとして上書き保存↓(ここまで成功したのは確認済み) InvalidateRect()↓ 俺の予想ではここからWM_PAINTが自動的に発生し、上書きされた画像を 表示してくれるはずなんだけどできない。 一応InvalidateRect()のあとにSendMessageも入れといたけどできない。 オラに力をわけてくれ
>>843 そこで再描画したいなら、InvalidateRectしてUpdateWindow()
それでもダメならプログラムのバグ。
>>843 ちゃんとWM_PAINTで毎回画像ファイル開きなおしてるか?
>>843 そうそう InvalidateRect() は 再描画の予約だけで、
メッセージループが暇になった隙をねらって実際の WM_PAINT が配送される。
即時反映させたかったら、
>>844 の通り UpdateWindow() を発行するんだ
847 :
デフォルトの名無しさん :2006/11/06(月) 19:54:31
なるほど。ありがとう。でもできない… InvalidateRectしてすぐUpdateWindowしたけど無理でした…
何が無理なんだかさっぱりわからん。
ただの
>>847 のバグだろそりゃ。
もしかして、他アプリを操作しようとしている?
まーとにかくもう少し情報がないと・・・
それはともかくとして
>>840 >・他のメッセージはちゃんと送れる。(SendMessage(hwnd, WM_DESTROY, wParam, lParam);とか)
WM_DESTROY 送っちゃダメだよ・・・w
850 :
デフォルトの名無しさん :2006/11/06(月) 20:03:36
ただのバグっぽいね。助言くれた人ありがとう。 細かいところ見直して出直します
なんでもかんでも SendMessage で済まそうとしているとこみると 潜在的なバグが他にもありそうだな… 問題を切り分けするのも技術のうちだぞ。 窓のサイズを変えてもちゃんと加工前の画像が表示できているか? とか 加工後のファイルをペイントで確認してみる とか
852 :
デフォルトの名無しさん :2006/11/07(火) 01:18:02
リストビューに垂直スクロールバーが出るくらい項目を追加して、 ある項目をクリック→ホイールでその項目が見えないくらいまでスクロール→何故か、クリックした項目までジャンプ ListView_EnsureVisibleを使ったように最初にクリックした項目が強制的に表示されてしまいます。 これはなにかのメッセージが呼ばれてListView_EnsureVisibleしてるのでしょうか? 勝手にスクロールされたくないのですが、どうすればいいのでしょうか?
853 :
852 :2006/11/07(火) 02:23:36 BE:954083096-2BP(0)
自己解決しました。 WM_MOUSEWHEELメッセージを見つけました。これをフックすればなんとかなりそうです。
ホイールでスクロール中に、勝手に表示位置が戻ったら非常に困ると思うのだが。 本当に上下ホイール以外の操作は一切していないのか?
俺のマウス、インテリセンスの誤爆なのかわからんけど、不意にホイール動作しやがりますよ。 意識してホイール動作させてるときは問題ないんだけどねぇ…
>>855 ホイールが中途半端な位置で止まっているだけでは?
クリック感のあるホイールが中途半端な位置で止まっていると
何かの拍子で本来の停止位置まで動くことは多いが。
プリンタに出力された内容を、キャッチしてそまんまビットマップ化するソースかツールありませんか?
858 :
デフォルトの名無しさん :2006/11/07(火) 11:52:44
プリンタドライバ固有のプロパティ画面を開くAPI教えて下さい。
DocumentProperties
860 :
デフォルトの名無しさん :2006/11/07(火) 13:36:01
FindFirstFileを使うと 1番目と2番目に.と..が来るんですが。 これはなんですか。
カレントディレクトリと親ディレクトリ
FindFirstFileしたパターンのディレクトリ自身とそのディレクトリの親ディレクトリ
なるほど。 dirしたときに出てくる奴だったのか。 サンクスです。
win95以降からはじめた口かね
865 :
デフォルトの名無しさん :2006/11/07(火) 15:34:57
マウスの動かないようにするAPIを教えてください
SetCursorPos
拡大鏡のようなことをしたいんですが、一般的にStretchBltとビットマップのポインタ操作とではどっちが高速なのでしょうか。 StretchBltがビデオドライバ(とビデオチップ)の支援を受けられるのであればいいのですが‥‥
ちなみに倍率は整数倍のみです。
質問です 親ウィンドウのwinprocとダイアログのdlgprocの間でデータのやりとりをしたいのですが グローバルオブジェクトを仲介する以外に良い方法はないでしょうか? アドバイスをお願いします
>>872 ウィンドウが作られたとき、必要な領域をnewで確保し、そのポインタをSetPropで関連付けておく。
deleteとRemovePropも忘れずに。
>>872 DialogBox/CreateDialogではなく、DialogBoxParam/CreateDialogParamを使う。
親から子へ、何らかの構造体かクラスのポインタを渡せばいい。
勿論newなどで動的に確保するのでもそうでなくとも、そのオブジェクトの有効期間に気を使う必要がある。
GetWindowText、GetWindowTextLengthってキャプションが長すぎると失敗したりします? VBのテキストボックスの文章を取得したいのですが、 とりあえずテキストボックスのハンドルを取得するところまではできました。 それで Text1Len = GetWindowTextLength(Text1Handle) とやったのですが、0になってしまいます。 Spy++で Text1Handle と 目的のテキストボックスのハンドルが一致する事と、 テキストボックスのウィンドウキャプションに文章が入っている事は確認しているのですが…。
>>876 ありがとうございます。
>ただし、他のアプリケーションのコントロールのテキストを取得することはできません。
あはは…。
素直にSendMessage使います。お騒がせしました。
878 :
869 :2006/11/08(水) 08:03:36
>>871 ありがとうございます。
でもStretchBltの情報はないのですね。これは実際にコード組んで比較するしかなさそう・・
>>878 1.GetDeviceCaps関数のRASTERCAPSで、ビデオカードが対応してるか確認。
2.StretchBlt関数とポインタ操作による比較を行う。
3.VGAがOFFの、SAFEモードで立ち上げる。
4.StretchBlt関数とポインタ操作による比較を行う。
5.比較結果を見て(゚Д゚)ウマー
StretchBltでの拡大は環境によってバイリニアフィルタがかかったり、 かからなかったりするんだよね。プログラマにはその制御ができない。 ビデオカードのドライバ依存。
>>880 SetStretchBltModeで制御できたような希ガス
とりあえずDIBのStretchBltで組んでみて、 遅かったら改めて考えてみる、で良いと思う。
>>881 それは縮小するときの設定で、拡大は設定できないんだよ。
拡大はビデオカードのドライバの気分次第。
>>879 画面のプロパティからハードウェアアクセラレーション切ったらダメなん?
885 :
デフォルトの名無しさん :2006/11/08(水) 15:49:05
若干スレ違いかもしれないですが…開発環境これなものでここで聞きます。 IPアドレスが、グローバルかローカルかを判別する方法ってありますか? APIやWMIなんかも調べてみたものの、わかりませんでした。 ググってたら判定するフリーウエアみつけたけど、どうやってるのかな…
「プライベートIP」でググれ
ネットマスク+クラスA〜Cプライベート
888 :
885 :2006/11/08(水) 16:07:49
うー、つまり自分でマスクして範囲で見るしかないって事ですか。 わかりました…
マスクも使えないやつにapi使えるのか?
890 :
885 :2006/11/08(水) 17:08:11
変な流れにならないうちに次の方どうぞ
名コテの多いスレだなw
>開発環境これ 誰かツッコめよw
>>852 それはリストビューの仕様
項目選択直後にマウスホイールでスクロールすると必ずそうなる
先に一時的に環境変数を付加してから、 プログラムを起動するランチャーを開発したいと思います。 そこでShellExecuteExでSEE_MASK_DOENVSUBSTを 使用するんじゃないかという所まではたどり着いたのですが lpDirectoryもしくはlpFileメンバに環境変数を指定とあって意味不明です。 lpDirectoryは作業ディレクトリ、lpFileは実行ファイルとあるので 何をどうすればよいのか分からなくなりました。 どうすれば環境変数を一時追加できるのでしょうか。
>>895 それは、lpDirectoryやlpFileのパス名の中で %JAVA_HOME% という感じで
環境変数を参照できるってこと。
正解は、CreateProcessのlpEnvironment
最近Windows Vistaを入れて遊んでいるのですが、 Win32 API(CreateWindow)で作ったボタンとかプログレスバーの形状が Windows 95風のGUIのままなのですが、新しいGUIで表示する方法はありませんか? (Windows XPのLunaでもプログレスバーは同様に古いままでした。) FireFoxとかはちゃんと新しい表示になっているのですが、これが.NETで書かれている とは思えないのでWin32 APIで表示する方法があると自分は思うのです。 どなたか知っている方がいらっしゃたら教えてください。
>>897 つ Using Windows XP Visual Styles
900 :
デフォルトの名無しさん :2006/11/09(木) 08:09:03
タスクバーを含まない画面のサイズをGetSystemMetrics(SM_CXMAXIMIZED または SM_CYMAXIMIZED)で 取得して中央に表示するサンプルとかをみかけますが、このSM_CXMAXIMIZED または SM_CYMAXIMIZEDで 取得できる値はタスクバーにちょっと被りませんか? タイトルバーのないウインドウのサイズを↑でとれた値で設定すると、(0,0)座標からセットしているのに、 少しタスクバーと被ります。 Windows2003(XPStyle)、WindowsXP(XPStyle)、Windows2000、Windows98のどれでためしてみても、 少しタスクバーと被っているのです。 この被っているサイズってなんなのか教えてもらえませんか。
901 :
898 :2006/11/09(木) 08:23:50
>>900 ウィンドウ周囲のボーダー分じゃね?最大化すると普通見えなくなるし。
後、中央表示するならDS_CENTERかGetMonitorInfoで計算した方がいい。
903 :
デフォルトの名無しさん :2006/11/09(木) 10:58:51
>>900 おっしゃるとおり、ボーダー分が被っていました。ありがとうござました。
904 :
デフォルトの名無しさん :2006/11/09(木) 11:05:18
プリンタのデバイスコンテキストに書き込むときメモリをかなり使うようです。 BitBltやStrechDraw(こっちはなるべく使わないようにしてます)を使って書き込んでますが、 減色して書き込むと良いのかな、と思いました。 減色ってどうやるんでしょう?
プログラミング以前にグラフィック関連の基礎を身につけましょう。 用語を知らないとぐぐることもできません。
で、ググル用語は?
現職
PolyLineを指定した矩形の中だけ描画する方法教えてください。
909 :
デフォルトの名無しさん :2006/11/09(木) 18:37:48
フロッピードライブを取得したいのですが、GetDriveTypeだと、 MOドライブやUSBメモリ等との区別が付きません。 どのようにしたら良いでしょうか?
PolyLineを指定した矩形の中だけ描画すればいいとおもうよ
>>908 CreatePolyPolygonRgn
>>909 にゃんにゃお にゃんにゃん にゃんにゃんにゃ
(DeviceIoControl関数と、IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBERで判定)
Sleep使うと子プロセスが遅くなるって本当ですか?
プロセスじゃなくスレッドが一時的に止まる。 普通止まっても構わない局面でしか使わないけどね。
あ、子プロセスの話か。914は忘れて。 子プロセスが遅くなることはない気がするが。
Windowsプログラミング初心者です。 コンソールプログラムから、スレッドでWinMainをよんで窓をポップアップさせて図を 描いてます。 ここで、パラメータをコンソールから打ち込むので、自動でコンソールのほうをアクティブにして 画面のTOPに持って行きたいんですが、コンソールのウィンドウ・ハンドルが分かりません。 コンソールのウィンドウ・ハンドルはどうやったら分かるでしょうか? もしくは望みの結果をどうやったら実現できるでしょうか? ご教授ください。 できれば3行で。
>>915 子プロセスと通信してるとかだったりして
>>917 dクス! でも 0 しかかえってコネーwww もうちょっとがんばる
920 :
デフォルトの名無しさん :2006/11/10(金) 12:19:55
アクティブでないウインドウ上のテキストボックス、ボタン間のフォーカスを こっそり動かしてあげるにはどうするればいいでしょうか。 SetFocusで設定したり、WM_SETFOCUSとか送ると、 フォーカスが動いたタイミングでアクティブに成ろうとします。
921 :
916 :2006/11/10(金) 12:39:51
>917がうまくいきません (>< ・コンソールのタイトルの変更・復帰は出来てます。 ・コンソールアプリから開いた普通のWin窓も、クラスをちゃんと指定すれば正しい ハンドルが帰ってきます。 でもコンソールのハンドルはNULLしかかえって来ません。クラスはサンプル通り NULLを突っ込んでます。 コンソールのクラスがNULLじゃないんじゃないかと思うんですが、 どうやったら分かりますか? API検索のコツがまだつかめなくて見つかりません(>< あと使用言語はIntelFortranです。CでのAPIが分かれば大体はこちらで対応できます。
半角英数と全角英数をごっちゃにして使われると読みにくいな
コンソールのクラスがNULLなんてことはたぶん無い 普通ConsoleWindowClassだったと思う
そもそもFindWindow判ってないみたいだからちゃんと調べれ(うちのMSDNだと日本語版にNULL指定について書いてないけど)
クラス調べるならGetClassName
てか
>>916 でOK
MS公式にもこんなこといっていたのか。 以前、9xでコンソールのウインドウハンドル取りたかったとき、自分でこの方法思いついたんだけど。 そのときにちょっと変な挙動に悩まされた。 プロセスが起動してすぐに、FindWindow()を利用する方法でウインドウハンドルを取ろうとしても、 うまくハンドルが取れなかった。 とりあえず適当にSleep()をはさんだら、問題なかった。 何故かは分からない。 プロセスが起動して、main()関数に至るまでには、まだコンソールが開いていないのだろうか。
>>924 CreateProcess 直後は窓出来上がってないみたいだね。
同じく Sleep で適度に遅延かけてから取得したけど
927 :
デフォルトの名無しさん :2006/11/10(金) 19:17:33
コントロールパネルの「プリンタとFAX」をオープンするAPIを教えて下さい。
にたような質問をどこかで見たような気がする。 そこに答えが書いてあったような気もする。
CreateProcess()で"c:\windows\system32\control.exe printers"をキックる
930 :
916 :2006/11/11(土) 00:49:46
>>923-926 dクスっす!何とかできました。
>>923 このAPIに限らずコンソールがらみのMSAPI文書では、コンソールのクラスに軒並み
NULLが入っています。ここで聞かなかったら永久に分からなかったかも。
でもConsoleWindowsClassを最初定数だと思って混乱した(><
検索してもそんな文字列引っかからないし。
文字定数で与えたらバッチ・グーだったw
あとGetClassNameは引数にハンドルがあって使えませんでした!w
タイトルをユニークにすればクラス名はNULLでも成功するはずなんだけど... そのためのタイトルの変更だし。 クラス名NULLでハンドル取得できずにクラス名指定で取得できたんだとしたら FindWindowの仕様に反しているように思える。 完成したぽいけど何か腑に落ちないw
933 :
916 :2006/11/11(土) 02:37:25
>>931 そうなんですか(´・ω・`)
改めて動いているコードをいじって試してみましたがだめでした。
Fortran用のラッパーが入っているので挙動が違うのかも。
文字列(変数)を直接渡す形になっているので、NULL文字列を送ってみたんですが・・・
Cの場合ポインタを送ることになっているので、ヌルポを送ることになるんですかね?
Fortran用のラッパーに関してはインターフェース部に変数の型が与えられているだけなので
この辺の例外に対する対処法が分かりません(><;
とりあえず、こんな感じでうまくいきます、ユニークタイトルはサンプルにあわせてます。
ipid = GetCurrentProcessId()
itic = GetTickCount()
WRITE(tmp, '(a, i10, a, i10, a)') 'Uho!', ipid, '/', itic, CHAR(0)
iretb = GetConsoleTitle(buff, 1024)
iretb = SetConsoleTitle(TRIM(tmp))
CALL Sleep(40)
hDOS = FindWindow("ConsoleWindowClass", TRIM(tmp))
iretb = SetConsoleTitle(buff)
iretb = SetForegroundWindow( hDOS )
あーラッパが文字列しか受け付けないのか。 Fortranは全く知らないけどNULLが渡ってなかっただけかもね。 別にクラス名書いても、より厳格な検索が出来るだけなので問題ないです。 オツカレサン
935 :
916 :2006/11/11(土) 03:17:51
>>932 ありがとうございます。でもIntelの定義ファイルには存在してませんでした(><;
というか最初に"Console"の文字列でインターフェースファイル全部を検索して
コンソールのハンドルを返しそうなのを調べたけど無かったんです!(><;
でも、引数が無くて整数を返すだけのAPIのようだから、いま自分でインターフェースを
みようみまねで書いて直接APIを叩きに行って、うまくいきました(><;
丸二日の苦労が一瞬で解決しました(><; インテルの馬鹿っ!(><; もう嫌っ!
中の見えないサブルーチンを呼ぶのイヤッ!!
INTERFACE
FUNCTION GetConsoleWindow()
USE ifwinty
INTEGER (HANDLE) :: GetConsoleWindow
!DEC$ ATTRIBUTES DEFAULT, STDCALL, DECORATE, ALIAS:'GetConsoleWindow' :: GetConsoleWindow
END FUNCTION
END INTERFACE
>>935 GetCosoleWindow()使っていいなら最初から言えばいいのに。
動作環境は2k以上でおkですって。
あと、SetConsoleTitle()で変更する前に、
まずFindWindow()を使って、本当にそのウインドウタイトルが存在しないのか確かめたほうがいいと思う。
逆にWin9xでも動かすなら、クラス名はNULLじゃなければいけない。 DOS窓のクラス名は"ConsoleWindowClass"ではなく"tty"なので。
C#をどう思いますか? あんなの言語じゃないと思う、やっぱりWin32API使った方がかっこいいよな!!! to オマエラ
C#は言語だと思う。Win32はAPIであって言語じゃないし、汚いAPIだと思う。 by オマエラ
オマエラさん、こんにちは。 今日は何の御用でしょうか? >ものを買う ものを売る
C#でもWin32APIは呼び出せるわけで…
942 :
デフォルトの名無しさん :2006/11/11(土) 16:43:05
MCIでソフトウェアごとの音量調整ってできる?
Vistaならできる
>>943 手軽にmp3再生できて音量調整もできる
なんて便利なものはない?
・自前でデコードしてdirectsoundで再生 ・directshowでフィルタグラフいじってaudio rendererに音量設定 後者のほうがトータルのコード量は少なくてすむが難易度は高い
947 :
916 :2006/11/11(土) 19:29:56
>>936 いや、そういわれてもwwwww困ります(><;
こっちは初心者でWIN32 API知らないし。
一応、Intelのコンパイラで提供されているWin32APIのインターフェースファイル全部に
検索かけてConsoleがらみのAPIの名前には目を通したけど、たまたまそれは載ってない
APIだったからその存在を知らなかった。
そもそも皆さんはどうやってWin32APIを学んだの?
オンラインヘルプを1個1個見ていくの?
数値計算のライブラリなら解きたい内容が分かっていれば目次から調べようがあるけど、
OSのAPIなんてカテゴリー分けもちんぷんかんぷんでどこから見ていいかも分かりません
(><;
リファレンスを全部記憶するんだよ
俺は翔泳社のAPIバイブルを一度全部読んだな。 暗記するわけじゃないが、どんなAPIが存在するのかくらいは だいたい覚えている。後は使うときに検索。
WinUser.h、WinGDI.h、CommCtrl.hは全部暗記した
ochinchin.h を manko.cpp に #include したのに童貞が捨てられません
慣れてくると、こういう機能の関数があるかどうかはMSDNの このカテゴリーを調べれば間違いないとか、そういう調べ方が できるようになる。
doutei属性外したいだけならfuhzoku_cast<siroutoDT>でいいじゃん
フォルダ関連の便利な関数がShellAPIに沢山あるよ 最近知ってかなり悔しかった
ショートカットのリンク探しくらいしか使ったことないや、俺も調べてみよ
>>951 DestroyDoutei(hDoutei);
ERROR_AITE_NOT_FOUND
VIP_DE_YAREYA_HAGE
おもしろい!!さすがLost32APIスレだ!
>>945 後者のほうが楽じゃない?
IGraphBuilderでレンダリング。取り出したIBascAudioでボリューム設定。
お前ら戻り値のチェックもGetLastErrorもせんでよく平気だな。 気付かぬうちにうほっされてても知らんぞ。
963 :
デフォルトの名無しさん :2006/11/11(土) 23:46:01
GetDCPenColorを使うとエラー(外部参照 LINK2001)と警告(4039)が出るんだけど、どうして??
>>961 難易度が高いより勉強する内容が多い、のほうが正しかったかなあ。
一度分かってしまえば楽勝なんだが。
965 :
デフォルトの名無しさん :2006/11/12(日) 01:41:44
今、ダイアログにチャイルドウインドがあるとします。 ボタンを押すと、このチャイルドウインドがポップアップにしたいです。 (つまり親ダイアログを動かしても、付いてもこないし、親ダイアログより大きくリサイズも可能) で、もう一回ボタンをおすと、元のチャイルドになります。(親ダイアログを移動させると付いてくる) ポップアップにするときは SetWindowLong(hWnd, GWL_STYLE, WS_POPUP | WS_VISIBLE); SetParent(hWnd, NULL); 戻すときは SetParent(hWnd, GetSafeHwnd()); SetWindowLong(hWnd, GWL_STYLE, WS_CHILD | WS_VISIBLE); 見たいにやると一応、動くのです。 質問は「WS_CHILDをセットする前に親をNULLにしているのですが、これは無駄な心配ですか?」です。 やっぱり一瞬でも親ウインドがある状態でWS_CHILDをセットするのは危険ですか? また、逆もそうでしょうか? これらを2個のAPIではなく、一撃でやる方法はありますでしょうか?
msimg32.dllにリソースとして含まれている、ってのがいまいちよく判らん。 VS2005のリンカ見てると、普通にgdi32.libで解決しているように見える。
>>963 DCPen系はWin2k以降のみに対応してるからかな?
971 :
デフォルトの名無しさん :2006/11/12(日) 13:36:57
CD-Rがファイナライズされているかどうか調べるにはどうしたら良いですか?
972 :
デフォルトの名無しさん :2006/11/12(日) 15:26:27
ファイルを読み込んで内容をアプリ側に渡すDLLを作ろうとしているのですが、 アプリ側が確保したメモリに直接書き込むとして、 アプリ側がnewを使ってヒープから確保したメモリのアドレスに DLLは正常にアクセスできるのでしょうか。 (778を読む限り大丈夫そうな気がしたけど・・・ GlobalAlloc()とか使うのとは違うのでしょうか? あと構造体ポインタをアプリからDLLに渡した場合 (同じヘッダファイルを読んで共通の構造体定義を使うとして)、 コンパイラが違うとアラインメントの違いなどで ずれてしまうこともあるでしょうか。 宜しくお願いします。
>>972 作ろうじゃなくて、サンプル作ってみて試してみたらいいじゃん。
自分で少しはやってみろって。
>>973 そんな役に立たないレスならレスしなきゃいいじゃん。
少しは黙っていればいいのに。
976 :
972 :2006/11/12(日) 16:02:22
>>973 すみません、メモリ管理とかはあまり知らなくて色々謎だらけで、
試してうまくいってもそれで理想的(異なるコンパイラなどの条件でも動くものなのか)
なのかわかりそうになかったので先走って質問してしまいました。
>>975 ありがとうございます、DLLは呼び出したプロセス側の
スタック領域と仮想アドレス空間を使うからnewで大丈夫ということですね。
(Susie Plug-inとかだとmalloc()でなくLocalAlloc()だったから
どうなんだろうと思ってましたが、調べた感じではLocalAlloc()は16bit時代の
遺物みたいですね
978 :
972 :2006/11/12(日) 16:38:19
;`;:゙;`(;゚;ж;゚; )ブッフォ
すみません、
誤
>>975 正
>>974 でしたw 975のどこを読んで「〜〜ということですね」なのか
想像して雪見だいふく吹いた
現実生活で誤レスしなければ大丈夫だ。
経験者の言葉には重みがあるな
981 :
963 :2006/11/12(日) 21:09:28
>>968-970 レストンクス
ライブラリをリンクってどうやるんですか?設定をいじるって感じになるんでしょうか?
そもそもヘッダーファイルをインクルードして、使えないって変じゃないすか?
ちなみにVC6.0++ WindowsXPです。
「意味不明な物なんか使えるかボケ」て言われてんだよ
ヘッダーだけでよかったらソースさえいらないんだよ
>>981 そもそもコンドームがあるのに
セックスできないって変じゃないですか?
ちなみに彼女はいません。
わけわかんね。
>>981 よくは知らんが
エラー 外部参照 LINK2001 でググルと色々出てくるよ。
WindowsVistaとかもうすぐ来るんだけどさ、APIまた覚えなおさないと駄目なの?
スレ終わりかけに質問するのもなんですが 今ダイアログがメインウィンドウになるようなものを組んでいます メニューと最大・最小ボタン、×ボタンが表示されているのですがまったく機能しません。 ボタンとして押すこともできない状態です。 宜しくお願いします。 また、ダイアログをメインウィンドウとして使う場合何か特別な注意点などはあるのでしょうか。
>>988 メッセージループまわってる?
キャプションバー持ってウィンドウ動かすことはできる?
全く動かないです(´・ω・) ただ適当に配置したOKボタンは押せているようです
992 :
567 :2006/11/13(月) 01:05:40
(´ー`)y━・~~
あ、CommCtrlのバージョンですね…… 失礼しました(;´Д`)
>>987 今までどおりのプログラムは大体(←ココ重要)今までどおり動く。
そうでなければWindowsではない。
>>992 無駄なスレ消費だけで何の役にも立ってないんだから次スレよろ
996 :
デフォルトの名無しさん :2006/11/13(月) 09:02:33
ソーセージータ
乙ですよ 梅
999
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。