X



Win32API質問箱 Build123©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net
垢版 |
2016/10/08(土) 12:33:02.29ID:0jaJMPXG
Win32APIについての質問はこちらへどうぞ。

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

■過去スレ
Win32API質問箱 Build122
http://echo.2ch.net/test/read.cgi/tech/1451988219/
0277デフォルトの名無しさん
垢版 |
2016/12/19(月) 23:46:04.62ID:qsdLnaaR
>>276
ありがとう。
拡張スタイル使ってもやっぱり無理だ。
思い通りに動かない。
数年前からずっと謎なんだよなこれ。
動作上問題が少ないから我慢してたんだけども。

それっぽいウインドウは出るものの、paint.netのように全ウインドウがアクティブ状態にならない。
【参考画像】http://news.softpedia.com/images/extra/WINDOWS3/large/paint.net/paint.net%20interface.jpg
paint.netを実際に使ってるとよく分かるんだが、
参考画像のようにメインのウインドウもツール用のウインドウも常にアクティブな状態が維持される。
しかし、拡張スタイルでWS_EX_TOOLWINDOWを指定してもアクティブなウインドウは常に1つ。
メインのウインドウをクリックすればツール用ウインドウは非アクティブになり、
ツール用ウインドウをクリックすればメインウインドウは非アクティブになる。
非常に気持ちが悪い。
確かにWS_EX_TOOLWINDOWを利用すればメインウインドウより常に前面になり、
タスクバーにも表示されず、非常にpaint.netのツールウインドウと似たような挙動になるが、
このアクティブ/非アクティブに関しては挙動が全く違う。
ちなみにアクティブ/非アクティブの判断はタイトルバーの色で判断している。
さらに参考画像のツールウインドウのような右上の正方形の閉じるボタンの表示のさせかたも分からない。

・・・と思ったら出てきたわ。
http://www.catch22.net/tuts/docking-toolbars-part-1

やっと出てきた。
WS_EX_TOOLWINDOWで検索してもノイズが多くてなかなか出てこなかった。
(ノイズ = MSDNのウインドウスタイルの一覧をコピペしただけのゴミサイト)
ノイズゴミサイトマジで迷惑。
嫌がらせでしかない。
0278デフォルトの名無しさん
垢版 |
2016/12/19(月) 23:50:28.70ID:qsdLnaaR
結局今回のカギはGoogle画像検索。
ふと「サンプル載せてるサイトの半数くらいはスクショも載せてるのではないか」と思い、
例の拡張スタイルで画像検索。
俺がやりたいのと同じ状況になってる画像を見つけて開いたらビンゴ。
画像検索なんて今まで思いもよらなかったよ。
文字検索するとノイズゴミサイトばかり出てきてどうにもならなかった。
0279デフォルトの名無しさん
垢版 |
2016/12/19(月) 23:52:55.75ID:qsdLnaaR
MSDNのコピペサイト作ってるゴミ共は早く死ねばいいのにな。
役に立たないどころか大迷惑。
最近流行りの質の低いキュレーションサイト()と同レベル。
0281デフォルトの名無しさん
垢版 |
2016/12/20(火) 06:12:08.47ID:ADGhogoA
google personal blocklistでかたっぱしからブロックしてる
xxxユーザー会もノイズ源だね
0282デフォルトの名無しさん
垢版 |
2016/12/20(火) 09:20:12.73ID:F0IdvAwo
顔写真ブロックは必須
おまえらキモ面なのに何故あんな目立つ場所に配置すんだ
0283デフォルトの名無しさん
垢版 |
2016/12/20(火) 12:55:43.49ID:lAXr92yw
>>278
おめ
興奮は伝わったが
もちつけ
0284デフォルトの名無しさん
垢版 |
2016/12/20(火) 13:00:10.44ID:lAXr92yw
>>279
はてぶのことですねわかります
0285デフォルトの名無しさん
垢版 |
2016/12/20(火) 16:58:42.80ID:WXAyO/1W
>>277
そういうときはいっそそのソフト解析したら?
Paint.NETなら簡単に逆コンパイルできるし、Spy++とか使うだけでもある程度わかる
0290デフォルトの名無しさん
垢版 |
2016/12/20(火) 22:05:37.09ID:JPbALvOm
MSDNのコピペサイト全般のことだろう>アフィ
0291デフォルトの名無しさん
垢版 |
2016/12/21(水) 01:04:08.51ID:HCdO29Rc
質問
writefile関数を使用してint型で、データ保存ができません。同じ悩み持ったことある人いらっしゃいませんか。
0292デフォルトの名無しさん
垢版 |
2016/12/21(水) 01:09:18.76ID:GvkBvmPc
int Data = 123456;;
DWORD writeLen;
WriteFile(hFile,&Data,sizeof(Data),&writeLen,NULL);

こういうことだろ?
0293デフォルトの名無しさん
垢版 |
2016/12/21(水) 01:10:40.03ID:kLgQ2k1v
変数のアドレスをwritefileにわたさないとだめ。数値そのままわたしてるんでしょ
0296デフォルトの名無しさん
垢版 |
2016/12/22(木) 12:50:31.88ID:y+mdv7YD
-jp もお忘れなく
0297デフォルトの名無しさん
垢版 |
2016/12/22(木) 13:04:48.47ID:hYDEOt1H
どうしてこういう訳そのままずっと放置してんだろうな

> 関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、 関数を使います。
> If the function fails, the return value is zero. To get extended error information, call GetLastError.
0298デフォルトの名無しさん
垢版 |
2016/12/22(木) 18:24:16.26ID:zHNnrJEM
>>296
なんで付けるの?
誤訳トラップにハマりたいの?

俺は誤訳トラップどころか英語版と日本語版で引数違うトラップにハマったことがあるけども。
日本語版を穴が空くほど見て確認したけど何日経ってもコンパイルが通らず、
何の気なしに英語版開いたら引数の数が違って、
英語版見ながら修正したら一発でコンパイル通ったわ。
0300デフォルトの名無しさん
垢版 |
2016/12/22(木) 18:47:30.93ID:YVr1LIe6
>>298
今時どんな開発環境使ってるんだよ w
VisualStudio なら関数名 + '(' を入力した時点でプロトタイプが表示されるだろ
0301デフォルトの名無しさん
垢版 |
2016/12/22(木) 18:55:29.30ID:zHNnrJEM
>>299
ごめんなさいwww

>>300
その当時はVector辺りで見つけてきた適当なテキストエディタとBCCだったよ。
0303デフォルトの名無しさん
垢版 |
2016/12/22(木) 22:46:25.55ID:+nnZ9oR0
レポートタイプのリストビューをクリックしたら、その行のデータに対応する内容を
別の窓に詳細表示するというような動作をしているのですが、クリック時は NM_CLICK
を処理してクリックされた行を nmLv->iItem メンバを参照して知ることができます。

オペレーションとしてはマウスだけではなくキーボード操作でリストビューの選択行を
次々と移動させることも多いので、LVN_KEYDOWN も処理して上記と同様の動作を
させたいのですが、LVN_KEYDOWN 処理時は nmLv->iItem の中身が不定です。

LVN_KEYDOWN 処理時に ListView_GetNextItem で LVNI_ALL | LVNI_SELECTED を
指定して選択行を調べると、キーボードを押して選択行を変更する前の選択行が
得られてしまいます。

この辺は、一旦メッセージループを回すなどしてから現在の選択行を得ること自体は
可能と言えば可能なのですが、ここまでしないとダメなのかという疑問があります。

LVN_KEYDOWN 処理時、もしくはキーボード操作で選択行を変更した際、簡潔に
現在の選択行を得る方法はありますでしょうか?
0305デフォルトの名無しさん
垢版 |
2016/12/23(金) 14:54:42.80ID:qGVMhgWM
質問です。

win10 x64

windows がキャッシュしてる dns の名前解決結果の一部を書き換えることは可能ですか?
または、名前解決の最中に結果をいじるようなフックは出来ませんか?

例えば、example.com の ttl を長めに書き換える、とかです。

よろしくお願いします。
0306片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2016/12/23(金) 15:00:49.80ID:3xdKhrkh
>>305
デバッグ特権があれば、別のプロセスのプロセスメモリーにアクセスすることも可能。
0307デフォルトの名無しさん
垢版 |
2016/12/23(金) 15:29:20.66ID:Kb3OsEli
対象アプリ限られてくるけどAPIフックすりゃ簡単に結果改竄はできるな
キャッシュ改竄はフィルタードライバあてる面倒なのしか思いつかない
0308デフォルトの名無しさん
垢版 |
2016/12/23(金) 15:36:22.73ID:5J5pLbD7
以下の処理を実装したく、助言をお願いします。

ダブルクリックや右クリ開くなどで、ファイルを開く際に
関連付けの有無に関わらず、そのファイルのパスを取得したい。

ShellProcあたりのフックかと考えましたが、パスをどうやって
調べるのか分かりません。

どうぞ宜しくお願いします。
0309デフォルトの名無しさん
垢版 |
2016/12/23(金) 15:54:43.63ID:Kb3OsEli
目的次第だがShellProcは違うんじゃないか
explorer.exeに対してShellExecuteあたりのフックか?
0310デフォルトの名無しさん
垢版 |
2016/12/23(金) 15:59:09.98ID:5tPECy1o
>>305
proxy arp
0311305
垢版 |
2016/12/23(金) 16:14:48.81ID:sqLqmtwC
>>305, 306

レスありがとうございます。
DLL注入やアタッチのよるDNS改ざんは確かにできそうですね。
検討してみます。

ちなみに、プロセスは基本的には chrome です。


>>307

できればフィルタードライバの設計を、おおざっぱでもいいので教えて頂けませんか?
(ドライバのコーディングは、ほぼ経験が無く、ネットワークそのものの知識はあるものの、windows内部での扱いやAPIはまったく知識が無いです)

ちなみに、VPNによる仮想アダプタと、複数のネットワークカード(アダプタ)があるのですが、それでも対応可能でしょうか?
(直感的には、特定アダプタに対するフィルターだと、アダプタの優先度に左右されそう。アダプタ依存にはしたくないです)
0313デフォルトの名無しさん
垢版 |
2016/12/23(金) 16:45:40.87ID:Kb3OsEli
>>311
WDKサンプルのこのあたりが参考になるのかな
NDIS 6.0 Filter Driver
Windows Filtering Platform Packet Modification Sample
0316デフォルトの名無しさん
垢版 |
2016/12/25(日) 22:10:16.80ID:n7UGfNqJ
iniファイルから文字列を読み込むGetPrivateProfileString()なんですが、
セミコロン以下のコメント文まで読み込んでしまいます。

コメント文は読み込まないようにできないでしょうか?
それとも自分でコメント文を削除するしかないでしょうか?
0318316
垢版 |
2016/12/26(月) 01:06:56.36ID:CvSBnmkv
>>317
なるほど!
ありがとうございました!
0320デフォルトの名無しさん
垢版 |
2016/12/26(月) 21:20:51.81ID:SUV7MStA
セミコロン付けたらコメントになるって言うけどよー
あれ実際は特別扱いなんかしてなくて、例えば
;abc=def
にしたら「;abc」って名前になるから「abc」に一致しなくなるだけじゃないかと疑ってる
0323316
垢版 |
2016/12/29(木) 11:37:53.16ID:E1SACFDz
使ってるエディタが.iniの同一行コメントもコメント色に変換してくれるので、誤解してしまいました。
気を付けます。
0324デフォルトの名無しさん
垢版 |
2016/12/30(金) 13:34:08.58ID:qor2kyvR
winsockの関数フックしたいんですけどインポートアドレステーブル上の
ws2_32.dllの関数だけ取得できません。どうしたら?

ttp://up2.cache.kouploader.jp/koups19399.txt
このコードは
自身のロードしたDLLの関数名を列挙するだけのシンプルなものですが、
やはりwinsockの関数名だけ取得できないです。

ImageDirectoryEntryToData()の第3引数を
IMAGE_DIRECTORY_ENTRY_IATや
IMAGE_DIRECTORY_ENTRY_DELAY_IMPORTに変えても取得できませんでした(そもそも関数がnull返してくる
0328324
垢版 |
2016/12/30(金) 14:41:23.26ID:qor2kyvR
>>325
成功しているようです

>>326
関数名が名無しということですか?

>>327
どのタイミングでですか?


if(IMAGE_SNAP_BY_ORDINAL(pThunkData->u1.Ordinal))
winsockの関数だけこのif文が真になります。

ttp://i.imgur.com/jWNmlgm.png

デバッガでIAT覗くと、正しい関数名ではないが、2つの関数らしきもの?が表示されていて
これがWSAStartup()/WSACleanup()に対応するものだと思われます

他のDLLでは関数名が正しく表示されます。

これが、関数名が名無しということならどう対処するのかご教示頂きたいです。

海外のフォーラムの似たような質問では
ImageDirectoryEntryToData()の第3引数を
IMAGE_DIRECTORY_ENTRY_DELAY_IMPORTに変えて成功したと書かれていたんですけどね、成功しませんでした。
0330デフォルトの名無しさん
垢版 |
2016/12/30(金) 15:39:26.81ID:Q3tvxZdg
マクロというオチ
0332デフォルトの名無しさん
垢版 |
2016/12/30(金) 19:08:50.21ID:qor2kyvR
>>331
ヒントありがとうございました。解決しました

PIMAGE_THUNK_DATA pThunkData = (PIMAGE_THUNK_DATA)((PBYTE)hmodCaller + pImportDesc->OriginalFirstThunk);
PIMAGE_THUNK_DATA pRealThunk = (PIMAGE_THUNK_DATA)((PBYTE)hmodCaller + pImportDesc->FirstThunk);
while(pThunkData->u1.Function){
FARPROC pfnImportedFunc = (FARPROC)(pRealThunk->u1.Function);
・・・
上記のIAT上の関数アドレスと、
LoadLibrary()&GetProcAddress()で取得したwinsock関数のアドレス
を比較し一致したものを書き換えたら成功しました。

ttp://blog.techlab-xe.net/wp-content/uploads/2014/05/pe-format-import-func-list.png
これそもそも
文字列比較より
アドレス比較を用いる方法のほうが正確なやりかたですよね?
0333デフォルトの名無しさん
垢版 |
2017/01/21(土) 17:55:42.90ID:0py1wTB0
CreateProcess関数の質問です。この関数で開いた外部プロセスを、操作しようとしたらハンドルされていない例外エラー発生したことある人いますか?

エラーメッセの
オブジェクト参照がオブジェクトインスタンスに設定されていませんの意味もいまいちわからずです。悩んでいます。

どなたかヒントをくれたら幸いですm(__)m
0334デフォルトの名無しさん
垢版 |
2017/01/21(土) 18:11:33.93ID:3w6w5xSi
たぶんCreateProcessの問題じゃなくてソースコードの問題
基本的なとこをどっか間違えてると思う
0337デフォルトの名無しさん
垢版 |
2017/01/21(土) 23:19:24.15ID:0py1wTB0
>>335
>>336

HWND hwnd;
STARTUPINFO si;
BOOL boRet = 0;
DWORD dwRet = 0;

ZeroMemory(&si, sizeof(si));
ZeroMemory(&piMplab, sizeof(piMplab));
si.cb=sizeof(si);

GetStartupInfo(&si);
boRet = CreateProcess(_T(""C:\Program Files (x86)\Microchip\PICkit 3 v3\"Pickit3.exe"),NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&piMplab);

CloseHandle(piMplab.hThread);
CloseHandle(piMplab.hProcess);

すみませんこんな感じですm(__)m↑
0339デフォルトの名無しさん
垢版 |
2017/01/21(土) 23:31:13.18ID:/qDbjX4N
アクセス権か
0343デフォルトの名無しさん
垢版 |
2017/01/22(日) 11:15:36.01ID:nyEfU5To
>>333
なんか.NETのエラーメッセージっぽいけど、.NETから呼び出しているの?
該当部分のソースを全部貼り付けなきゃ誰もわからないでしょ。
0344デフォルトの名無しさん
垢版 |
2017/01/23(月) 08:44:04.99ID:As9ZYPu9
そもそもどっちのプロセスがエラーを出してるかすら把握できてなさそう
子プロセス呼び出しはなんとなくコピペで扱うには荷が重い
0345デフォルトの名無しさん
垢版 |
2017/01/25(水) 06:02:27.98ID:s4b0iZxC
プロセスを起動して、ユーザーの入力に応答しているか確認するにはどうしたらいいでしょうか。
Process::Responding プロパティ以外の方法でお願いします。
うちの開発環境にはないので。

プロセスのウインドウを取得して、メッセージを送るくらいしか思いつかないのですが、ウィンドウがない可能性もあるし
もっとスマートな方法があればいいなと。
0347デフォルトの名無しさん
垢版 |
2017/01/25(水) 09:04:47.86ID:paQpH1yu
ネットワークプログラミングで言う所のキープアライブ的なのを実装じゃあかんの?
0348デフォルトの名無しさん
垢版 |
2017/01/25(水) 10:50:26.10ID:SLV8VPLP
>>345
WM_PAINT系のメッセージを投げて
クライアント領域が書き換わってるかどうかとか
show/hideメッセージ送って反応するかどうか見るとか
0352デフォルトの名無しさん
垢版 |
2017/02/02(木) 12:01:31.08ID:386srHJg
TrayNotifyWndにアプリアイコンを追加と削除をしたいのですが、どうすればよいでしょうか?
Shell_NotifyIconの登録みたいなやつです。
Shell_NotifyIconの登録と削除右派知っています。
0354デフォルトの名無しさん
垢版 |
2017/02/02(木) 13:37:19.22ID:386srHJg
>>353
情報ありがとうございます。やりたい内容と、ちょっと違います。
windows8.1/10とかだと、タスクバーが上か下にあるとき、タスクトレイの右側か左側にTrayNotifyWndに
[IME]、[タッチパネル向けのキーボード]、[通知]などが表示されていますよね?

それらの場所に、自作のアプリアイコンを作りたいのです。
スパイでみると、
通知 ハンドル 001016E キャプション 通知センター クラス TrayButton
キーボード ハンドル 0010172 キャプション タッチキーボード クラス TIPBand
IME ハンドル 0010156 キャプション 無し クラス Button
となっています。
親ハンドルからたどってクラスを見るとTrayNotifyWndとなっています。
知りたいのは、SHAppBarMessageを使ったタスクバーみたいなウインドウではありません。
0355デフォルトの名無しさん
垢版 |
2017/02/02(木) 13:49:49.54ID:386srHJg
googleの画像検索で googleimeとかってやると下のような画面がでますよね?
https://www.google.co.jp/search?q=googleime&;biw=1280&bih=607&source=lnms&tbm=isch&sa=X&sqi=2&ved=0ahUKEwiZzey0zfDRAhUJbrwKHQ4dBuAQ_AUICCgD#imgrc=j130VRRhjR7jdM:

TrayNotifyWndでにて、設定メニュをいじっているような画面のようなプログラムを作りたいのです。
0357デフォルトの名無しさん
垢版 |
2017/02/02(木) 14:17:43.87ID:386srHJg
>>356
一般的な、Shell_NotifyIconでタスクトレイの登録ではないです。
タスクトレイの横に登録する手続きが知りたいのです。
mozcのソースコードをgrepしたところShell_NotifyIconは使われていないようです。

comクラスとかでTrayNotifyWndに追加するような機能があるのかなぁ。。
0358デフォルトの名無しさん
垢版 |
2017/02/02(木) 14:36:09.97ID:89UtyOev
すまん。通知領域はその右側か盲目だった
直接CreateWindowでぶらさげちゃうとかできないかな
0362デフォルトの名無しさん
垢版 |
2017/02/02(木) 19:12:40.06ID:qO0hDPsp
>>357
> mozcのソースコードをgrepしたところShell_NotifyIconは使われていないようです。
ならそのソースを読めばいいんじゃね?
0364デフォルトの名無しさん
垢版 |
2017/02/02(木) 23:04:33.49ID:386srHJg
>>363
ざっくり調べたところ、おっしゃる通り言語バーのcom呼び出してるだけっぽかったです。
>>361
HWND hTaskBar = ::FindWindow(L"Shell_TrayWnd", NULL);
HWND hTrayNotify = ::FindWindowEx(hTaskBar, NULL, L"TrayNotifyWnd", NULL);
hButton = CreateWindowEx(0,L"button",L"@",WS_CHILD | WS_VISIBLE,0,0,48,24,hTrayNotify,0,hInst,0);
一瞬ボタンが表示されて消えましたw
登録のさせ方がたぶん違いますよね。
TBBUTTON tbButton = { 0 , 0 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0 };
SendMessage(hTrayNotify, TB_ADDBUTTONS, 1, (LPARAM)&tbButton);
なにも起こらず。。orz
0365デフォルトの名無しさん
垢版 |
2017/02/02(木) 23:11:43.26ID:386srHJg
HWND hTaskBar = ::FindWindow(L"Shell_TrayWnd", NULL);
HWND hTrayNotify = ::FindWindowEx(hTaskBar, NULL, L"TrayNotifyWnd", NULL);
だと、タスクトレイの内部に描画されてました。
やりたいことと違う;;
0367デフォルトの名無しさん
垢版 |
2017/02/03(金) 09:17:19.56ID:pF10NEzN
>>364
TrayNotifyWndが、もしツールバーのクラスを内部で保持してたら登録できるかなーと思いついての実験でした。。
ウインドクラスTrayNotifyWndにそんな機能はなかった。うまくいかないものですね。
0368デフォルトの名無しさん
垢版 |
2017/02/03(金) 09:34:28.94ID:pF10NEzN
HWND hTaskBar = ::FindWindow(L"Shell_TrayWnd", NULL);
HWND hTrayNotify = ::FindWindowEx(hTaskBar, NULL, L"TrayNotifyWnd", NULL);
HWND hToolbarWindow32 = FindWindowEx(hTrayNotify, NULL, L"ToolbarWindow32", NULL);
printf("handle %p %p %p ", hTaskBar, hTrayNotify, hToolbarWindow32);
SendMessage(hToolbarWindow32, TB_ADDBUTTONS, 1, (LPARAM)&tbButton);
実験してだめだったコード。。こんな感じでした。ウインドハンドルは普通に取得は成功していたみたいなんですけどね〜
0369デフォルトの名無しさん
垢版 |
2017/02/03(金) 11:42:55.01ID:mwiWK7Ca
指定したソフトが生きてるかフリーズしてるかを判断できるAPI教えてくださいよ
0372デフォルトの名無しさん
垢版 |
2017/02/03(金) 14:07:18.26ID:pF10NEzN
>>371
その画像だと、ウインドウが、タスクトレイの位置にありませんか?
タスクトレイの内部にアプリアイコンを作るのであれば、Shell_NotifyIconで登録すればいいだけです。
やりたいのは、その画像でいうと、時計の右横の通知領域の右にウインド領域を追加したいのです。
0373デフォルトの名無しさん
垢版 |
2017/02/03(金) 14:11:00.00ID:mwiWK7Ca
>>370
それだと帰ってこなかったら出した側も固まりませんか?
0374デフォルトの名無しさん
垢版 |
2017/02/03(金) 14:13:38.31ID:oHw8NUL1
>>373
別スレッドからメッセージ投げて、メインでスレッド監視して待機時間オーバーしたかどうかで判定するとか
0375デフォルトの名無しさん
垢版 |
2017/02/03(金) 14:20:41.69ID:mwiWK7Ca
>>374
なるほど。
メッセージ投げてから返答が帰るまでの待ち時間で判断するって事ですね。
ありがとうございます。さっそくやってみます。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況