スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは
>>2-5 くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(
http://msdn.microsoft.com/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
windowssdk.msdn.microsoft.comは、もうmsdn2へ転送されるようになっている。
C#相談室より、半誘導されてこちらにて質問させていただきます。 現在、キーボードやマウスによるキー入力を どのデバイスから送られて来たのか判断した後、 場合によっては入力を握りつぶしたいと考えております。 デバイスを判断し、キーを取得するだけですと WM_INPUTにてRawInputを使用することにより実現できたのですが、 キーを握りつぶすことが私の試行錯誤した上ではできませんでした。 キーを握りつぶそうとWH_KEYBOARD_LLをフックし、 WH_KEYBOARD_LLの時点でキーを握りつぶすとメッセージの順序の関係上だと思うのですが WM_INPUTも呼ばれなくなってしまい、デバイスの識別ができないでおります。 他の処理も考え付かず、途方にくれている状態です。 WH_KEYBOARD_LLがWM_INPUTより先に呼ばれているならそこでデバイスを 識別できないかとも考えたのですが、私の調べた限りではできませんでした。 どうか皆様のお力を少しでもよいので貸していただけないでしょうか。 よろしくお願いいたします。
999 名前:デフォルトの名無しさん 本日のレス 投稿日:2006/12/15(金) 21:01:08 1000なら1ヶ月ぶりに休みが取れる… 甘かったな・・・・もう1ヶ月がんがれ。
>>7 WH_KEYBOARD_LLを仕込んでもマウスイベントは来ないよね?
マウス用にWH_MOUSE_LLも仕込めば良いんじゃないの?
>どのデバイスから送られて来た そんなにたくさんのデバイスがあるの? マウスが16個とか?
11 :
デフォルトの名無しさん :2006/12/15(金) 21:58:17
ヒープやスタックの開始アドレスを教えてくれるAPIはありますか?
12 :
7 :2006/12/15(金) 22:02:57
>>7 キーボードを例にとって、検証したので、
マウスの場合は載せておりませんでした。
>>10 はい、そのような状況下を仮定しております。
基本的に、マウスの件よりもキーボードのほうを重視しており、
マウスは同時に実装できればいいとオマケ程度に思っております。
不足していて申し訳ありません
>>11 スタックはAPIではなくバッドノウハウで取得できる。
ヒープはシラネ。
>>7 RegisterRawInputDevicesで
適当なwindowにWM_INPUTを飛ばしてやれば?
>>14 というのはどういうことなのでしょうか?
WM_INPUTを飛ばすということは、すべてキーフックで握りつぶして
その後WM_INPUTを自分で送り、そこでデバイスの判別をして
場合によりまたキーを送るといった感じなのでしょうか。
ただその場合もWM_INPUTを送る際にデバイスが分かってないと意味がないので
結果目的は達せないのでは?それとも方法があるのかな・・
もしかすると自分の見解が違うのかもしれませんが、
その場合申し訳ないです。もう少し詳しく聞かせていただければ幸いです
つか何をしたいのかよくわからん。 WM_INPUTの引数でデバイスの判別できるなら メッセージハンドラでやりたいことすればいいんでねぇ?てこと。 あと適当なwindow→自前のwindowというべきだったかな。
握りつぶしたいんだろ? でも WM_INPUT を握りつぶしてもキー入力は止められない、さあどうしよう、と。 RawInput からは外れるがフィルタドライバとかでどうにかならんかな? C# じゃ多分書けないだろうけど。
あぁそうか。フィルタドライバはデバイスを限定するために必要って事か。 となるとC丼じゃ間違いなく無理だな。DDKの仕事だ。
19 :
デフォルトの名無しさん :2006/12/16(土) 11:35:21
Win32APIで、μ秒単位の割り込みを発生させるにはどうやったいいんでしょう?
無理
ドライバ書く。 ってWin32 APIと違うか。
ドライバも開発キットが無料でDLできたり、 日本語の書籍も少しだけ出てたりして敷居が下がったな。 っていうけど英語が苦手な俺にはクリスマスとかバレンタイン並みに遠く感じる世界だった('A`)
技術的な敷居は下がったけどx64で署名が強要されたりする方面の敷居は高くなったな
RegisterClassEx()の引数のWNDCLASSEX構造体の中身ってアプリケーションが終了するまで 保持しなきゃいけないの? 今複数のクラスを登録するつもりで一つのWNDCLASSEX変数の値を一部書き換えてはRegisterClassEx()、 一部書き換えてはRegisterClassEx()するコード書いたら、先に登録したはずのクラス名が見つからんとか 言われてしまった。んで各クラス数ぶんだけ変数領域別にしたら正常に動作。 MSDNにはそれっぽい事は見つからなかったので教えて下され
WNDCLASSEXをローカル変数にしたコードが無問題なので原因は別
クラス名っていうから文字列データの話じゃなかろうか。 普通に考えればコピーされているはずだが。
前スレ
>>963 HKEY_CLASSES_ROOT
より
HKEY_CURRENT_USER\Software\Classes
のほうが優先されるから気をつけて。
>>28 それは違う。正しくは
HKEY_LOCAL_MACHINE\Software\Classes
より
HKEY_CURRENT_USER\Software\Classes
が優先される。そもそも
HKEY_CLASSES_ROOT
は優先順位を考慮して両方をマージした結果になるので他を見る必要はない。
31 :
7 :2006/12/16(土) 19:30:48
やはりフィルタドライバの作成になるのでしょうか・・ 何度かフィルタドライバの話も出ており、興味はあったのですが なかなか踏み込めずにいたのでこれを機会になんとか頑張ってみたいと思います。 お答えいただいた皆様ありがとうございました。
教えてください。 リソースのメニューバーにあるボタンが押下された場合 ハンドルを取得するにはどうすればいいんでしょうか? CheckBox = SendMessage(???, BM_GETCHECK, 0, 0L); でチェックボックスの状態を調べたいんですが リソースで作成されたメニューのコントロールのハンドルがわかりませぬ。
33 :
32 :2006/12/16(土) 20:28:11
EnableMenuItemを使って自己解決しました。
ビットマップ画像中のゴミ(白のバックに黒ピクセルが点在してる)を検出して 白く塗すプログラムを組んでいます。 3500×3500くらいまでの画像なら問題なく実行するのですが、4000×7000くらい以上では 処理が行われなくなります。(少しの間矢印ポインタが砂時計になるだけ) メモリは確保できてるのでオーバーフローはないと思うのですが、他に考えられそうな 原因があればご助言ください。 そこから改善を詰めていきたいと思います。 よろしくお願いします。
お前が書いたコードにバグがある。
エラーコードくらい確認したんだろうな。
ダイアログにアイコンつけたいんですがリソースに記述するのか 別のやり方でアイコンを貼り付けるのかわかりません。 PROCESSDLG DIALOGEX 0, 0, 300, 125 STYLE WS_POPUP | WS_CAPTION | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU CAPTION "ダイアログ" ICON IDI_ICON /* これじゃダメなのか!? */ FONT 9, "MS Pゴシック" BEGIN DEFPUSHBUTTON テスト", IDC_BOOT, 50, 50, 50, 14 END お願いします。
38 :
34 :2006/12/17(日) 00:14:25
>>35 >>36 調べてみたところ、「このコマンドを実行するのに十分な記憶域がありません。」とのことでした。
メモリまわりの処理を見直してみることにします。
ありがとうございました。
39 :
34 :2006/12/17(日) 00:32:36
原因が分かりました!!
ちゃんと処理するようになりました!!
>>36 さんが指摘してくださったエラーコード取得のおかげです!!
ほんとうにありがとうございました!!
たまに成功してるのにエラーコード設定するAPIがあるんだよな
しかもMSDNに記述してなかったり… ほんとWin32APIは泥沼だぜ(´・ω・`)
>>37 ダイアログ自体なら
SendMessage(hwnd, WM_SETICON, ICON_SMALL, hIcon);
スタティックへのイメージ貼り付けなら
SendDlgItemMessage(hwnd, IDC_xxx, STM_SETICON, hIcon, 0);
>>40 あー、気づけよ俺orz
ありがとうございます。
>>19 調べれば沢山見つかると思うけど、
QueryPerformanceFrequency
QueryPerformanceCounter
あたりで、計測すれば1msec以下の周期は作る事ができる。
環境:vs2005EE C/C++
GDI+を使ってみようと思い、下記猫でも〜のを参考に
ttp://www.kumei.ne.jp/c_lang/sdk4/sdk_335.htm メインのcppに #include <gdiplus.h> using namespace Gdiplus; を追加し
プロジェクトにGdiplus.libを追加し
〜とやって、雛形のみを作成し、起動させるだけのテストをしてみたのですが
コンパイルしたところ
gdimagepulsimaging.h の67行目の IImageBytes : public IUnknown が問題らしく
c:\program files\microsoft platform sdk\include\gdiplusimaging.h(67) :
error C2440: '初期化中' : 'const char [37]' から 'int' に変換できません。この変換が可能なコンテキストはありません。
c:\program files\microsoft platform sdk\include\gdiplusimaging.h(67) :
error C2146: 構文エラー : ';' が、識別子 'IImageBytes' の前に必要です。
c:\program files\microsoft platform sdk\include\gdiplusimaging.h(67) :
error C2470: 'IImageBytes' : 関数定義のようですが、パラメータ リストがありません。外見上の本体をスキップします。
c:\program files\microsoft platform sdk\include\gdiplusimaging.h(67) :
error C2059: 構文エラー : 'public'
c:\program files\microsoft platform sdk\include\gdiplusimaging.h(246) :
error C2146: 構文エラー : ';' が、識別子 'id' の前に必要です。
c:\program files\microsoft platform sdk\include\gdiplusimaging.h(246) :
error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
c:\program files\microsoft platform sdk\include\gdiplusimaging.h(246) :
error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
c:\program files\microsoft platform sdk\include\gdiplusheaders.h(384) :
error C2143: 構文エラー : ')' が '*' の前にありません。
c:\program files\microsoft platform sdk\include\gdiplusheaders.h(384) :
error C2143: 構文エラー : ';' が '*' の前にありません。
…と以下エラーが100以上出てきてしまいました。
↑一行目のエラーが抜けてました c:\program files\microsoft platform sdk\include\gdiplusimaging.h(67) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません これは何かまだしなくてはいけない事があるのでしょうか それとも、IImageBytes : public IUnknown の前に型指定子を書き足した方が良いんでしょうか 実行ソース: Gdiplus.libを追加 #include <gdiplus.h> #include <gdiplus.h> using namespace Gdiplus; int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // グローバル文字列を初期化しています。 〜 GdiplusStartup(&gdiToken, &gdiSI, NULL); // アプリケーションの初期化を実行します: 〜 // メイン メッセージ ループ: 〜 GdiplusShutdown(gdiToken); return (int) msg.wParam; } 〜:処理
↑ #include <gdiplus.h> #include <gdiplus.h> はコピペ失敗 #include <gdiplus.h> 一つになってます。 あと、int APIENTRY _tWinMain以外は手を付けていないので省略しました。
<gdiplus.h>より先に<ole2.h>をインクルードしろ。 WIN32_LEAN_AND_MEAN抜きで<windows.h>をインクルードするのも良い。
すみません、自己解決しました。 #include <comsvcs.h> を #include <gdiplus.h> の前に入れたら通りました。
>>40 APIが成功した場合、特に明記がない場合GetLastErrorの値は不定だったと思う。
つまり、明記されている条件以外のGetLastError値に意味はない。
タスクトレイにアイコンを表示させたいのですがうまくいきません。 タスクトレイにはアイコンのスペースだけが空いて絵が表示されないです。 リソーススクリプトには MYICONICONDISCARDABLE"icon.ico" とし 関数で #define MYTRAY_MESSAGE (WM_APP + 1) NOTIFYICONDATA ni; int MyInitNotifyIcon(HWND hWnd) { memset(&ni, 0, sizeof(NOTIFYICONDATA)); ni.cbSize = sizeof(NOTIFYICONDATA); ni.hWnd = hWnd; ni.uID = 0; ni.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; ni.hIcon = (HICON)LoadImage(hInst, "MYICON", IMAGE_ICON, 0, 0, 0); ni.uCallbackMessage = MYTRAY_MESSAGE; strcpy(ni.szTip, " "); Shell_NotifyIcon(NIM_ADD, &ni); return 0; } icon.icoは作業用のフォルダに入れています。
51 :
50 :2006/12/17(日) 11:49:12
訂正 リソーススクリプト MYICON ICON DISCARDABLE "icon.ico"
>>40 が言う、MSDNに記述してないAPIを聞いておきたい。
テスト &ni
>>52 SC_HANDLE h = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); // ここで997
SetLastError(NO_ERROR);
CloseServiceHandle(h); // ここでも997
おもしろくもないけど2kでどうぞ
XPじゃなんともないから極度に環境に起因してるのかも知れんけど、起こりうる一例ということで
うちの2kでエラーコードログとったらどこもかしこも997ですげえ欝だった
∋ = &ni か
アイコンのサイズが合ってないんじゃね?
特殊文字のテスト
60 :
54 :2006/12/17(日) 14:28:10
ああ俺52の意味履き違えてるね MessageBoxTimeoutとか?
61 :
50 :2006/12/17(日) 14:31:20
>>56 アイコンはほかのソフトとかで使われているものでためしています。
>>57 リソースファイルはダイアロボックスも書いているのですが
ダイアロボックスは問題なく起動しています。
>>51 で書込みをしたようにアイコンの定義は書いてあります。
>>54 >>49 APIが成功したらGetLastErrorも成功値を返すとは記述されてない。
16x16に32x32のアイコン入れても無駄だって
作業用のフォルダ・・・
ni.hIcon = (HICON)GetClassLong( hWnd, GCL_HICONSM ); アプリアイコンとタスクトレイ用のアイコンが変わらないなら此でもok
あ、二行目は忘れてくれ
67 :
デフォルトの名無しさん :2006/12/17(日) 17:32:27
SendMessage(Kanojo, WM_LOVE, wParam, lParam); と、何度も彼女にメッセージを送ってみたのですが届きません。 何者かにメッセージフックされてるのでしょうか? 原因を教えて下さい ><
>>67 そのMsgは破棄されて次の処理に移ってると思われる。
多分、こんなSQLが発行されているかと。
insert into Kanojo.Manko values('HokanoOtoko','DekaiChinpo')
もうCommitされているのでRollBack不可らしい。
Update,Delete文発行してもTriggerではじかれるので無理みたい。
今年のクリスマスはあきらめれ。
#ifdef WM_LOVE #undef WM_LOVE #endif #define WM_LOVE WM_KILLFOCUS
ツマンネ
71 :
67 :2006/12/17(日) 18:12:10
>>50 そのままで出来るはず。
新規にプロジェクトを作成して、もう一度 やってみてはどうだろう?
73 :
デフォルトの名無しさん :2006/12/17(日) 18:50:53
Visual Studioでメニューの デバッグ->デバッグなしで開始 からコンソルアプリを起動すると アプリが終了するとPress any key to continueとでるのを真似したいのですがどうすればいいか分かりません CreateProcessでCREATE_NEW_CONSOLEを指定してコンソールが表示されて実行されるのですが終了すると 自動的に閉じられてしまいます コンソ-ルアプリ側のソースを変更しないで実現する方法はありますか?
api使わなくてもCの初歩でできるでしょ
大サービスだ。こんな感じだろ。 #define _WIN32_IE 0x0400 #include <windows.h> #include <shlwapi.h> int main() { STARTUPINFO si = {sizeof si}; PROCESS_INFOMATION pi; if (!CreateProcess(0, PathGetArgs(GetCommandLine()), ..., &si, &pi)) return 1; CloseHandle(pi.hThread); WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); TCHAR msg[] = TEXT("Press any key to continue"); DWORD numWrite; WriteConsole(GetStdHandle(STD_ERROR_HANDLE), msg, sizeof msg / sizeof msg[0] - 1, &numWrite, 0); return 0; }
ゴッド
77 :
73 :2006/12/17(日) 20:51:08
>>75 ソースありがとうございます
しかしながらこれだとCreateProcess呼び出し側のコンソールにPress any key to continueが表示されると思われます
今回実現したいのはCreateProcessのときCREATE_NEW_CONSOLEを指定し対象アプリを別コンソールで実行し
そのコンソールにPress any key to continueを表示するようにしたいです. 説明不足でごめんなさい
>>74 プロセス関連で使えるC標準関数はsystemとかpopenだと思うのですが
systemの場合、以下のダミーexeをCreateProcess + CREATE_NEW_CONSOLEを呼び出すことによって実現できました
popenは現在の環境(VC7.1)にはありませんでした. ありがとうございます
int main(...) {
std::string command(argv[1]);
command = "\"" + command + "\"";
system(command.c_str());
std::cout << "Press any key to continue" << std::endl;
char c; std::cin >> c;
}
>>77 75のプログラムをCREATE_NEW_CONSOLEを指定してCreateProcessすればいい。
79 :
50 :2006/12/17(日) 23:48:21
>>72 新しくやってもだめでした。
>>65 それもやってみたのですが同じ現象でした。
>>63 32x32のアイコンを使っていました。
RS-232Cシリアル通信でCTS監視有効時の WriteFileの動作仕様を知りたいです。 ・送信中ずっとCTS ON→問題なく送信される ・送信途中にCTS OFF→どうなるのでしょうか? ・1バイト送信するためには電気信号は10パルス分の時間が必要ですが、 例えば、5パルス目にCTS OFFとなった場合は、送信中の1バイト分のデータは相手に届くのでしょうか?
81 :
80 :2006/12/18(月) 00:19:05
追加です。 CTS監視有効はDCB構造体で指定しています。 (DCB.fOutxCtsFlow = TRUE; // CTS output flow control ) よろしくお願いします。
マルチスレッドうぜえええええええええええええ もう煮詰まって無理ぽsdg;lfかjf;lcz;lg;あえが 叫んでみたかったんだ
ストレス発散はド低脳スレでやれよ
責任転嫁されて可哀想なマルチスレッド‥
CreateDIBitmapを用いたBITMAPの読み込みには、GDIリソースの制限が絡む(XPではヒープ領域?)、 とのことですが、読み込みたいファイルのサイズが読み込めないほどの大きさだった場合、 どのようにすれば読み込めるようにできるでしょうか? PC環境の変更によるものよりも、プログラム側での処置ができるとうれしいです。
>>85 なんつーか、読み込めないものは読み込めないでしょ。
もし一部でもいいから読み込みたいってんなら、ビットマップのファイル
構造を自分で走査すればいい。必要な範囲だけ取り出してくることも
できるわけだし。
87 :
85 :2006/12/18(月) 10:21:54
>>86 了解です。
しかし、photoshopなんかの画像処理ソフトは大きい画像でも平気で読み込んでしまうのは
なぜなんでしょうか??
>>85 自分はプログラムは 98機で未だにやっているが、写真が 3008x2000になって
テスト出来なくて困った。jpeg解凍してサイズが大きくて98機の場合、一辺が
1500未満になるまで縮めるようにしたよ。StretchDIBits()が効かなくて初め
はなんだろうと思ったね。写真をアイコンにするために一気に 64x64 とかも
出来なかった。そのせいで画像縮小も勉強した。手間のかかることよ。
>>87 ビットマップのファイル構造を自分で走査してるから
90 :
85 :2006/12/18(月) 10:49:07
>>88 それはたいへんですね・・・。
WinFXで解決してほしいですね。
>>89 なるほど、それをすれば解決できそうですね。
ありがとうございました。
元WinFX現.Net3.0では、WindowsXP,2003,Vistaのみの対応となるので、 ある意味解決してる(w
もう98はええやろ・・・
>92 ウチでは現役だぞ…
だから何?
AdvancedWindows買ったぜwwwwwwwww これで俺も最強のプログラマだな。な?
本棚の飾りですか?
DIBSectionを使え、ということらしい。
>>95 俺も半月前に買ったくちだぜw
.NET3使って何ぼな時代に1万(1000page)の本はテンションあがるよなww
windows updateで前から出来てなかったっけ?
スレ違い
サウンドを鳴らす事はできたのですが これを2倍速で音の高さを変えないで鳴らすって事ができません。 どうすれば良いのでしょうか?
かんがえかただけ… 再生データの並びを仮に 1,2,3,4,5,6,7,8,9とする。 高速再生するときは 13579とあいだをはぶいて再生。 実際はここまで単純でなく、演算して何とかつなげる
↑ すれ違い
>103 そりゃなかなか難しい。話速変換とかで調べてみな。
108 :
103 :2006/12/19(火) 00:33:45
>>104 ,106
ありがとうございます。
とりあえずAPIへ送るデータを加工してやってみます。
109 :
104 :2006/12/19(火) 00:36:39
>>107 説明が適当すぎたね。
実際は 123456789だと表現しづらい…じゃあそんな表現するなよ俺!
123456789のそれぞれの数字はは実際のバイトじゃなくてデータの塊なのです。
各数字をたとえば0.1秒の音声データブロックと考えてください。
1秒のデータを0.5秒で再生するには間のデータを間引いてつなげるのです。
110 :
95 :2006/12/19(火) 00:56:24
>>99 俺の心理を読む奴がいるとはwwwwwwwww
買う=金欠になる事をわかっていながら頭を抱えて悩んだ末に
決死の覚悟で購入した俺はある種半狂乱状態だったんだwwwwwww
高いんだよwwwwwwwwwwww
SSL通信したいんですが
許可します
113 :
デフォルトの名無しさん :2006/12/19(火) 07:53:55
リストビューで質問があります。 リストビューに大量のアイテムデータを表示させると、やっぱりメモリはへりつづけていくものでしょうか? パフォーマンスモニタでメモリをチェックしているとへっていくばかりなので・・・ よろしくお願いします。
多かったらスクロールだろうから「表示」自体では一定以上はメモリ使わない。
115 :
デフォルトの名無しさん :2006/12/19(火) 14:47:04
くだすれC言語(初心者用)から誘導を受けてきました。 BCB6でソフトウェアキーボードを作ってみようと思うんですが、 keybd_eventのことについて全く知識がなく、検索かけてみたんですが、 あまり詳しく載っている所がありません。 加えて、文字を打ち込みたい箇所をアクティブにする操作も分からないので、 どなたか詳しく紹介されてあるページか、操作そのものを教えていただけると幸いです。。。。
>>115 keybd_eventは使うな
SendInputを使え
VOID EventKey(CONST DWORD dwKey) { INT i; INPUT inputKey[2]; for(i = 0; i < 2; i++) { inputKey[i].type = INPUT_KEYBOARD; inputKey[i].ki.wVk = (WORD)dwKey; inputKey[i].ki.wScan = (WORD)MapVirtualKey((UINT)dwKey, 0); inputKey[i].ki.time = 0; if((i % 2) == 0) { inputKey[i].ki.dwFlags = 0; } else { inputKey[i].ki.dwFlags = KEYEVENTF_KEYUP; } inputKey[i].ki.dwExtraInfo = 0; } SendInput(2, &inputKey[0], sizeof(INPUT)); return; }
118 :
50 :2006/12/19(火) 15:05:58
アイコン表示されるようになりました。 常駐プログラムを作成使用と考えているのですが winmainにダミーの親ウインドウを作り MyInitNotifyIcon関数(タスクトレイでのアイコン表示) を呼び出しています。しかし、アイコンは最初表示するのですが すぐに消えてしまいます。 何かいい方法はありますか?
keybd_eventに対するSendInputの利点って、 連続で送信する場合に、間に割り込まれることがないってこと? キーを一つだけ押したいって場合には、どちらも差はないのかな?
>>119 > Windows NT/2000/XP:This function has been superseded. Use SendInput instead.
121 :
115 :2006/12/19(火) 20:08:16
>116-117 大体理解できました。 SendInputを用いて取り組んで見ます。 ありがとうございます。
122 :
デフォルトの名無しさん :2006/12/19(火) 21:09:32
ウィンドウのサイズ変更について質問させてください。 ウィンドウスタイルでWS_POPUPを指定して作ったウィンドウで、 マウス操作でサイズを変更できるようにするために、WM_NCHITTESTでHTLEFT等 を返すようにして対応しました。この状態では旨く動きます。 ところが、WS_SYSMENUを追加するとサイズ変更ができなくなりました。 カーソルも矢印に変化しません。 どなたか、この理由か回避方法を教えてください。 指定しているウィンドウスタイルはWS_POPUPとWS_SYSMENUのみです。
不思議な現象を見つけました。 以下のプログラムx.exeでは'Enter'キーで子プロセス msgbox.exeが実行され、戻ってくるまでの間 ウィンドウをディスエーブルします。 で、すぐにmsgbox.exeを(OKボタンを押して) 終了させた場合にはx.exeはフォーカスを失います。 でもOKボタンを押すのを少し待っていると、 x.exeがグレーアウトし、その後にOKボタンを押すと x.exeはフォーカスを失いません。 これって、どういう事なんでしょうか? WinXP SP2です。 <<x.c>> #include <windows.h> void execute(HWND hwnd){ STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); EnableWindow(hwnd, FALSE); CreateProcessA(NULL, "C:\\DATA\\PROG\\WIN32\\ディスエーブル\\msgbox.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); WaitForSingleObject(pi.hProcess, INFINITE); EnableWindow(hwnd, TRUE); }
そのコードだとEnableWindow()が実際に処理される前に子プロセスが動くからだろ。
EnableWindowって非同期で動いたっけ?
127 :
124 :2006/12/20(水) 00:15:36
#pragma argsused int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE b, LPSTR c, int d){ WNDCLASSA wc; HWND hWndMain; MSG msg; ZeroMemory(&wc, sizeof(wc)); wc.lpfnWndProc = DefWindowProcA; wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND; wc.lpszClassName = "MyClass"; RegisterClassA(&wc); hWndMain = CreateWindowExA(0, "MyClass", "", WS_VISIBLE, 0, 0, 100, 100, NULL, NULL, hInstance, NULL); for(;;){ if (!IsWindow(hWndMain)){ break; } GetMessageA(&msg, NULL, 0, -1); TranslateMessage(&msg); DispatchMessageA(&msg); if (msg.message == WM_KEYDOWN){ if (msg.wParam == VK_RETURN){
>>95 ,99
こんな高い本、会社で買ったなあ…。
自分で買ったほうが真面目に読むのかもしれないだけど。
129 :
124 :2006/12/20(水) 00:17:57
execute(hWndMain); } } } return 0; } <<msgbox.c>> #include <windows.h> #pragma argsused int WINAPI WinMain(HINSTANCE a, HINSTANCE b, LPSTR c, int d){ MessageBoxA(NULL, "Hello", "msgbox.exe", MB_OK); return 0; } 改行が多すぎますエラーでなかなかうまく書けない・・・
>>119 利点っていうかSendInputに取って代わられたから
将来keybd_eventAPIがなくなる可能性があるからだろ
131 :
124 :2006/12/20(水) 00:37:56
>>123 単にWS_THICKFRAMEつけりゃいいんじゃねーの?
133 :
デフォルトの名無しさん :2006/12/20(水) 03:04:22
CreateProcessでコンソールアプリを実行して、 パイプで標準出力と標準エラーに出る文字を拾ってきたいのですが、 子プロセスが終了するまでReadFileのところで止まってしまいます。 出力途中の文字列を拾ってくるにはどうしたらいいんでしょうか。
・PeekNamedPipe使って、何バイト読めるかを事前調査し、それ以上読まない ・Overlapped構造体を指定してReadFile のお好きな方をどうぞ。
>>123 そのシステムメニューのサイズ変更は有効になってる?
>>123 WM_NCLBUTTONDOWはサイズ変更に入る場合システムメニューの状態を調べます。
システムメニューにサイズ変更をつけるか、GetSystemMenuでリセットしましょう。
>>124 x.exeがアクティブにならないのが正しいです。
メッセージループが止まって数秒後には応答なし状態になります。
そうなるとシステムがウィンドウの面倒を見るような気がします。
x.exeにWindowProcを作りその中でWM_KEYDOWNを処理すべきです。
>>130 逆に古いOSでは使えないのは、欠点(時と場合によっては致命的)。
前の人が作ったプログラム _beginthreadの戻り値のハンドルをまったくクローズしていず、 かつ、スレッド内でnewしたものを全くdeleteしていないのですが。。。 やっぱ明示的に閉じたりdeleteしたほうがいいですよね?
当たり前だ。 ATL::CHandleやboost::scoped_ptr/arrayなどは良し。
>>138 > _beginthread
_beginthreadexを使え。理由はググれ。
> スレッド内でnewしたものを全くdeleteしていない
リークであればdeleteが必要。
でもなるべくauto_ptrなどで自動化しろ。
そうか、_beginthreadのハンドルは閉じる必要がなかったな。すっかり忘れていた。
>>140 他の人が作ったものなんで。。。
>>141 いや、exは勝手に閉じてくれるけど、無印は明示的に閉じないといかんようです
_beginthread および _endthread を使用するときには、 Win32 CloseHandle API を呼び出してスレッド ハンドルを明示的に終了しないでください。
144 :
123 :2006/12/20(水) 21:56:44
>>132 デザイン的な理由でフレームを付けたくないのです。
>>135 >>138 すいません。自分の表現がマズかったです。
ShowWindow 等で行う、最大化・最小化は動作します。
そうではなく、ウィンドウの端をマウスで持ってウィンドウのサイズを
任意の大きさに変えることができないのです。
WS_THICKFRAMEが指定せず縁がないので、もともと動作しないものですが、
WM_NCHITTESTの戻り値を、こちらで縁上にあると指定することで同様の動作を
実現していました。
ところがWM_SYSMENUを追加すると、他は何も変更していないのに動かなくなりました。
WM_NCHITTEST上の数値などは変化していないので、戻り値がHTLEFT等の縁上であると
指定しても、ウィンドウズ側が旨く動作してくれないようなのです。
うろ覚えですまんけど _beginthread系は crtを動的にリンクしない方がいいとか なかったっけ
CreateThreadは使うなっていうけどなんで?
ダイアログボックスにエディットボックスをつけているのですが ダイアログボックスが表示した後にエディットボックスに書ける ようにしたいのですがどのようにすれぼいいでしょうか?
>>146 それもAdvanced Windowsに書いてあったような気がするが、たしかこんな感じ。
_beginthreadexで作ったスレッドは、CRTの初期化・終了処理がスレッドの開始・終了時に確実に行われる。
しかしCreateThreadはそれが行われない。しかしそのスレッド内でCRTの関数を呼べば、
そのときにCRTのスレッド初期化処理が自動的に行われるが、スレッドの終了処理が行われないので、メモリリークする。
ただしCRTを動的リンクしていれば、DllMainでスレッドの終了を検地できるのでリークはしないものの、
動的リンクしたとき限定であるのでお勧めできない。
CRTがそもそもわからないや もうだめだ おしまいだ しぬしかない
152 :
デフォルトの名無しさん :2006/12/20(水) 22:21:01
ググッてわかる程度の質問するなよ
そういえばCRTってなんの略? common runtimeとかC runtimeとかって思ってたけどググってもぱっとしないから間違ってる? そもそもRunTimeってのが違うか(´・ω・`)
カソードレイチューブの略だよ
>>155 調べたらおっしゃるとおりC runtimeでした スレ汚しすみません
_beginthreadが戻り値を持てないってのは何で? __cdeclと関係ある?
一度そう決めてリリースしたから。 リリースしちゃったらコロコロ変えないのがMS流。 どこぞの糞とは違う。
変なの ちなみに_beginthreadに渡す関数が__cdeclで _beginthreadexの場合は_stdcallなのは何で???
>>160 _beginthreadに渡してた関数をそのまま渡すとエラーになるようにする為とか?
>>160 CRTは原則cdeclを使っているので_beginthreadの引数の関数へのポインタもcdeclにしたのだと思う。
_beginthreadexはCreateThreadの引数に合わせて引数の関数へのポインタはstdcallにしたのだと思う。
>>161 , 162
なるほど納得しました
スレッドの中で確保したメモリをdeleteしないとどうなるか試したのですが、
スレッド終了すると一応開放されるみたいですね。
1000個くらいスレッド作って試しましたが、
deleteしてもしなくてもプロセスの使用メモリ量は変わりませんでした。
ハンドルは、exだと残ったまま、無印はクローズされるのも確認できました。
(スレッド作成前後で若干の差はありますが。。)
まあ、単純なプログラムだからうまく開放されたのかもしれませんが。
> スレッドの中で確保したメモリをdeleteしないとどうなるか試したのですが、 > スレッド終了すると一応開放されるみたいですね。 んなアホな・・・ 簡単なループまわしてみろよ
>>164 本当です。下のソースで試したのですが。。
2つの注釈をとってもとらなくても、
終了時のプロセスのメモリ使用量は変わりませんでした。
(システム全体としても変わらない感じ)
コンパイラはbcc32です
#include <process.h>
#include <stdio.h>
#include <windows.h>
#include <iostream>
unsigned __stdcall threadFunc(void* p);
using namespace std;
int main(void)
{
cin.get();
HANDLE h[1000-1];
for(int i=0;i<1000;i++)
{
h[i]=reinterpret_cast<void*>(_beginthreadex(
(void *)NULL,(unsigned)0,threadFunc,
(void *)NULL,0,(unsigned*)NULL));
//CloseHandle(h[i]);
}
cin.get();
return 0;
}
つづき unsigned __stdcall threadFunc(void* p) { char* c=new char[1024]; sprintf(c,"test"); Sleep(5000); //delete[] c; _endthreadex(0); return 0; }
頭痛が痛いぜ。 (1)全体(2つのcin.get間)を1000000回ループしてみろ (2)new char [1024]をnew char[1024*1024]にしてみろ
>>167 はじめ1万回まわしてみたのですが、
どうも1000回越えるとスレッドが作成できなくなります。
abnormal programなんたらとエラーが出ます。
new char[1024*500] で試しました(1024だとエラー)
初期状態:メモリ使用量1.3MB 仮想メモリ500K
deleteしないときのメモリ使用量21M→5M 仮想メモリ520M→ 500M
したときメモリ使用量21M→6.8M 仮想メモリ520M→ 5.7M
これは相当変わりましたね。やっぱdeleteしないと全ては開放されないんですね
(しても何か残ってる気はしますが)
すみません 下記が正しいです 初期状態:メモリ使用量1.3MB 仮想メモリ500K deleteしないときのメモリ使用量21M→11M 仮想メモリ520M→ 500M したときメモリ使用量21M→6.8M 仮想メモリ520M→ 5.7M
なんで共有のヒープに作ってんのに 一部とはいえ解放されるんだ?
解放はされてない 実メモリの割り当てが減っただけ
馬鹿ばっかりだな。だから役に立たない本が売れるのか。
ポインタを格納している変数へのポインタ(void**)って reinterpret_castとか使ってキャストできませんかね? 例えば ::CreateDIBSection(::GetDC(0), info, DIB_RGB_COLORS, (void**)&bits, 0, 0); という記述を ::CreateDIBSection(::GetDC(0), info, DIB_RGB_COLORS, reinterpret_cast<void**>(&bits), 0, 0); のように書きたいんですが、 error C2440: 'reinterpret_cast' : 'void *const *__w64 ' から 'void **' に変換できません。 と言われてしまいます。 前者はちゃんと動くんですが、他のところはC++のキャストで統一してるんで ここだけWin32API呼び出しのためだけにCのキャストを使うのは気持ち悪い・・・ スレ違いだったらごめんなさい
const_castでconst剥がしが必要なのかな。
177 :
174 :2006/12/21(木) 11:07:07
すいません、自己解決しました。 ::CreateDIBSection(::GetDC(0), info, DIB_RGB_COLORS, reinterpret_cast<void**>(bits), 0, 0); でいけるようです。
コンパイルが通っても動作的にダメだろ、それじゃ。
179 :
136 :2006/12/21(木) 13:21:26
>>123 試した結果、前言を取り消します。
WM_NCLBUTTONDOWNでSYSMENUがある場合は何かをチェックした後で
WM_SYSCOMMANDを送っていました。
SC_SIZEのフラグだけかと思ったのですが、
ウィンドウスタイルもチェックしているようです。
で、WM_NCLBUTTONDOWNで直接SC_SIZE + 方向ビットを送れば良いです。
後、WM_SETCURSORも細工必要です。
180 :
123 :2006/12/21(木) 16:08:23
>>179 まだ実装はしていないですが、できそうです。
ありがぞうございました!
自分は、端にカーソルがあったらWM_SETCURSORでカーソルを変更
次にドラッグされたらWM_SYSCOMMANDにSC_SIZEや方向ビットを送ることで
サイズを変更するという流れで対応させました。
リッチエディットを作成する際に、"RICHEDIT" ではうまくいくのですが、 RICHEDIT_CLASS を作成すると、英数字のフォントが太くなってしまいます。 日本語はいつもの表示がされます。 MSゴシックに変えてみたりしたのですが、うまくいきません。 どうすれば、いつものフォントになるのでしょうか? 環境はVS2005Expressです 以下嫌なフォントのリッチエディット作成するソース HMODULE hRtLib; HWND hEdit; /* メッセージクラッカ */ BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct) { hRtLib = LoadLibrary(_T("Riched20.dll")); hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, RICHEDIT_CLASS, _T(""), WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | WS_HSCROLL | WS_VSCROLL | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_NOHIDESEL, 0, 0, 200, 200, hwnd, (HMENU)10, lpCreateStruct->hInstance, NULL); return (TRUE); }
メインスレッドで生成したhWndに対して、別スレッドからPostMessage()すると、 そのメッセージはメインスレッドで受け取られる? それともPostしたスレッド??
めいそすっどれ
うーん、普通に考えたら、それが当たり前ですよね・・・ なんか別スレッドからPostMessageして 受け取ったウィンドウでMessageBox表示すると MessageBoxが表示されずにモーダル状態になって ウィンドウが固まっちゃう現象に悩んでます・・・
デッドロックしてるんだろ。排他処理している部分を見直す!
>>134 FILE_FLAG_OVERLAPPED付きでCreatePipeできるの?
数百バイトのヘッダに数ギガバイトのデータがくっ付いたバイナリファイルがあります。 ここからヘッダを素早く取り除く方法はありますか?
ない
189 :
181 :2006/12/22(金) 01:55:24
調べが足りませんでした。 問題の英数のフォント名 Arial で検索したところ、解決しました。 LONG LangOptions; LangOptions = SendMessage(hEdit, EM_GETLANGOPTIONS, 0, 0); LangOptions &= ~IMF_DUALFONT; SendMessage(hEdit, EM_SETLANGOPTIONS, 0, (LPARAM)LangOptions); これで期待通りの動作をしてくれました。
190 :
デフォルトの名無しさん :2006/12/22(金) 05:35:08
すみません質問があります。 SHELL32.DLLにスマートメディアなどの(ドライブ関係)アイコンがはいっているみたいなのですが、 はいっていませんでした。 ドライブ関係のアイコンどこにあるか教えてください。 VAIO WIndowsXPを使用しています
191 :
デフォルトの名無しさん :2006/12/22(金) 07:40:15
リソースにバージョンがありますが、 このリソースに書いた情報を、プログラムから読むにはどうしたらいいんでしょうか?
バージョン限定でいいなら GetFileVersionInfo()
>>195 すまねえ… post だと投げる側は即座に処理戻ってこれるな。
SetWindowText() なんかも最終的には SendMessage に還元されるから 排他処理には気をつかう…
SendMessageCallbackやSendNotifyMessageなど、 PostとSendの間くらいのものもある。
メニューの選択肢に'&'という文字を出すにはどうすればいいんですか?
201 :
デフォルトの名無しさん :2006/12/23(土) 01:15:44
zip の圧縮、伸張をするにはどうすればよかですか?
203 :
デフォルトの名無しさん :2006/12/23(土) 01:44:57
MCIでmpg動画を再生したいのですが、音声だけ流れて映像がでてきません。何がいけないのでしょうか。 static MCI_PLAY_PARMS mpp; static MCI_ANIM_OPEN_PARMS mop; mop.dwCallback = (DWORD)hw; mop.lpstrElementName = OPENING_MOVIE; mop.dwStyle = WS_CHILD | WS_VISIBLE; mop.hWndParent = hw; iErr = mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_ANIM_OPEN_PARENT | MCI_ANIM_OPEN_WS, (DWORD)&mop ); if(iErr){ mciGetErrorString(iErr,err,lstrlen(err)); MessageBox(hw,err,NULL,MB_OK); return -1; } mpp.dwCallback = (DWORD)hw; mciSendCommand(mop.wDeviceID, MCI_PLAY, 0, (DWORD)&mpp);
204 :
デフォルトの名無しさん :2006/12/23(土) 01:47:02
hwはメインウィンドウのHWND、OPENING_MOVIEはmpg動画ファイルのアドレスのマクロです
205 :
デフォルトの名無しさん :2006/12/23(土) 03:16:43
>>193 だけど、エクスプローラで表示しているかっこいいドライブアイコン
はなかったです、古いドライブアイコンならありますた。
>>205 ショートカットの「アイコンの変更」でshell32.dllのアイコンを覗いてみろ。
あー、店頭でVAIO覗いてみたことがあるけど、 確か見たことも無いアイコンが使われていた記憶がある もしかしてVAIO独自のを用意しているのがあるんじゃないかな? ショートカット作成→アイコン変更でみれるか忘れたが、 見れないようならIconSetXPとかで見れるはず
208 :
デフォルトの名無しさん :2006/12/23(土) 06:55:23
>>206 >>207 ありがとうございました(^0^)。IconSetXPで見るとありました。
どうやらWIN95時代のアイコン一覧のフリーソフトつかってたから
全部のアイコン一覧がでてこなかったかも??
で、GetDriveType()ではフラッシュとかメモリースティックとかまで
わからないけど、みんなどうやって判別するんですか?
ひとつのウインドウに複数のホットキーを登録することはできるのでしょうか?
ローカルに超簡易HTTPサーバーを建てるプログラムを作りたいのですが どこから手を付けて良いの変わりません・・・ 機能的には、ポート指定ができて、そのサーバーのdocumentroot配下の テキストファイルがブラウザから見られる程度で良いのですが・・・
スレ違い
>>210 C#のサンプルにそういうのがあったと思うよ
あとスレ違い
>>210 どこぞのウィルスに感染するといいと思うよ
あとスレ違い
GetPrivateProfileIntで 0x004000AA とかのアドレスを取得したいんですが AAの16進が文字列として認識されて取得できません。 こういう場合どうすればいいんでしょうか ;ini例 [ADDRESS] Addr=004000AA
レジストリに書き込んだやつに聞けよ
GetPrivateProfileStringで取得してstrtolで変換
217 :
214 :2006/12/23(土) 13:12:27
ありがとうございます。
API風にいうとStrToIntExじゃね?普通
8進か
16進だろw
>>218 0xが付いてないと(つまり
>>214 の形式だと)16進数は変換できなくね?
strtolなら第三引数で指定できる。まあ確かにスレ違いだけど
GetPrivateProfileStringも紹介してるってことで勘弁してちょ
レジストリに書き込んだやつがアホ
2度も書いてるけど
>>214 へのレス?
GetPrivateProfileIntはiniから読み取るAPIだけどレジストリと何の関係があるの?
個人的にレジストリ使うの嫌だけどな俺は ヘビーユーザの立場から見るとレジストリ弄られるのは気持ち良くない だったらini管理に俺はするんだが
日本語が不自由なら帰れよ
>>224 だからレジストリの話なんて誰もしてないだろって
逆にこう考えるんだ 2つの話題が交錯しているだけ、と
GetPrivateProfileInt の検索結果 約 17,300 件中 1 - 10 件目 (0.12 秒) GetPrivateProfileIntGetPrivateProfileInt 関数は、大文字と小文字を区別しません。 lpAppName と lpKeyName の各パラメータが指す文字列では、大文字と小文字の ... このような状況では、GetPrivateProfileInt 関数は .ini ファイルではなくレジストリから情報を取得します。 ... msdn.microsoft.com/library/ja/jpsysinf/html/_win32_getprivateprofileint.asp?frame=true - 17k - キャッシュ - 関連ページ
そんなくだらないことに執着するのは、アホといわれてよっぽどくやしかったんだな
Addr=0x004000AAだったら、GetPrivateProfileIntで直接読めるよ。
簡単なテキスト処理すら自分でできないやつが多いな
再利用した方が読む側もわかりやすいだろ? 無能ニートは糞ひって寝てろ
自称ヘビーユーザーはお帰りください
GetPrivateProfileIntで直接読めるようになってればいいだけだな
236 :
233 :2006/12/23(土) 16:37:31
ごめん。 言い過ぎた。
mciで音声再生するデバイスをプライマリ以外に選べますでしょうか? DirectSoundだとDirectSoundEnumerateで繋がってるサウンドカードの 一覧が取得できるのですが、mciではやり方が見つけられませんでした。 知ってる方居たらお願いします。
238 :
201 :2006/12/23(土) 20:00:38
WinXP以降ではシステムでZIPの伸張・圧縮がサポートされているかと思い、 それに伴うAPI]が提供されているかと考えていたのですが、、、、 そうでもないのでしょうか? APIがあるなら 伸張する関数名 。 APIがないなら ない とお答え頂ければ幸いです。
”無い”を証明するのは不可能に等しい by 悪魔の証明
zipfldr.dll RouteTheCall
>>238 何かかっこいい名前のライブラリだったような気がするけど、
忘れた。
その代わりと言っちゃなんだが、シェル方面からアプローチしたら
行けるんじゃないか?
243 :
242 :2006/12/23(土) 23:27:59
zipfldr.dllはCOMコンポーネントなので普通に使えるはずだろう
(´-`).。oO(つーか無難にzlibとか使えよ・・・・・・・・・)
確かにzlibとか選択肢はあるけど、セキュリティホールが出た場合 WindowsUpdateと言う手段が無いだろ。 流石にお客に「自前でzlib調達してなんとかしる」なんて言えねー。
zlibとかをアプリに同梱すれば何の問題もないだろ
VisualStudio の入力候補リストみたいに、 ウィンドウ外にも描画されるリストはどのように作成するのでしょうか? 普通に親ウィンドウを指定してリストを作成すると、 ウィンドウ内に描画され、はみ出た場合スクロールしなければいけなくなります。 +-------------+ | | | | | +-----+ | | |リスト | | +-------------+ 今のままでは、スクロールしなければいけいない +-------------+ | | | | | +-----+ | | |リスト | | +--| |---+ .| | +------+ VSはウィンドウの外にリストが表示される
>>248 分からんけどVSは独自にウィンドウ出してるだけじゃないかなあ。
何使ってるかSPYで調べてみたらいいんじゃない。
只の Owned Window では無いの?
>>248 VsCompletorPaneっていうクラス名のウィンドウを出してる。確認してみよ。
253 :
248 :2006/12/24(日) 01:59:34
いろいろ試してみます。 ありがとうございました。
254 :
199 :2006/12/24(日) 02:36:41
ありがとうございました。
255 :
デフォルトの名無しさん :2006/12/24(日) 02:44:18
スレッドが実行中かどうか調べられるAPIありますか? SuspendThreadやResumeThreadの戻り値であるサスペンドカウントを スレッドの状態を変えることなく調べたいです
256 :
201 :2006/12/24(日) 04:09:58
zipfldr.dll は使い方がよくわからなかったので zlib を使うことにしました。 お答え頂いた方々、ありがとうございました。
>>255 WaitForSingleObject
>>257 WaitForSingleObjectはスレッドが終了したかどうかの判定には使えるけど
実行中か一時停止中(SuspendThreadなどによる)かの判定には使えない希ガス
( ´,_ゝ`)プッ ねーのかよ
そうすると.netのSystem.Threading.Thread.ThreadStateはどうやって提供されてるんだ? 秘蔵のAPIってやつ?
263 :
デフォルトの名無しさん :2006/12/24(日) 14:00:29
CSliderCtrlでスライダーのページエリア(?)をクリックするとページサイズだけそちらに移動しますよね? そうじゃなくてクリックした位置にジャンプして欲しいのですが、どのようにやったらよいか教えていただけますか? よろしくお願いします
264 :
255 :2006/12/24(日) 14:36:41
GetThreadContextって関数の説明に You cannot get a valid context for a running thread. Use the SuspendThread function to suspend the thread before calling GetThreadContext. って書いてあってこれを利用したらいけるかと思ったらSuspendThread呼び出さなくても成功しちゃってるorz
1CPUだったら必ず成功する気がせんでもない
アプリケーション自身がアクティブかどうかって、どうやって判断するんだっけ・・・
BOOL __stdcall AmIActive?(void)
>>263 やったことないが、pageup/downが来たらマウスの位置調べてthumbtrack投げなおすとかどう?
>>266 (1)フォアグラウンドウィンドウが自プロセスのものかどうかを見る
(2)WM_ACTIVATEAPPだかなんだかを拾う
のどちらかじゃねえかな
他に簡単な手があったら教えて
270 :
266 :2006/12/24(日) 16:46:03
これでできたっぽいっす GetActiveWindow() == GetTopLevelWindow(hWnd)
いまだに__stdcallの意味が理解できない俺
おれも
じゃあ __pascal と __cdecl はわかるのか
274 :
271 :2006/12/24(日) 18:26:54
わからないぜw ただpascalは16ビット時代のなんちゃらって記憶がかすかに cdeclはランタイムライブラリ? わかんねwwwwwwww
275 :
271 :2006/12/24(日) 18:27:29
クリスマスに俺何してんだろうなorz
>>274 引数の積み方と後処理をどっちでやるか、という話
277 :
255 :2006/12/24(日) 18:51:14
GetThreadTimesって関数見つけたんですけどSleep(0)くらいじゃ変化なしorz bool is_run(HANDLE h) { FILETIME create, exit, kernel1, kernel2, user; GetThreadTimes(h, &create, &exit, &kernel1, &user); Sleep(0); GetThreadTimes(h, &create, &exit, &kernel2, &user); returnkernel1.dwLowDateTime != kernel2.dwLowDateTime || kernel1.dwHighDateTime!=kernel2.dwHighDateTime; }
手段が目的に変わりつつある予感。 サスペンドカウントを調べたい理由って何?
279 :
255 :2006/12/24(日) 19:07:11
>>278 プロセスのHANDLEをラップしたクラスを作ってます
>>279 だからなんでそんなのを作ってんだよって話なわけだが。
282 :
255 :2006/12/24(日) 20:50:51
ビールスを作ってます
>271 呼出規約でぐぐれ パラメータの渡し方とスタックのクリーンアップの責任の所在
>>268 ありがとうございます。
やってみます。
>271 シグネチャの不一致を利用した地味で効果的な嫌がらせ
ごちゃごちゃ言ってるとNearポインタ&Farポインタ復活さすぞ!
ごめんなさいもうしないので許して
変声機を作りたいのですが、どなたかそれに関しての良いAPIを知っていますでしょうか。
APIつーか、SDKのサンプルに無かったっけ
なんちゃってエクスプローラを作るのですが、 普通のエクスプローラの様に、 デスクトップ マイ ドキュメント マイ コンピュータ A: C: H: コントロール パネル マイ ネットワーク ゴミ箱 : のリストを列挙する関数とかあります? あるなら、その関数名を教えてください・・・
SHGetDesktopFolder 名前の通りデスクトップ(へのインタフェース)を返す。
294 :
291 :2006/12/25(月) 18:26:27
x64では呼び出し規約が統一されてめでたい限り。 というかもともとx86以外は1つしかないんだけど(x86のみ過去とのしがらみで ごちゃごちゃあった)
296 :
124 :2006/12/26(火) 00:58:00
ええと、ヘンなコードだったかもしれないですが EnableWindowはそれほど関係なかったみたいです。 x.cをこういうのにしてみたら、結局同じような現象が起きます。 ただ、戻ってきてもディスエーブルされなくなりましたが・・・ WaitForSingleObjectの間にシステムから ウィンドウプロシージャが呼び出されてるのか、と思って チェック用のBeepを入れてみたんですが鳴りません。 少し時間を置いた時にディスエーブルになる、 というが何とも不思議・・・ システムが2つのウィンドウが同時にイネーブルにならないように 定期的にチェックしているのだろうか? <<x.c>> #include <windows.h> void execute(HWND hwnd){ STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); CreateProcessA(NULL, "C:\\DATA\\PROG\\WIN32\\ディスエーブル\\msgbox.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); WaitForSingleObject(pi.hProcess, INFINITE); } LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ LRESULT lr; Beep(200, 100); lr = DefWindowProcA(hWnd, uMsg, wParam, lParam); return lr;
297 :
124 :2006/12/26(火) 00:59:07
124 #pragma argsused int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE b, LPSTR c, int d){ WNDCLASSA wc; HWND hWndMain; MSG msg; ZeroMemory(&wc, sizeof(wc)); wc.lpfnWndProc = MyWindowProc; wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND; wc.lpszClassName = "MyClass"; RegisterClassA(&wc); hWndMain = CreateWindowExA(0, "MyClass", "", WS_VISIBLE | WS_SYSMENU, 0, 0, 100, 100, NULL, NULL, hInstance, NULL); for(;;){ if (!IsWindow(hWndMain)){ break; } GetMessageA(&msg, NULL, 0, -1); TranslateMessage(&msg); DispatchMessageA(&msg); if (msg.message == WM_KEYDOWN){ if (msg.wParam == VK_RETURN){ execute(hWndMain); } } } return 0; }
>ディスエーブル >イネーブル それはギャグで言っているのか。
ほんとはなんて読むの?
エナブレ ディサブレ
301 :
デフォルトの名無しさん :2006/12/26(火) 01:24:05
ディスエーブル、イネーブルであってるぞ?
カタカナに直すより原語表記か和訳の方が*俺*は見やすい。
メッセージループを止めた状態をディスエイブルとは呼ばない。
タスクマネジャで状態を監視し、応答なしの場合、 他のアプリケーションウィンドウをかぶせてぐりぐりしてみる。 -->フレームが再描画描されるならゴーストが出来ている
いねぼー ディせーぼー
306 :
デフォルトの名無しさん :2006/12/26(火) 05:55:57
最近、マウスをダブルクリックするとパソコンから猫の鳴き声 みたいなのが聞こえてきます(キッキッみたいな感じ) 猫の鳴き声を消すAPI教えてください
ニャー
ディセーブルキャットサウンド(フォールス);
>>306 ExitWindowsEx(EWX_POWEROFF, 0)
KillCats( lpCATS );
case WM_KILLCATS: /* :P */ return (0);
312 :
デフォルトの名無しさん :2006/12/26(火) 11:15:58
>>308 ディセーーーーブルをファルセだと有効になるにゃん
CDからCD-TEXTを読み出す方法を教えてください Win32APIでできませんか?
できる
どうやって?
ググレ
質問するとこなんだから、知ってるんなら答えてやればいいじゃん 俺ぁ知らんけど
普通に↓とかでは。 fopen("E\hoge.txt", "r");
>>319 ちょwwwCD-TEXTの意味わかってるかwww
気になったからググって見たが「CD-TEXT API」だのじゃそれらしい情報も見当たらんなぁ
red book
ドライブによって読めたり読めなかったりするとこみると ASPIドライバ直接呼ぶんじゃね?
ぶっちゃけ
>>1 に書いてある通りにすれば20秒で見つかる件について
なんだよAPIドライバってw
>>313 DeviceIoControlを使え。
それ以上はWin32apiでは無いので。
330 :
デフォルトの名無しさん :2006/12/26(火) 18:05:44
何でもクラス化するのが好きな俺ですがウィンドウシステムを サブクラス化するときにSetWindowLongにメンバ関数をいれる ことが出来なくなってしまいました。?
エスパーの方出番です
334 :
デフォルトの名無しさん :2006/12/26(火) 18:38:57
使用しているPCが。Windows日本語版かどうかを判別することはできますでしょうか? VC++6.0です。
>>334 何を要求しているかわからないけど、
GetSystemDefaultLangIDとかじゃだめ?
LCIDを求めるんじゃなく?
336 :
330 :2006/12/26(火) 20:15:45
>>333 それです!。
私の文が読みにくかったけど答えてくれてありがとうございます!!。
337 :
デフォルトの名無しさん :2006/12/26(火) 21:42:38
SDKのプログラミングでグリッドコントロール(読み取り専用でよい)を使うにはどうすればいいですか? リストビューを使うのでしょうか? XP、VC6
はい
他にはそういったコントロールは用意されていないのでしょうか?
1. リストビュー 2. Excelワークシート 3. 自作
やはりリストビューですか。自作できるほどのスキルはありませんし。 MSFlexGridというのはVB用ですか?
技術的にはVC++でも使えるはず。 ライセンスがどうなっているか俺は知らないから、適当に調べてくれ。
ダイアログエディタでMsFlexGridを貼り付けるところまでは出来ました。 実行すると表示されませんけど。
やっぱりリストビューでなんとか頑張ります
>>344 MFCスレで、CListCtrlをレポート形式で扱う方法を質問したほうがいいかもね。
MFC(笑)
VS2005でのMFCへの対応を見ると笑われてもしょうがない気がするけど 作るのに最低一ヶ月は要するようなWindowsアプリを作る場合、みんな どのライブラリ使ってるの?
>>348 UIなら、WTLを使ってます。MFCは今更使わないです。
おれ描画能力とかいらんアプリしかつくんないからC#でつくる。
open source に dot netですか。 ぐぐってちょっとソース見た限りMFCと似てる気がするけど、ちょっとWTLで遊んでみるね。 ありがとう >349-350
GDI+で日本語のOpenTypeフォントは使えないんですか? まさか流石にそんなことないと思いますが、自分の環境だと使えなかったので、質問してみます。
353 :
334 :2006/12/27(水) 11:04:57
>>335 言語IDを取得できました。
ありがとうございました。
>>352 Font名を指定するタイプのコンストラクタを使うと
でたらめのフォントを作って平然としてるっぽい。
LOGFONTを受け取る方のコンストラクタに、GDIで作った
Fontから取り出したLOGFONT構造体を渡してみたら
TrueTypeじゃないというエラーになった。
駄目なのかもね。
>>352 FontFamily::GetFamilies でも OpenTypeのフォントは出てこないな。
356 :
306 :2006/12/27(水) 11:49:17
>>307-3012 ありがとうございました。ドライバーで本体を分解したところ
子猫がでてきました。解決しました
(´Д`;)無理
呼んだ?
先生方に質問です! デスクトップなどから(マウスクリックなど普通の方法で)アプリケーションを起動するとき、 WinXPだとAPIフックで、explorer.exeからCreateProcess(W)が呼ばれているのが検知できますが、 Win2Kだと同じコードでも監視に引っかかりません。 madCodeHookライブラリのサンプルではWinExecとCreateProcessで監視に成功しているようなので、 呼ばれていないわけではないと思うのですが、 Win2Kでプロセスの起動を監視するのはXpとは違う細工が必要なんでしょうか? (2kはVMPlayer上ですけど権限は両方adminで、MessageBoxなどはちゃんと検知出来てます)
APIってバッファのサイズを指定しないといけないのが いっぱいありますけど、あれはなんで必要なんでしょうか? 自分で関数作るときにはやったことないんですが。
ばっふぁおーばーふろーしたらこまるでしょ
パターン1 引数に大きさを渡すやつ APIを呼ぶ言語が C/C++ とは限らないから。 パターン2 構造体に構造体の大きさを必要とするメンバを持つやつ 構造体サイズでバージョン分けするトリックをかますため。
配列.lengthが使えるって便利だよな
その場合、配列.num[i]とかやらなくても大丈夫?
>>364 1の場合は、むしろCのため。
C++ならどうにでもできるが、どうにもしていない(== Cとして使っている)やつも多いと思う。
368 :
364 :2006/12/27(水) 17:25:14
>>367 ごめん そのとおりだわ。
APIは呼ばれる言語が確定的でないから、できる限り低級な言語で呼び出せるように設計されている
+ばっふぁおーばーふろー対策
ってことだね
べんきょうになるなぁ
質問させてください。 Overlappedを使った(非同期?重複?)なI/Oを使う場合、 メモリ上にどんどんリクエストがキューイングされていって、 バックグラウンドで逐次実行されている、みたいな感じで理解しているのですが、 これで正しいのでしょうか? 処理の完了を気にせず、ボコボコ連続でWriteFile()なんかをしても OSが後で仕事しといてくれる、みたいな。
>>370 おりはそう認識してる。
DebugViewでトレースできるんだっけ?
> でたらめのフォントを作って平然としてるっぽい。 CreateFontの仕様そのまんまなのか > 処理の完了を気にせず、ボコボコ連続でWriteFile()なんかをしても 前の完了は待たないとエラーが起きたとか一部しか書けなかった場合に まずいんじゃ?
ものすごーく初歩的なことだろうと思うのですが、 ダイアログにIDOKという名前のボタンがあって これのハンドルを取得するにはどうすればいいんでしょうか? VC++ & SDK
英語読めない奴はプログラマ辞めちまえ
>>371 レスどうもです。トレースの話は初耳かもしれません。
>>372 確かにそうなんですが、そもそも「リクエストを溜めてくれるのか」が
いまいちハッキリしなかったもので…
どうせなら非同期処理を頼んだ時の成否で判断、ぐらい楽したいですね。
渡した送信バッファ消しちゃったりした時にえらいことになるんでしょうけど。
APIフックってLoadLibrary関連とGetProcAddressのフックしないとできないんでしょうか?
日本語でおk
>>378 > どうせなら非同期処理を頼んだ時の成否で判断、ぐらい楽したいですね。
エラーが起きたかどうかの判断には時間がかかるかもしれないから
頼んだ時点ではすべて判定できないよ
なんでGetProcAddressをフックする必要があるのか。 APIフックっていうのは本来のAPIの処理を横取りする手法の事。 IAT書き換えとかDLLExportTableの書き換えとかラッパプログラミングとか APIフックを実現するための方法はいくらでもある。
384 :
373 :2006/12/28(木) 09:26:16
"コントロールのハンドル"で検索して答えを見つけました キタ━(゚∀゚)━ ← GetDlgItem(ダイアログのハンドル, IDOKとか);
advanced 嫁と
>>1 が申しております
単純に、フックを回避してコールされるのを防ぐだけって書いてあるだろうが
386 :
デフォルトの名無しさん :2006/12/28(木) 10:25:51
流れをぶった切ってスマソ EnumWindowsで取得したハンドルのプロセス、また実行パスを 取得する方法はありますか? 宜しくお願いします。
>>380 GetProcAddressのフックの必要性を判断できない程度の能力しか無いなら
APIフックなんて危険だから使わない方がいいよ
>>386 GetWindowThreadProcessId
GetWindowModuleFileName
389 :
デフォルトの名無しさん :2006/12/28(木) 10:49:14
>>388 ありがd。
その二つで試しているのですが、取得できるものとできないものがあり
こまっていますた。
もう少し、ぐぐってみます。
MSがA/Wのマクロ化だけじゃなくてchar/wchar_tもサポートしてくれてたら ちょっとだけ楽だよなぁと思う年の瀬 #ifdef UNICODE LoadLibrary(arg) LoadLibraryW(TEXT(arg)) #else LoadLibrary(arg) LoadLibraryA(TEXT(arg)) #endif
おまえは何がやりたいんだ?
多分 API と STL の共存で std::string 周辺の UNICODE マクロ対応あたりかと…
#ifdef UNICODE typedef std::wstring string; #else typedef std::string string; #endif じゃだめなのか?
inline HMODULE LoadLibrary(LPCSTR p) { return ::LoadLibraryA(p); } inline HMODULE LoadLibrary(LPCWSTR p) { return ::LoadLibraryW(p); } こんなんなってくれてるとありがたいんだが。
要はwindows.hppなんかが欲しいのか。 うっかりLoadLibrary("hoge")とLoadLibrary(L"hoge")が 混在する可能性もあってお勧めできないな。 NT系は内部WCSだから、ANSI/MBCS版のAPI呼ぶと 中で文字型変換されるからオーバーヘッドが発生するし。 結局TEXTマクロ使うのが一番いいと俺は思う。
>>361 Windows 2000 の SP3 以降(だったっけ?)だと、
互換モードの機能で Explorer の IAT がすでに aclayers.dll の関数に
上書きされてたりする場合があったようななかったような…
SP2だお
>>396 いま確認したら激しくアタリです
仮想マシンで開発環境なんて動かせねえし(ライセンス問題もあるし)
どうあがいても年内に解決できる問題ではありません orz
ほんとうにありがとうございました
と思ったけどjmpの書き換えでなんとかなるっぽい(たぶん ともあれ、どうもです
LoadLibrary(_T("hoge.dll")); と書くことに 何の不満があるのか分らない。 こうすりゃ、A/W どっちでも適応できるべ。
401 :
400 :2006/12/28(木) 16:27:57
リロードしてなかった。すまん。
template<typename Char> void foo(const Char* p)
{
・・・
// Charがcharの場合はA版、wchar_tの場合はW版のAPIを呼びたい
・・・
}
こんなとき
>>394 みたいなのを用意しないといけないのが面倒くさいよね。
もうAは要らんやろ・・・
工工エエエ(´д`)エエエ工工
フックを勉強しているのですが、下記の例ではIEの最小化ボタンを押下すると イベントが始まります、これをCtrl+Fが押下された時にフックをかけるように するにはどのように書いたらいいでしょうか? // フックするプロシジャー LRESULT CALLBACK MyCallWndProc(int nCode,WPARAM wParam,LPARAM lParam) { CWPSTRUCT* lp = (CWPSTRUCT*)lParam; if( nCode == HC_ACTION ){ switch (lp->message){ case WM_SYSCOMMAND: if ( lp->wParam == SC_MINIMIZE ){ MessageBox( NULL , "IEを最小化するメッセージの送出2","確認" , MB_OK | MB_TOPMOST ); lp->wParam = 0; lp->message = WM_CLOSE; } break; } } if ( lp->message == WM_SYSCOMMAND && lp->wParam == SC_MINIMIZE ) lp->message = WM_CLOSE; return CallNextHookEx(g_hHookWnd, nCode, wParam, lParam); //次のフックを呼ぶ }
実際Windows CEではとっくの昔に全廃したし。
>>389 GetWindowModuleFileNameはNT系では他プロセスが作成したウィンドウには使えない
GetWindowThreadProcessIdが失敗することはないはず。
408 :
407 :2006/12/28(木) 20:02:49
スレ間違い 気にしないで
Win32 :FARPROC GetProcAddress( HMODULE hModule, LPCSTR lpProcName); WinCE:FARPROC GetProcAddress( HMODULE hModule, LPCWSTR lpProcName);
空気読まずに書きこ NT EnumProcesses->EnumProcessModules 9X CreateToolhelp32Snapshot->Module32First->Module32Next の使い分けとか? だめかなぁ
おまけ WinCE version 3.0 and later:FARPROC GetProcAddressA( HMODULE hModule, LPCSTR lpProcName);
>>393 typedef std::basic_string<TCHAR> string;じゃだめなのか?
>>404 MSLU
413 :
デフォルトの名無しさん :2006/12/28(木) 20:43:11
複数のスクロールバーがある場合 どのバーを動かしたのかを調べるにはどうしたらよいのでしょうか?? よろしくお願いします。
どんな環境での話か書いてくれよ。 WindowsならWindowsとかさ。
>>405 です
お願いします、これだとコンパイルは通るのですが無反応なのですが・・・・・・
どうしたらいいでしょうか、よろしくオナガイシマス
// フックするプロシジャー
LRESULT CALLBACK MyCallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(( GetKeyState( VK_CONTROL ) & 0x80 ) > 0)
{
MessageBeep(0xffffffff); //ビープ
}
return CallNextHookEx(g_hHookWnd, nCode, wParam, lParam); //次のフックを呼ぶ
}
417 :
413 :2006/12/28(木) 21:08:20
どうもすいません。 環境はWindowsでVisualStudioを使ってC++で書いてます。
>>416 ×MessageBeep(0xffffffff); //ビープ
○MessageBox( NULL , "IEを最小化するメッセージの送出2","確認" , MB_OK | MB_TOPMOST );
です、スマソ
ただ単にキーボードフック(WH_KEYBOARD)にすればいいだけじゃないの?
WH_GETMESSAGEのほうが汎用性あるだろ
>>416 >GetKeyState( VK_CONTROL ) & 0x80
GetKeyStateの返り値は16bitでわ?
422 :
421 :2006/12/28(木) 21:52:55
それと省いているみたいだけど、FキーのメッセージをチェックしてからCtrlキーのチェックだよね…
405=416=418です
よろしくです
>>421 MSDNを見ますと返り値はintなので16ビットだとおもいますが、まずいですか?
>>422 逆で、CtrlをチェックしてからFキーのチェックです
またフックの話題かよ そんなにおまえらは何をフックしたいんだ
個人的にはかわいい娘か、技術系の会話のできるかわいい娘をf(ry
intが16bitっていつの時代の人間だ?
>>417 WM_VSCROLLかWM_HSCROLLのhwndScrollBarはスクロールバーのウィンドウハンドル。
それをGetDlgCtrlID関数を利用してIDに変換。
なお、IDはCreateWindowのhmenu。
>( GetKeyState( VK_CONTROL ) & 0x80 ) > 0 本気でこれで Ctrl と F が押下されているかの判定になると思っているのか。
フックが苦手なんですが、どうすれば強烈なフックが撃てますか?
>>431 腕だけでなく、腰を捻ってチカラを貯めこんで打つべし
これならばと思い試していますが今だに解決できません、コンパイルでエラーが出れば いいのですが・・・・ 下記のコードで悪いところを指摘してもらえませんか、タノンマス // フックするプロシジャー LRESULT CALLBACK MyCallWndProc(int nCode,WPARAM wParam,LPARAM lParam) { CWPSTRUCT* lp = (CWPSTRUCT*)lParam; if( nCode == HC_ACTION ){ switch (lp->message){ case WM_KEYDOWN: if( wParam == 0x46 ) // このメッセージがFキーのものか { if( GetKeyState( VK_CONTROL ) & 0x46 ) // Ctrlキーが押されているか { MessageBox( NULL ,CTRL+Fだ "ゴ━━━━(# ゚Д゚)━━━━ルァ!","確認" , MB_OK | MB_TOPMOST ); lp->wParam = 0; return 0; //lp->message = WM_CLOSE; } } break; } } return CallNextHookEx(g_hHookWnd, nCode, wParam, lParam); //次のフックを呼ぶ }
>GetKeyState( VK_CONTROL ) & 0x46 GetKeyState の説明をもう一度読み直せ。
435 :
デフォルトの名無しさん :2006/12/29(金) 01:58:58
しばしば VirtualProtectEx を実行してもアクセス保護が変更されない気がします 戻り値は1が返されてOldProtectは0なのに、直後にVirtualQueryExで調べると PAGE_EXECUTE_WRITECOPYを返してきて矛盾しちゃってます
>>433 です
>>GetKeyState の説明をもう一度読み直せ。
if( wParam == 0x46 )
{
if( GetKeyState( VK_CONTROL ) & 0x80 )
読んでこうしてみましたが・・・・・なぜ悪いのか
それからここの書き方は間違っていませんでしょうか?
CWPSTRUCT* lp = (CWPSTRUCT*)lParam;
>>437 433は間違えていました、0x46はASCIIのFのことです
>>438 >GetKeyState( VK_CONTROL ) & 0x80
ここはCtrlキーの判定だろ。
Fキーは関係無い。
GetKeyStateの *戻り値* の説明を読んで来い。
WH_CALLWNDPROC でWM_KEYDOWN 拾えたんだっけ?
たぶん「最上位ビットが 1 」なSHORTは2進数で1000000000000000 16進数で0x8000て感じで GetKeyState( VK_CONTROL ) & 0x80 て書いたんだとおもた
443 :
デフォルトの名無しさん :2006/12/29(金) 03:00:34
何でそんなに遠回しに教えるんだ? 普通に回答教えれば一発で解って、教える側も教わる側も気持ち良く終われるのに
445 :
435 :2006/12/29(金) 03:14:40
いくつか解説まわってみたが GetKeyState(VK_CONTROL) < 0 という書き方のほうが一般的みたいな感じだった ってことで435もよろしくお願いします
API の文字列関数に strstr の API 版が無いですが、 みなさんはどのように検索していますか?
447 :
446 :2006/12/29(金) 06:41:00
すいません、C言語に限定された話です。
開発中に見つけた不具合 以下のようなGetIconInfoを数ミリ秒毎に呼ぶルーチンがあるのですが、 OnTimer(){ ... ICONINFO iconinfo; GetIconInfo(hicon, &iconinfo); } どうもこのAPIがメモリリークを起こしているらしく、 数万回呼び出された時点でアプリケーション毎に割り当てられる GUI領域のメモリを使い切って画面表示に不具合を発生させました。 環境はVS2005です。 APIのバグでしょうか?
shlwapi.dllにStrStrというAPIがあるよ
450 :
446 :2006/12/29(金) 07:40:49
>GetIconInfo creates bitmaps for the hbmMask and hbmColor members of ICONINFO. >The calling application must manage these bitmaps and delete them >when they are no longer necessary.
資料を読まない香具師ほど自分の愚かさを棚に上げて他人の所為にしたがる好例だな。
453 :
デフォルトの名無しさん :2006/12/29(金) 09:41:58
質問があります。 WindowsXPなのですが、zip圧縮、ゴミ箱に捨てる等のオペレーションを行うと、 プログレスダイアログがあがりますがあれはAPIを使用しているのでしょうか?
>>448 開発中に見つけた不具合wwwwwwwwwwwwwwwww
君の頭が不具合なのは良くわかった
>>453 ゴミ箱に捨てる→SHFileOperation関数
圧縮はどうなんだろ?
456 :
453 :2006/12/29(金) 11:46:57
>>455 ありがとうございます。
もう一つ、あのダイアログだけを取得する事は可能でしょうか?
458 :
448 :2006/12/29(金) 11:53:24
うわ、死にてぇorz 単純な情報取得で勝手にメモリアロケートされるなんて ハンドルを返したりするAPIだけと思い込んでました。 日本語のMSDNにも明記されてるし。ちょっと吊ってきます・・・
459 :
453 :2006/12/29(金) 11:53:31
>>457 文盲ですみません。
SHFileOperation関数を実行すると、処理が長い場合に自動で
プログレスバーが表示されます。
あのプログレスバーを取得し、タイトル、メッセージ等を変えて自分で
使用したいとおもいまして、そのようなAPIはあるのかなと。
vistaのこともあるし、難しいんじゃね?
スレッド2ついるのかな? つい昨日出鱈目にプログレス作って失敗したけど。
SDKサンプルにaviあるからそれ貼り付ければそれらしくなる バーも入れたいなら投げっぱなしじゃ無理なのはわかるよな
shell32.dllのDialog1020と任意のAVI(160〜170)を組み合わせてるだけで出来るだろ。
インターフェイスにIProgressDialogってのがあるけど、 ME以降なんで注意かも
465 :
453 :2006/12/29(金) 14:13:11
>>462 リソース使わずにAPIだけで済むのならと思い、質問しました。
>>463 ありがとうございます。検討します。
>>464 まさにこれです。
API使う時点でOSのターゲットを絞るので十分です。
ありがとうございました。
466 :
デフォルトの名無しさん :2006/12/30(土) 02:16:13
今IMEで入力中の文字に外部から細工を施したいプログラムを作ろうとしております。 IMEで入力中の文字列を取るには ImmGetCompositionStringにGCS_COMPSTRを引数に渡せばいいことは分かったのですが、 その前にIMEのコンテキストを得るための ImmGetContext の引数のウィンドウハンドルをどうしたら良いのか分からなくて困っています。 現在アクティブなウィンドウの入力を操作したいので、 ForegroundWindowの子ウィンドウのいずれかを指定すればよいのですが、 その中で現在IMEが入力しようとしている子ウィンドウの判定の仕方をどなたか教えて頂けないでしょうか。 よろしくお願い致します。
ImmEnumInputContext
GetFocusでよくね
>>470 フォントサイズ小さくしてない?
私の環境なら最小じゃなければ読めるよ。
日本語じゃない情報はゴミ
ゴミグラマ
東京ゴミグラマ
WIn32 APIスレで英語読めませんとか堂々と言われても。 msdn2で日本語情報が大幅に拡充されたせいかなあ
無料配布の影響
英語が読める読めないの問題じゃないと思うけどな。 浅はかだ。
誰に対してどんな内容がどんな理由で浅はかなのか説明してもらおうか
アプリの二重起動を監視するのに、FindWindow関数や、Mutex法を使うとよさげなのですが 単純にGetKeyState使った関数の呼出しで、呼出された関数が一回のキーボード押下で 二回呼出されるのは、単なるバグと考えていいですよね?
単なる仕様です。
日本語でおk
1行目と2,3行目の関係がわからないんだが
GetKeyStateは関数を呼出しません。
>>483 スマソ、GetKeyStateの取得したキーイベントをトリガーとして、
関数を呼出すってことね
二重起動の監視とキーの状態にどんな関係が?!
>>484 単にあなたが2回その関数を呼出しているだけです。
拠ってその動作がバグか使用かはあなたが決めてください。
CSSプレイヤーにチートしてない人はいないよ
488 :
デフォルトの名無しさん :2006/12/31(日) 18:38:27
IEEとかメモ帳の検索窓のコンテキストってどうしたら取得できますか?
除夜の鐘を鳴らすAPIを教えてください。
Beep()
HitBell(108);
for(;;){ Eat(Toshikoshisoba); }
あけまして、おめでとうございます。 今年も上手に残業代を稼ぎましょう。
try { for(;;) Eat(Toshikoshisoba); } catch(gero_exception &e) { }
'0xdeadbabe' の命令が '0xbaadf00d' のモチを参照しました。 モチが "swallowed" になることはできませんでした。 ライフを終了するには [OK] をクリックしてください ライフをデバッグするには [キャンセル] をクリックしてください
別におもしろくないから
メッセージループの基本的な仕組みについて質問です WinMain() { MessageLoop() { while( 1 ) { GetMessage(); DispatchMessage() → WndProc() { } } } } こんな感じのプログラムで、DispatchMessageのあたりの処理は DispatchMessage関数呼び出し ↓ WndProc関数呼び出し ↓ WndProc関数終了 ↓ DispatchMessage関数終了 という流れになっているという考えであっているでしょうか?
>>498 まあ、それでおけ。
ほかにも、いくつかあるけど。
GetMessageが0か-1を返したときは、ループを抜けること。
TranslateMessageを使うこと。
WM_CHARなどがいらないなら、使わないというのもありかもしれないが、
コモンコントロールなどは使うから、まず必要になる。
どうもです。 >GetMessageが0か-1を返したときは、ループを抜けること。 >TranslateMessageを使うこと。 猫でも〜本で勉強しているのですが よく見るとそのあたりのことも書いてありました。ありがとうございました
ニャー
「日本語の資料で」「お金をかけることで自分を奮起させて」「順を追って学習したい」「完全な初学者」 なら猫も悪くないと思うぜ 立ち読みした印象だけど
全然知らないところに突撃する前のウォーミングアップにも便利だよ
webで全部読めるのに本買う馬鹿がいるとは思わなかった
あれをwebで全部読む馬鹿がいるとは思わなかった
webの方の最初の章は古くなったネタがあるが、 本では改修されていたりする。 Windows の UNICODE のフォローは無いが。
猫のサンプルソースが全部全角になってるのはコピペ対策?
その方がかっこいいからだ!
全角になってるとこなんてある? 全角のように見えるけど全部半角じゃね?
あそこは字がでかすぎて読みづらいし、 余分なところまで載せてるから長くて読んでられない。 ビルドするにはいいけど
なんでもかんでもグローバル使い杉 小さい子が真似したらどうすんだよ
サンプルコードってのは、できるだけ簡素に書いた方がいいんだよ。 俺は単機能のサンプルくらいならソースは1ファイル構成でクラス等は 使わずにほぼCの機能だけで書く。
グローバル便利じゃん 免許のいらない自動車ぐらい便利だと思う
ただで清ますか、安物買って、結局2chに助けを求め、混ぜっ返され、混沌と化す。 そんな末路をたどるくらいなら、Petzold買え。
漏れは、WIN32Apiに関連した、単語を検索すると、猫のサイトがよくヒットしてたので 時々見ていたが、こいつの本だけは絶対に買わないと決めた Charles Petzoldの上下買うのは多少勇気がいったが買ってよかったと思う 単なるできたらいい、動けばいいといった内容ではなく、Windowsの歴史から 書いてあるので、一から順序立てて書いてあるので理解がしやすい。 また、Windows本のバイブルと言われる理由も納得できる。 長尾 高弘氏の訳もすばらしい。
Petzoldってそんなにいいのか。 買って見ようかな。 自分はAdvanced Windowsで理解した口だけど。
タブコントロールを作成して、タブバーを除く領域全体に、 ボタンやエディットのウインドウを貼り付けるにはどうすればいいですか? タブコントロールのサイズに合わせて表示したら、 タブバーの上にまで、乗せられてしまいます。
520 :
デフォルトの名無しさん :2007/01/02(火) 17:52:41
GetKeyStateに関する質問です。 SetWindowsHookExに渡すハンドラ内で Capsキーが{押された,離された}(Shift無し)を取得したいと考えています。 VK_OEM_ATTN(0xF0)が該当のキーコードであることまでは自力で調べられたのですが、 GetKeyStateにVK_OEM_ATTNを引数として渡すと、 キーの状態に関わらず返り値の最上位ビットは常に立っています。 (ほかのキーコードを引数にするときは期待する値が返ってくる) GetKeyStateではVK_OEM_ATTNの状態は取得できないのでしょうか? よろしくお願いします。
521 :
sage :2007/01/02(火) 17:54:15
520です。。 sage忘れました。まことに申し訳ない。。。
使い方を間違ってる
GetAsyncKeyStateなら取れるんじゃね?
525 :
520 :2007/01/02(火) 19:00:23
>>524 レスありがとうございます。
早速試してみたのですが、
最上位,最下位ビット共に0(ビット立たず)でした。
GetKeyStateとはまったく逆の結果が取れるんでしょうか。。
GetAsyncKeyStateに関しても他のキーコードは正しく取得できているようです。
VK_OEM_ATTNのキーコードは例外的な扱いなのでしょうか・・
VK_CAPITALじゃないの?
527 :
520 :2007/01/02(火) 19:41:24
>>526 説明不足で誤解を招いてしまい申し訳ないです。
CtrlキーとCapsキーを「起動している間だけ入れ替える」
アプリケーションを作るのが私の目的です。
VK_CAPITALは
"Shiftキー"を押しながら"CapsLockキー"を押した時
発生するキーイベントなので目的とは違ってしまうんです。
私もはじめはVK_CAPITALかと思ってずーっとハマってました。
VK_OEM_ATTNか!なるほど!と思って進めたらこんな状態です。
528 :
519 :2007/01/02(火) 19:42:18
>>527 GetKeyStateで取得したい仮想キーと0x80の論理積が求まれば
幸せになれるかも^^ね、外していたらスマソ
仮想キーコードはシステムの状態に応じてOSが作り出した仮想的なキーコードです。 キーボード上のキーと仮想キーコードは、必ずしも1対1に対応しているわけではありません。 中にはキー操作だけでは発生させることのできないキーコードもあります。
>>520 最初の一回目だけ bit 15-7 が
0->1
になるのを確認出来た
bit 6-1 はずっと 0
bit 0 は 1->0 になった
そのあとは押しても放してもずっと変化しないみたい
プログラム終了して実行しなおしても変わらなかった
どこかで状態リセットする必要があるんじゃないかな
GetKeyState 呼ぶ直前に SetKeyboardState で 0 * 256 書き込んだらクリアされるみたい 一回押すと覚えてしまうみたいなので毎回 SetKeyboardState 呼ぶ必要あり
あと、他のキーの状態分からなくなると困るので char kbuf[256]; GetKeyboardState(kbbuf); で現在の状態を配列に読み込んでから kbbuf[0x0F0] = 0; SetKeyboardState(kbbuf); GetKeyState(0x0F0); かな 押された状態を覚えてしまってるので キーが放されてても拾ってしまうケースがありそう
GetKeyboardState と SetKeyboardState の間が アトミックじゃないのはあきらめるしかないのかな
そもそも、入れ替えだけなら調べる必要ないだろ
とある場所でLocalAlloc/LocalFreeというAPIを見たのですが ググってもほとんど説明がない、これはなんですか?
普通に msdn にあるだろうが。
16ビットの時の名残だな 今は明確な違いは無いだろう
>>535 だよね。WH_KEYBOARD_LLのフックプロシージャ内で、コードもわかるし、握り潰しもできるらしいし。。
あ、でもOEM_ATTNは、押下はわかるけど、開放はわからないっぽい。だとすると同時押しに対応できない?
VK_OEM_ATTNは違うよ。マウスでガチャガチャやるだけで立つ。 WM_KEYDOWNで来るのは0xFFF0だった様な気が。スキャンコードは不変。 535に一票。
541 :
デフォルトの名無しさん :2007/01/03(水) 11:02:03
ドライバ使えばできるよ。 マイナスドライバで引っぺがしてCAPSとCTRL入れ替えるの。
手でいいじゃん ぼくドラえもんさんですか?
レジストリでいけたような Keymapだったっけ?
544 :
520 :2007/01/03(水) 11:52:24
>>529 GetKeyStateの返り値と{0x80,0x01}の論理積で確認しています。
ささいな事でも情報をいただけるだけで助かります。
>>530 なるほど。すごく勉強になります。VCでのプログラミング経験が浅いので
そういった基礎知識が欠けているような気がします。
仮想キーコードに関して少し勉強してみます。
>>531 わざわざ確認までしていただき恐縮です。
状態リセットですか。それも一度やってみたのですが、
Ctrlとして動作させるのにプログラム側でリセットすると
非常に使いづらいCtrlキーになってしまいました。
Upのイベントを取得できるのが理想なのですが。。
>> 532-534
やはりそうなのですか。ただ上で書いたとおりプログラム側から
のリセットはタイミングが非常に難しいです。
GetKeyStateは今回の用途に向いていないんですね。
545 :
520 :2007/01/03(水) 11:52:55
>>535 おっしゃる通りです。
WH_KEYBOARD_LLでグローバルフックを仕込んでいます。
キーイベントが発生するとフックプロシージャが呼ばれるので、
そこでキーコードだけ調べればいいというお話ですよね。
しかし、VK_OEM_ATTNだけUpのイベントが取得できませんでした。
プロシージャ内にMessageBoxなどを仕込むと、
キーを押して離すと当然2つのMessageBoxが出現するのですが、
Caps(VK_OEM_ATTN)のみMessageBoxは1つ,キーダウンの時だけでした。
そこでGetKeyStateなら調べられるのではないかと思っていたのですが。。
>>539 私もみなさんの意見をいただいて今そのように考えています。
なんとか開放を知りたいですね。
>>540 マウスでガチャガチャというのはどういう意味でしょうか??
重要なヒントな気が。
よろしければ詳しく教えていただけないでしょうか。
>>541 USBメモリに入れて環境を汚染せずに使いたいと思ってます。
そうか!ドライバを持ち歩けry
>>542 そうか!これで何も持たずry
546 :
540 :2007/01/03(水) 12:37:35
以前、EDITとPUSHBUTTONをもつモードレスダイアログを作ったとき、 マウスでダイアログのアクティブ/非アクティブ/フォーカス変更を行うと GetKeyboardState()のVK_OEM_ATTNが立ちっぱなしになった経験あり(WinXP)。
リッチエディットはデフォルトで、 Ctrl+V で貼り付け動作を行いますが、 このとき書式はコピーしないようにするには、どうすればいいですか? アクセラレータの無効化を考えましたが、方法がわかりませんでした。
・YOKODORIする -or- ・そういうnofityがくるんじゃないかと期待しつつリファレンスを眺める
IRichEditOleCallback::QueryAcceptData でCF_TEXT だけ受けるようにするとか
551 :
547 :2007/01/03(水) 14:10:50
WM_KEYDOWN で Ctrl+V の時は元のプロシージャを呼ばないようにしました。 ありがとうございました。
それだとKEYDOWN以外での貼り付け操作(たとえばコンテキストメニュー) に対応できなくないか それともctrl+vだけ対応できてればいいのか
RichEditには標準のコンテキストメニューは無い品。
しかし皆さんフック好きですね一体何がしたいのやら( ̄ー ̄)ニヤリ
フックのプログラムってマジで実験するとき覚悟しないと、CTRL+ALT+DELも
効かずに強制電源OFFしないといけない羽目になる事を覚悟してね
漏れはそれでOS3回再インスコしましたww
まぁ普段からプログラムコードや大切なファイルは外付けのMOに
書いてるし再インスコもnlite使ってるから慣れたもので20分くらいで
XP様ご一行が入ってくるけどねww
気をつけてね
>>520 さん
昔のコピペ?
見ちゃいけません!
ノックとパンチは引退。青芝フックガンガレ。
僕ハッカー
僕バッカー
バカバッカー
暇人多いよな
冬休みももうすぐおわりだな
俺一生冬休み
選択されているタブアイテムのハンドルを取得する方法はありますか?
何のタブアイテムだよ。 現状でわかってるのはどれとどれ。 取得するのはTCM_GETITEMメッセージを送ればいい。 もしかしてC#のスレの人? 他のプロセスからだとそのままポインタ渡せないから VirtualAllocEx とかReadProcessMemoryも必要になるので注意な。
568 :
566 :2007/01/04(木) 16:21:38
>>567 sysTabControlの選択されたタブアイテムです
選択されているインデックスは取得できたし
EnumWindowでタブアイテムのハンドルをすべて取得したんだけど
どれが選択されているかどうかがわかりません
タブアイテムのVisible状態で判断しようかと思ったんだけど
うまくいかず。もっと簡単な方法があるのでは?と思いまして
TCM_GETITEMは情報を取得するものってのは知っていましたが
どんな情報なのか?あと、パラメータの設定が難しそうなので
避けてました。ちゃんと調べて見ます
ありがとう。
ちなみに、C#スレにいたものです^^;
>もしかしてC#のスレの人? >ちなみに、C#スレにいたものです^^; w
C#ってWin32 API直接呼べるのか?
別プロセスのリストビューにGETITEM送るには、、
>>567 が言うとおり、
そのウインドウを所有するプロセスのアドレス空間にメモリを確保しなければならないのだが。
Marshal.AllocHGlobal/FreeHGlobalでいけない?
VirtualAllocEx() でないと無理。 GlobalAlloc の戻りハンドルはプロセス間共有できない
>>574 >GlobalAlloc の戻りハンドルはプロセス間共有できない
これ知らずに嵌ったことがあるんだが、何のためにこんな名前になってるん?
>>575 Win16時代は共有できてたし、その名残じゃね?
577 :
566 :2007/01/04(木) 19:10:34
>>570 選択されているタブ内のcomboboxやtextboxに文字列を送りたいんですけど
選択されているタブのハンドルがわからないと、その子ウィンドウのハンドルもわからないわけで
メッセージも送れないというわけです。
enumwindowなどでtextBoxのハンドル自体は取得できても、それが現在アクティブなタブのものなのかは
わからないので、どうすればいいのかなと。
普通のタブコントロールって、 タブページごとのハンドルとかって無いよね? 唯一のタブ HWND Tab を親にして全部乗っけるっていう形で。
IsWindowVisibleでしらべりゃいんじゃね?
そもそも、よそんちのコントロールに何か書き込むなんて、何か理由があるんだろうから それが判定のきっかけにならないかねえ
581 :
566 :2007/01/04(木) 19:46:33
>>579 それがですね、TCM_SETCURSELで選択しても
見た目は確かにタブは切り替わりますが
実際にはといいますか、visibleにはならないんですよ
visible状態なのは切り替える前のタブのままなんですよね
マウスでクリックしてやればvisibleになりますけど
まだ試してないですが、マウスのクリックイベントを送ってやればいいのかもしれないですけど・・・
やっぱブサイクですよね?
カッコイイ!
583 :
デフォルトの名無しさん :2007/01/04(木) 20:56:52
最近、「寄生派遣」という言葉をよく聞くようになりました。 契約終了を切り出されると「切られたら生活できません」などと 泣き落としで契約更新を迫る派遣のことです。 今月初め、半年前に辞めた派遣が出社してきてみんなびっくりしました。 影でコソコソ偉い人に泣きついて再契約したそうです。同じ部署の人には黙って・・・ そんなことまでして自宅の近くの派遣先にこだわって人間として恥ずかしくないのですか。 派遣でスキルアップ、派遣で収入アップとか言うなら一箇所にしがみつかず 複数の会社を渡り歩いてください。 ひとつの会社で派遣向けの単調な仕事をしていたらスキルアップなんてありえないでしょう。 狭いワンルームを電化製品で埋めるために派遣で足りない収入は親にも寄生して、 いつ切られるんじゃないかとビクビクしながら人事権のある人間とだけ仲良くし、 契約終了を通知されれば泣き落とし。悲惨な人生ですね。 氏んだほうがいいんじゃないですか。
SendMessage(hwnd566, WM_COOOOOOOOOOOOOOOOOL, COOL_CODE, 0);
ああ、SetCurSelはタブしか切り替えないから。
切り替えたあと
>>584 のようにInvalidateしてだめなら
いったん非表示にして表示させるといいよ
すいません、質問させてください。 ウインドウクラス名からそのクラスが既に登録されているかを 調べたいんですが、FindWindowでクラス名だけ指定しても検出できませんでした。 他にうまい方法はないものでしょうか?
GetClassInfoExが成功するかどうかを、登録されているかどうかの判断に使用したらどう? FindWindowだと登録されているけど、そのクラスで1つもウィンドウが作られていない場合にうまくいかないと思う。
なるほど、やはりウインドウが作成されていないとダメですか… > GetClassInfoExが成功するかどうか この方法で完璧にチェック出来ました。どうもありがとうございます。
TCM_SETCURSELじゃなくて、TCM_SETCURFOCUS使えばいんじゃね?
592 :
566 :2007/01/04(木) 21:58:45
指定したUNICODE文字列が数値かどうかを判断するWin32APIってありますか? その後の_ttoi()がエラーを返してくれないのでチェックをしなくてはならないんです。 よろしくお願いします。
MSDNよく嫁
MSDNのどこに書いてあるのかわからないんです・・・。 数値の入っていない文字列に_ttoi()を実行すると0が返されるんですが、数値が0であった場合との区別がつかないので。 的外れな質問かも知れませんがよろしくお願いします。
MSDNよく嫁
_ttoi()の部分については2回読んだんですが・・・ どこを読めばよいのでしょう? "入力がこの型の値に変換できない場合の戻り値は、0 (atoi、_atoi64、_wtoi および _wtoi64)" こう書いてあるので数値が0のときと比較できない気がしたんです・・・
無い希ガス。 まぁ全文字iswdigitで調べるだけだから自分で書いても。
>>597 あのなぁ、
>>594 ,596は不親切だから俺が結論を出してやるよ。
そんな判定をするAPIは無いってのがMSDNを読んでわからんの?
そうですね、やはり的外れな質問すみませんでした。 自分で組むことにします。
TrackPopupMenuEx()の使い方がよく判りません このAPIでポップアップメニューは表示できるのですが… 一般的なアプリケーションだとポップアップメニュー範囲外をクリックする事で メニュー選択がキャンセルとなりますが、自分で作ったアプリケーションだと メニューが出っ放しで何か選択しない事には消えてくれない実装にしてしまっています。 範囲外をクリックする事でポップアップメニューを消す動作はどのように実現するのでしょうか
>>601 通知アイコンでやtってんのかな?
メニュー出すときに、SetForegroundWindow()呼んどけ
604 :
601 :2007/01/05(金) 00:47:26
>603 出来ました マリガトウ >602 どうせならMSDNの何処を読めばいいのか教えてくれ
MSDN日本語版では注意書き消えてるな これじゃ仕方ない
609 :
デフォルトの名無しさん :2007/01/05(金) 01:30:01
こんな事で笠に着て威張る小学生
>>608 はカッコヨス
610 :
608 :2007/01/05(金) 02:04:35
ふーん
>600 なんでtcstolにしなかったの?
自作ウィンドウのタイトルバーを掴んでドラッグ(移動)中に SetWindowPlacementでウィンドウのサイズを変更すると マウスを止めている間は変更したサイズのままなのに マウスを動かすと変更前のサイズに戻ってしまいます これをドラッグ状態を維持できるできないに関わらず なんとか変更後のサイズを維持する方法はないでしょうか? SetWindowPlacementをする直前にドラッグ状態から 抜けさせてしまえばいいかなと思ってWM_EXITSIZEMOVE 送ってみたりしましたがダメでした
APIで自動でエロゲを攻略してくれるソフト作れますか?
作れます。
GUIのテストツールとかあるから そういうの真似れば自動でチャートまで作ってくれるエロゲ攻略ソフトが作れるかも・・・
SendMessage(*, WM_USER, *, *); して case WM_USER: SendMessage(*, WM_USER, *, *); しても無限にSendMessageされないのなんで?
>>616 SendMessage(*, WM_USER, *, *);
して
case 0x0400:
SendMessage(*, WM_USER, *, *);
これで動くか?
無限ループに陥った ためしにUINT MsgをWM_LBUTTONUPやWM_KEYDOWNにしたら40回しかループしないん だけどなんで?
メッセージループを通るやつと直接呼ばれるやつの差で、 メッセージキューのサイズが影響してるとか?
>>616 > しても無限にSendMessageされないのなんで?
>
>>618 > 無限ループに陥った
つうか、過去ログにもあったな
ttp://pc5.2ch.net/tech/kako/1047/10478/1047819779.html 206 名前:デフォルトの名無しさん :03/03/27 17:03
文字列が数値かどうか判定するAPIってありましたでしょうか?
VBでいうところのIsNumericです。
207 名前:デフォルトの名無しさん :03/03/27 17:16
>>206 GetStringType, GetStringTypeEx かなぁ?
208 名前:デフォルトの名無しさん :03/03/27 17:20
>>206 IsCharAlphaNumeric() && !IsCharAlpha()
ではどうか?
PostMessage(hWnd, WM_APP, (WPARAM)new Foo, NULL); (中略) case WM_APP: delete (Foo*)wParam; みたいなメッセージを100万回とかアホみたいに送り付けると キューからあふれた分はメモリーリークするって事でOKですか?
PostMessageの戻り値ってなんだっけ?
>>625 つまり
Foo *foo = new Foo();
if (PostMessage(hWnd, WM_APP, (WPARAM)foo, NULL) == FALSE)
delete foo;
にしろということ?
== FALSE がキモい
>>628 PostMessageが成功してもすぐに処理されるわけじゃないから、deleteしちゃいかんでしょ。
Win32APIの関数で現在見ている、見ているInternetExplrerのアドレスを取得する 関数があれば関数名を教えてください やっぱりSocket使わないと無理なのかなぁ?
日本語でおk
>>631 現在見ているInternetExplrerのアドレスを取得する為のWin32APIというものは存在しません。
また、Socketを使っても出来ません。
>>631 Win32API でとなると面倒
IE、アドレス、DDEとかでググレ
見ている、見ている
アドレスバーのComboboxから取れるんじゃね
GetActiveObjectから、なんだかんだを経てIWebBrowser2へのポインタを取得すればいいだけでは?
640 :
デフォルトの名無しさん :2007/01/05(金) 23:59:48
皆様方、新年おめでとうございます。 今年も、Win32APIが健全でありますよう、 願う者でございます。 Win32APIが末永く、Windowsの基礎であるよう、 切に願う者でございます。
InternetExplrer2つ立ち上げてる場合の 現在見ている、見ているInternetExplrerのアドレスってどれ?
>>639 >>631 です
IWebBrowser2でいけそうですね、全然知らなかったのでマネージドかと思ったけど
MSDN見たらアンマネージドでした使えそうです
サンクス
視線認識だな。がんばれ。
641はグーイを作ろうとしている(なつかしっ)
ファイル名の文字コードにEUCを使いたいのですが、movefileを使ってもうまくいきませんでした。 具体的には、"やわらか.txt"をEUCコードの文字列にすると「A4 E4 A4 EF A4 E9 A4 AB 2E 74 78 74 00」となるのですが これを引数としてファイル名を変えると、「A4 E4 A4 81 45 E9 A4 AB 2E 74 78 74 00」と一部が勝手に変換されてしまいます。 windowsではEUCコードの文字列をファイル名に用いることは無理なのでしょうか?
Vistaのことも考えてUnicodeにしておくのが無難
それ、途中でUTFとして扱ってそう。 UTFでEFは確か特別な意味があった予感。
ファイルシステムにはunicodeで格納されるんだが 何をやりたいのかがわからん
>>645 ワイド文字列に無理矢理 EUC ぶちこんでUNICODE系のAPIを使え。
>>645 少なくともNT系のOS(2000とかXPとか)はファイル名を内部的には
Unicodeで持っているから、EUCとか無意味。つーか無理。
95系なら可能かもな。
9x系でもIFSレベルではUnicodeで扱われるしVFATの長いファイル名もUnicodeで 記録されるし。
ShowWindowでもタスクトレイにアイコン化されたものを 元のサイズに戻せないんだけどどうすればいい?
OpenIconじゃね?
>>654 それでもうまくいかないです
別のアプリだからかな?
hideになってるフォームが表示されるだけで
実体はアイコン化されたままなので描画されないんです
もしかしてDelphiアプリケーションか?
タスクトレイじゃ無くてタスクバーじゃないの? ShowWindowでいいはずだけど、パラメタ間違ってない?
元に戻す操作をした時のWM_COMMANDとかをSPY++で調べてみりゃいんじゃね?
>>656 そうです
>>657 タスクバーって最小化されてタブ化されているとこですよね?
そうじゃなくて、時計のところのタスクトレイにアイコン化されて
フォームはhideされている状態で、タスクバーにはタブ化されてません
>>658 それもやってみていたんです。
アイコン化されたものをクリックして元に戻したりしてみたんですが
wm_commandは送られてません
syscommandで元に戻すようにしてみたり
wm_activeしてみたりいろいろしたんですけど
Delphiは隠しウィンドウがあるからごにょごにょ
>>659 Delphiのウィンドウは透明のアプリケーションウィンドウの子ウィンドウだから、そっちにもメッセージ送らんといかん
つーかタスクトレイは最小化したウィンドウじゃないぜ? なんか勘違いしてないか。 まあ通知用に非表示のウィンドウを1つ持たせるのが普通だけど そういう決まりがあるわけじゃなし
664 :
659 :2007/01/06(土) 17:42:09
TApplicaitonってものだったんですね
この数日ずっと調べてたのにSW_Restoreであっさりいけました^^;
感謝感激
>>663 アイコンはアイコンで別で構造体を定義したものを追加してるだけなんですよね
で、メインフォームはHIDEされていると。
でも、非表示ウィンドウをメインフォームとは別に用意している場合があるってのが
知らなくて苦労しました
分からない事があったので、質問させてもらいます。
ttp://www14.big.or.jp/~ken1/tech/tech9.html void Blit(HDC from,HDC to,int x,int y,int width,int height,int fromx,int fromy,COLORREF tran)
:
mmono=CreateCompatibleDC(from);
bmono=CreateBitmap(width,height,1,1,NULL);
SelectObject(mmono,bmono);
SetBkColor(from,tran);
BitBlt(mmono,0,0,width,height,from,fromx,fromy,SRCCOPY);
ビットマップmmono作成してこれを表示するプログラムなんですが
640×2880のビットマップをfromyに0から480ずつ足していき、
アニメーションをさせたいのです。
しかし、0の値の時しか表示しません。
Blit(hTzk,hBuf,0,0,640,480,0,btStartY,RGB(255 , 0 , 255));
お願いします。
事故解決しますた; 表示するとき作成したビットマップを超えたY領域指定した スンマセン
667 :
659 :2007/01/06(土) 21:28:39
いけたと思ったのにいけてなかった そのときはアイコン化されてなかったのか? 同じコードでやっても全然反応しない TApplicationをRestoreするとタスクバーに表示されるだけで アイコンは残ったまま メインフォームをrestoreしてもフォームが表示されるだけで アイコンは残ったまま 何が悪いんだろ
>>667 タスクトレイのアイコンはフォームの最小化とは無関係だから。
>>667 もともとやってることが邪道
外部から無理やりにリストアされた時にタスクアイコンを消去するように組まれてないんだろ。
670 :
659 :2007/01/06(土) 21:57:43
>>668 いやまあ、それはそうなんですけど
取り出さないと機能が戻らないんですよね
フォームが再描画されないってことです
>>669 そういう場合もあるんですか・・
ってなると、タスクトレイのツールバーからアイコン情報取得して
何かしらのイベント送って、正規の手順を踏んだように見せないとだめってことかなぁ・・
>>670 そういうことじゃない。
タスクトレイのアイコンはフォームの最小化とは無関係ってのは
フォームをRestoreした時に自動的にトレイアイコンも消えるようにはなってないって事。
トレイアイコンを消すのは自分でやるの。
自分で簡単なタスクトレイアプリ作ってみればわかると思うよ
自分でタスクトレイアプリを作ったことが一度もないのに 他のアプリのトレイアイコンを操ろうとするなんておこがましいと思わんかね?
674 :
659 :2007/01/07(日) 00:27:36
もしかしてこういうことをいいたいんですか? Shell_NotifyIcon(NIM_DELETE, NID) アイコンの追加も削除の仕方も知ってるんですけど・・ フォームとアイコンは関係ないとか言ってますけど そりゃ表示上は別々に機能するでしょうけど 内部で連動してる場合もあるわけで アイコンを削除したらいいって単純なことじゃないんですけど
いや、俺も流石にこれ以上は釣られないぞ
>内部で連動してる場合もあるわけで ありません。完全に別のものです。
>>674 OS/Shell/Applicationの管轄がそれぞれどこからどこまでかもう一度勉強しなおしてきてくれ。
678 :
659 :2007/01/07(日) 00:39:30
>>676 では、アイコンは勝手に削除されるわけですね?
アプリが終了しようとしまいと関係なく独立しているわけだ。なるほどね
ここでレベルの低い人を相手にしてても仕方がないので
自分で調べますよ
>>678 >アプリが終了しようとしまいと
いいえ、フォームとトレイアイコンの関連の話です。
アプリが終了したら、プロセスが所有するリソースは基本的にOSが回収するってだけで。 フォームとトレイアイコンの関係とは全く別問題だよね?
681 :
659 :2007/01/07(日) 00:58:09
そんな屁理屈みたいなこと言って楽しいわけ? 表示上は別物だって何度も言ってるでしょ
もう秋田
683 :
659 :2007/01/07(日) 00:59:44
煽りだけは一丁前だけど 全然解答だせないじゃないw 初心者に毛が生えたような知識でえらそうにするなよw
MutexとかOSが回収しない物もあったような
自分に利が無いと判断した時点でレスは全て無視しとけ
>>678 アイコンを管理してるのはシェルだから、アプリケーションが落ちたからといってすぐに消えるわけじゃない。
687 :
659 :2007/01/07(日) 01:08:53
どうでもいいけど、アイコン化されたアプリを 元のサイズに戻して、機能も戻す方法は教えてくれないわけ?
>687 どっちかってぇとDelphi/BDSスレに行ったほうがいいんじゃまいか? ただそんな態度じゃ相手にしてもらえないような気もするが。
NOTIFYICONDATA とWM_TRAYICONMESSAGEでいけると思うがね。 あとはテメーで調べろ。
クリックしたときに送られるWM_COMMANDのIDとかがわからないならクリックのメッセージ送ればいいだろ・・・
691 :
659 :2007/01/07(日) 01:29:47
ほんと頭にくるね
こっちはわかり易く現状言ってるのにそれに揚げ足取るなんてな
フォームとアプリとアイコンが別物だってことぐらい知ってるわ
表現上わかり易く伝えるために、フォームは表示されるけど
内部的にはアイコン化された状態だって言ってるのに
「フォームが最小化してアイコンになるわけじゃない」
とかW
>>657 パラメータってなんだよWWパラメータってW
>>658 WM_COMMANDってwwメニュー操作じゃねーんだからなw
>>689 ありがとう
それで調べてみる
>>690 わからないじゃなくて送られてないの
あとさ、クリックイベント送るっつーことは
タスクトレイ、つまりtoolbarに対してグローバルメモリ割り当てて
情報取り出してメッセージ送らなきゃならないわけ
そこまで面倒なことしなくてもいいのか知りたいから質問しただけ
693 :
659 :2007/01/07(日) 01:36:10
>>689 つか、それアイコンの構造体じゃねーか
そんなのわかってんだよ
自アプリのアイコンを削除したいわけじゃねーの
>>690 ボタン押すのと同じと思ってないか?
つか間違った意見であっても"出してくれる人"に頭下げられない奴はダメな気がする
自分でできないで人に頼ってるくせにこいつは何でこんなに偉そうなんだ?wwwwwww
696 :
659 :2007/01/07(日) 01:42:03
>>694 間違っていることを伝えられるのも2ちゃんねる
煽りや虚言にお礼言っててどうすんだよ・・
>>695 わからないならだまっとけ
697 :
659 :2007/01/07(日) 01:46:27
もう一度言う。自アプリのアイコンを削除したいわけじゃない
こいつ最低だな。 現実世界でも、自分の思い通りの回答やらアドバイスしないと罵倒しまくる奴なんだろうな。
699 :
695 :2007/01/07(日) 01:50:55
よーしDQNな俺様が解決してやる
用件定義を言え
>>655 でいいのか?
人間として最低。
701 :
695 :2007/01/07(日) 01:54:05
概要はタスクバーにあるアイコンを元のサイズに戻したいってわけか Shell_NotifyIcon(...); ShowWindow(ウィンドウハンドル, SW_SHOW); でいいんでね?
702 :
695 :2007/01/07(日) 01:54:41
別アプリならハンドルは取得してるはずだよな?な?
>ShowWindowでもタスクトレイにアイコン化されたものを >元のサイズに戻せないんだけどどうすればいい? って事だろ。 ならば、WINDOWPOSあたりかな。
704 :
659 :2007/01/07(日) 01:58:41
>>699 そです。
>>702 取得済みです
でも、そのハンドルが正しいかはわかりません
一応spyでメインフォームだけでなく、関連するフォームの
すべてに対してSW_RESTOREを送ったけれどもだめでした
705 :
695 :2007/01/07(日) 02:01:03
タスクトレイを元に戻すのってまず最初にタスクトレイにある対象アイコンを削除してから 表示しないとダメなんじゃなかったっけ?NOTIFYICONDATA構造体で NOTIFYICONDATA notify; notify初期化 /* 削除 */ Shell_NotiffyIcon(NIM_DELETE, ¬ify); ShowWindow(対象ハンドル, SW_SHOW); でいけるんでね?
SPY++等で、対象のアプリがNOTIFYICONDATAのuCallbackMessageとuIDに設定した値を調べて、 対象のアプリのウィンドウに、SendMessageでwParamにuID、 lParamに対象のアプリが元のサイズにもどるマウス操作のメッセージを突っ込めばいいでない?
707 :
659 :2007/01/07(日) 02:08:49
>>705 それをやればいけるのはわかっているんですけど
他プロセスのnotifyを取得するには
そうなるとVirtualAllocExでメモリ確保してReadProcessMemoryで
自プロセスメモリにコピーしてとかやらないとだめですよね?
708 :
659 :2007/01/07(日) 02:11:42
>>706 私もそれは考えました
ただ、どうもそのメッセージを送っている相手のハンドルが違っているためか
上手く取得できません
アイコンを作成するときに、どのハンドルにそのコールバックmsgを送るか指定しますよね?
つまり、そのハンドルを持っているウィンドウが隠されてたり、わからなかったりすると
うまく取得できないですよね?
709 :
695 :2007/01/07(日) 02:11:43
OpenProcessとかでマップすればなんとかならないっけ? 少なくともReadProcessMemoryなんかめんどくさい事は少なくとも俺は絶対やらない(やりたくない)
馬鹿が知識もなしにとんちんかんなことをやろうとしてるのがわからんあいのか
711 :
659 :2007/01/07(日) 02:19:54
>>706 ちなみにuCallbackMessageとuIDのメッセージを送るのは
何を見ればわかりますか?
WM_APP
WM_ACTIVATEAPP
かなと思ったんですがどうも違うみたい
712 :
659 :2007/01/07(日) 02:21:44
>>710 バカの定義は知識がないことですか?
バカがバカと気づいていない、知識があると思い込んでいるのが
バカだと私は思いますよW
バカじゃないなら教えてくださいな
713 :
デフォルトの名無しさん :2007/01/07(日) 02:22:57
ShowWindowでもタスクトレイにアイコン化されたものを 元のサイズに戻せないんだけどどうすればいい?
今夜はいつもに増して乳臭い流れだな
715 :
695 :2007/01/07(日) 02:23:41
表示させる前提がタスクトレイのアイコン削除だから 頑張って削除できるようにしろとしかいいようがない。おじさん寝るよ
716 :
695 :2007/01/07(日) 02:24:45
バカの定義 バカがバカと気づいていない、知識があると思い込んでいる
718 :
659 :2007/01/07(日) 02:27:51
719 :
659 :2007/01/07(日) 02:29:49
>>715 ツールバー内の何番目のアイコンがどのプログラムかなんて
調べれたら、そりゃTB_DELETEで削除はできますけど
どのアイコンがどのプログラムかなんて調べようとしたら大変で・・・
とにかくお休みなさい。
ありがとうございました
720 :
695 :2007/01/07(日) 02:31:30
>>718 残念だがおじさん他プロセスのNOTIFYICONDATAの取得
なんてやったことないからわからない。
そうかマクロか。
689だが・・・書き忘れた事があって来たんだが・・よくわからん事になってるなぁ。 sleepかませないとうまくいかない事が多いよ。数値はマシンによって違ってくるケースもあるから そこら辺はてきとーに。漏れは100程度にしてるが。 元の大きさに戻らないって事だろ? って事はハンドルは取得出来てるって事だよな。
>>711 uCallbackMessageはクリックしたときに送られるメッセージの中から推測するしかないだろうね。
そのwParamがuID。lParamにはそのアイコン上のマウスメッセージが入ってる。
WM_MOUSEMOVEって送られてきたっけ
すまん途中で書きこんでしまった。
もしWM_MOUSEMOVE飛んでくるなら、タスクトレイ上でマウス動かしまくれば、
lParamにWM_MOUSEMOVEの値(0x0200)で大量にメッセージ来るからわかるはず…
メインウィンドウじゃないウィンドウに通知させてるかもしれないなら、
これでプロセスに属するウィンドウ調べてSPY++で補足とか。
http://www001.upp.so-net.ne.jp/yamashita/product/debug/ww.htm SPY++って単純にウィンドウの列挙で、どのプロセスかは開かないとわかんなかったよね?
いま、手元にSPY++ないんで見当はずれのこと言ってたらスマソ。
724 :
659 :2007/01/07(日) 03:28:28
>>721 フォーム自体は元のサイズに戻るし表示もされるけど
そのアプリが描画する処理をしてくれないんです
たとえば、そのフォームのステータスバーの時間が止まったままになってるとか
で、アイコンを直接クリックすれば、描画が始まるという具合です
sleep?どのsleepの意味ですか?
>>722 監視するのはそのアプリのハンドルでいいんですよね?
タスクトレイのツールバーや、その中のアイコンボタンってことじゃないですよね?
アプリに対してはWM_*MOUSE*関連のものは一切送られてないです
WM_APP AM_ACTIVATEAPPとか、でもこれはアクティブになるウィンドウと
非アクティブに送られるものだから違うだろうし
あとは描画させるためのWM_ERASEBKGNDやらサイズ変更を促すものやら
SHOWWINDOWも送られてくるけどuIDらしきものがないんです
>>723 > lParamにWM_MOUSEMOVEの値(0x0200)で大量にメッセージ来るからわかるはず…
送られてきてないです
> メインウィンドウじゃないウィンドウに通知させてるかもしれないなら、
> これでプロセスに属するウィンドウ調べてSPY++で補足とか。
>
http://www001.upp.so-net.ne.jp/yamashita/product/debug/ww.htm ありがとう、調べて見ます
> SPY++って単純にウィンドウの列挙で、どのプロセスかは開かないとわかんなかったよね?
私はSPY++じゃなくて、WispectorSpyを使ってます
これはvisibleでない子ウィンドウは表示されないです。
本当にここは使えないインターネットですね
>>724 オメーそれ対象のアプリがどのタイミングでどのウィンドウに
どのメッセージを受けたときにどうやってタスクトレイから
アイコン消してるかがわからなきゃ一生無理じゃねーか
SPY系のツール使って普通に操作してタスクトレイから復元したときの
メッセージの流れ追うしか解決方法はない
隠しウィンドウが独自メッセージ送ってるかもしれんぞ?
>>724 そのアプリ所有のウィンドウね。フォームのウィンドウに通知させてるとは限らないよ。
メッセージはWM_*MOUSE*ではなくて、ユーザ定義のメッセージね。
WM_USER + xxxとかWM_APP + xxxとかなってると思う。
そのlParamにマウスメッセージが入ってる。
ツール上だと、WM_MOUSEMOVEみたいに表記されず単に数値だから注意。
WM_MOUSEMOVE飛んでくるようだから、
WinspectorSpyのProcessタブから、そのアプリのウィンドウ全部監視して、
タスクトレイのアイコン上でマウス動かせばわかると思うよ。
(クリックして元に戻すと、いろんなメッセージ飛ぶから戻さないこと)
728 :
659 :2007/01/07(日) 04:43:44
>>727 どうも参考になります
processタブ開いたことなかったけど、こっちのが使い易いですね
調べて見ます
ありがとう
729 :
659 :2007/01/07(日) 05:41:02
>>727 言われたとおりやってみたらばっちしでした^^
メッセージを送っているウィンドウは別にありまして
それを監視したらちゃんともとのサイズに戻りました
ほんとにありがとう
親切に教えるからつけあがるんだ
やさしいお兄さんお姉さんが答えてくれる かも
かわいい妹かもしれん
735 :
659 :2007/01/07(日) 11:02:33
終わったんで風俗逝ってきまつ
本当に本当に本当にこのスレは馬鹿豚どもの集まりだなwww 恥ずかしすぎて見てられないwwwww
737 :
デフォルトの名無しさん :2007/01/07(日) 11:05:20
教えてください UNIXのメッセージに相当するWinAPIは名前付パイプであっているでしょうか?
いいえ、名つきパイプはメッセージではありません。
740 :
デフォルトの名無しさん :2007/01/07(日) 13:09:57
>>729 何に何をしたら思ったとおりにうごいたのん? そして、どこにつまづいたといった反省点は?
同じ道を歩むかもしれない人の為に、詳しく報告すべきじゃない?
質問したからにはどう解決したのかちゃんと書こうよ。これだけ引っ掻き回したんだしさ。
まあ、待て 今ソープ中だ
特定のアプリに対してだけ何かしたかったんじゃないのかね これに汎用性のある手段は無いからな。 だったらそう書けばいいのに。 最近、単純な質問をして後から別プロセスだと情報小出しにするやつが多いが同じ人なのかね?
同じ人種なのは確かだ
スレ違いかもしれんがSFU使ってるやつっているか?
「かも」じゃない。
かと言ってUnix板とも違うし、 より妥当なところがあるなら案内してもらえるとありがたい。 で、SFU上では通常のWindows APIを呼ぶことってできるの?
普通にコンソールアプリとかWSHのスクリプト作って呼ぶだけじゃだめなの?
一般的にWM_PAINTメッセージでペイント描画を行うときに、何ms以内に処理を終えれば、もっさり感がないでしょうか?? もちろん、アプリケーションの種類によりますが、Notepadもどきのようなものを作っております。 よって、スクロールバーによるスクロールができればいいなと思っています。 まだ、実装していないのですが、スクロール時にWM_PAINTでの描画にもたつき、 スクロールがカクカクになるの嫌だなぁと思って、最大でも何ms以内に処理を終える目標を立てればいいのかなぁ考えています。
そんなもん実装する前から悩まんでもいいよ。 完成した後で、もっさりが問題になってからチューニングすればいい話だし。 そもそも応答時間なんて環境依存なんだから、目標なんて設定しようがない。
俺なら設計の段階で軽くテストしてモッサリ感がなさそうなのを確認してから作る。 設計ミス > 一応完成 > チューニング > 絶望ってのが一番凹む。
ダブルバッファリングして遅かったら描画処理の部分を疑う程度しかやらねぇ
752 :
659 :2007/01/07(日) 19:08:43
>>740 動画エンコ用のソフトを複数使っているので
その一連の作業を自アプリだけで行おうとしたのが目的です
別々に開いたり閉じたりするのも面倒なので
複数のアプリをボタンひとつで画面に整列させてやりたかったわけです
解決方法は怪しいフォームのプロセスを監視状態にして
タスクトレイのアイコンの上にマウスポインタを移動させて
MOVEイベントが送られているフォームを見つけて
アイコンをマウスクリックで元に戻し
そのときに出てきたWM_USERのパラメータで
SENDMESSAGEを送ってやった次第です
反省点はフォームに直接ShowWindowメッセージを送れば
アイコンが元に戻ると思い込んでたのが間違いでした
すべてのフォームにrestoreメッセージを送っても反応がなかったので
頭から省いてしまっていたわけです
実際にはクリックされたというメッセージを送らなければ
アイコン削除処理をしてくれなかったわけです
どうもありがとうございました
気持ちよかった?
>>748 です。わかりました。とりあえず、実装してみます。
今の実装では、WM_PAINT時にExtTextOutを何度も呼び出すつもりですが、ちょっとExtTextOutだけの
テストアプリを作り、試しに1000回呼び出す時間を計測したところ、それだけで50ms近くかかってたので、
うほぉ。っと思ってました。表示するテキストの内容にもよりますが、超最悪1万回とかいったらどうしよう
とか考えてた次第です。もちろん、ExtTextOutでの描画をまとめるのが筋ですが、
それをやると、ある問題が発生するので、どうぴよー。と思ってました。
とりあえず、先に実装してみます。
755 :
デフォルトの名無しさん :2007/01/07(日) 19:35:54
うほぉ。 どうぴよー。
仕事中ってそういう意味不明なワードが口を付くから困る
あん どゥ トろワ?
カトル!
やかん?
>>746 サブシステムが違うので無理です。POSIX APIとネイティブAPIしか呼べない。
ネイティブAPIもWin32サブシステムでの動作を前提にしてると
思わぬ落とし穴にはまるかもしれない
762 :
746 :2007/01/07(日) 21:31:47
>>754 速いテキストエディタを作った事のある俺が答えてやろう。
Unicodeを使え。文字列を描画する場合は、1文字ずつではなく極力まとめて描画しろ。
メモリの確保破棄は発生しないように設計する。
文字幅の計算系のAPIはとても遅いので、自前で位置を計算する場合は取得結果をキャッシュする。
オフスクリーン(ビットマップ)に描画イメージを作成してから、ディスプレイに転送するとフリッカーが発生せずにさらに速い。
文字入力したときなどは変化した部分だけ描画。とにかく更新の必要のない部分は描画を行わない。
まあ、基本だね。
HRESULTの値ってどう意味を持つのですか? それとHRESULTが含まれるコードによくS_OKとかくっついてることが多いのだけど BOOL値のTRUEような感じなんですかね? ざっくりとでいいですから解説オナガイシマス
765 :
デフォルトの名無しさん :2007/01/07(日) 23:32:09
ファイラーなどで、ファイルの一覧をListViewで表示しているものがありますが、 さらにファイルを右クリックすると、エクスプローラのコンテキストメニューが出てくる ようになってるソフトがありますが、あれはどのようにして実現しているのでしょうか?
ちなみに、「ファイラー」というのはWindows非標準のファイル管理ソフトやアーカイバのことを指したつもりです。
>>764 関数の成功判定をBOOLで返した場合、失敗してもFALSEしか戻せないので
何に失敗したかの情報を戻り値に含められない。
HRESULTはS_OK以上なら成功、S_OK未満なら失敗を表すための型で
何に失敗したかなどを意味する数値が色々defineされている。
HRESULTがS_OK以外にどんな値を返すかは関数次第。
単純に成否判定をしたい場合は
SUCCEEDEDマクロ(成功ならTRUE)かFAILEDマクロ(失敗ならTRUE)を使う。
あ、ちなみに失敗してもその後の実行に支障がなさそうな場合とかに 「S_OK以上の失敗コード(例えばS_FALSE)」を返してくる場合もあるんで FAILEDマクロだけで成否判定してると部分的な失敗とかを取りこぼすことがあるんで どんな値が返ってくるのかちゃんとドキュメント嫁。
>>763 >文字幅の計算系のAPIはとても遅いので、
横槍ですまぬが、具体的にはどの関数でしょうか?
すごく・・・興味あります。
>>764 http://msdn2.microsoft.com/en-us/ms690088.aspx HRESULTの値はようするに最上位ビットが立っていれば失敗、そうでなければ成功を表す。
あとは予約部分、Microsoft定義かどうか、種類 (FACILITY)、コードの部分に分けられる。
(機会は滅多に無いだろうけど)自分でHRESULT型の定数を作るときにはFACILITYを独自の値にする必要がある。
HRESULT型の定数の名前は、失敗の場合基本的にナントカ_E_カントカという形式だが、一般的なものはE_カントカという形式。
と言っても実際はE_カントカばかり目にする気がする。
(ナントカには種類名が入る: OLE_E_WRONGCOMPOBJとか)
もっともFAILED/SUCEEDEDマクロを主に使うので定数を直に使うこと自体少ないと思う。
成功の場合はS_ナントカ。標準ではS_OK以外にもS_FALSE(メソッドの呼出は成功したけど……)というのがある。
あとHRESULTなどをいじるマクロ。
http://msdn2.microsoft.com/en-us/ms528334.aspx
>>770 GDIだとGetCharABCWidths, GDI+ならGdipMeasureString
>>772 >自分でHRESULT型の定数を作るときにはFACILITYを独自の値にする必要がある。
勝手に作っちゃダメよ。
>Status codes in facilities other than FACILITY_ITF can be defined only by Microsoft.
>>765 >>766 IContextMenu2, IShellFolder.GetUIObjectOfあたりを調べなはれ
>>763 >>754 です。Unicodeでダブルバッファリングはしてます。で、今巨大な横幅のデータを食わせてみたのですが、
やはり、横スクロールしていくと、だんだん、遅くなってきています。
横に5000文字あたりのところでついにはもっさり感が・・
今の実装は毎回横幅を取得してるので、右端の方にいけばいくほど、描画のための呼び出し回数が増えてるっぽいです。
おっしゃる通り、まとめてキャッシュする方向でいきます。今はテキストを強調表示のためパーサーにかけてるのですが、
パース後にキャッシュします。今の段階では描画より、幅の取得に手間取ってるっぽいので、
とりあえず、まとめずにキャッシュしてみます。それでも駄目ならまとめます。
ありがとうございました。
画面を3ペインくらいに区切りたいのですが、 何で検索すれば幸せになれますか?
nande ムダに 改行が 多いの
>>767 >>768 >>769 >>772 >>774 >>764 です
詳しい解説ありがとう
HRESULTの値の意味は関数が失敗した時の値を詳細に明示するものと理解しましたが
果たして、この関数の使い所はどういう場面でなのだろうかとふと、疑問に思いました
確かにデバッグ時、関数内のどこの処理が上手くいっていないのか等、分かるのは
便利だとは思うのですが、他にはどういう目的や場面で使われるものなのでしょうか?
文章を推敲していると、何故か文末に改行が増えるな。
>>780 失敗する理由が複数考えられるときは、区別できる値を返さんと、ユーザに通知もできんじゃろうが
>>782 >>780 です
やっぱりマネージドC++/CLIのtry、catch、throw見たいに例外処理とかエラーを表示するのが目的?
784 :
770 :2007/01/08(月) 01:42:31
>>783 確かにアンマネージドなC/C++より高水準の言語ではたいてい例外にマップされる
786 :
デフォルトの名無しさん :2007/01/08(月) 06:00:30
【ネガティブ派遣根性チェック】 3つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。 □偽装派遣先の社員の意見にはたとえ間違っていても反対しない □偽装派遣先から「いつまでもここで仕事してくださいね」と言われるようになりたい □自社に仕事を持ち帰れるように言われるとムカつく □自社で仕事なんてできるわけがない □派遣/受託の差異を指摘する人間はムカつく □偽装派遣先には仕事だけでなく自分のプライベートについても指示して欲しい □自分の月額金額を知らない □偽装派遣先社員より自分の生涯収入が低いのは当然だ □偽装派遣先に尻尾を振り、いつまでも一緒に仕事をすることが大切だ □今のプロジェクトが終わっても同じ偽装派遣先に常駐したい
全問正解したのでなにかください
つ VisualStudio .NET 2002
789 :
デフォルトの名無しさん :2007/01/08(月) 11:54:33
>>787 早く自分の会社へ帰れ!!
でないと人間腐るぞ!
え?えっ…? 何これ?デジャビュ?
標準のエディットボックスを右クリックして出てくるメニューに オリジナルのメニュー項目を追加するのってどうやればいいですか?
>>777 スクロールはBitBltかScrollWindowExを使用して更新領域を最小限に抑える。この方法で実装しないと遅いよ。
あと画面に表示されている行だけでも、位置情報をキャッシュするようにすれば再計算しなくていいので速くなる。
>>777 です。
あれから、パーサーで切り出されるトークンをフォントのスタイルと色が同じならある程度にまとめて、
それから幅を取得しにいったら、ついに前回の5000文字の壁を越えて、横方向に1万文字あたりでスクロールさせてももっさり感がなくなりました。
でも、やっぱ、幅を毎回取得してるので2万文字あたりでまたもっさり感が・・・やっぱ、キャッシュするしかなさそうですね。
はぁ。
>スクロールはBitBltかScrollWindowExを使用して更新領域を最小限に抑える。この方法で実装しないと遅いよ。
>あと画面に表示されている行だけでも、位置情報をキャッシュするようにすれば再計算しなくていいので速くなる
ScrollWindowExですか、使った事ありませんでした。スクロール時は毎回画面を再描画してるので。
調べてみます。ありがとうございます。
すみません、もしわかる方がいらっしゃったら教えてください。 CreateProcessで起動するプロセスに対して何らかの識別コードを付加したいのですがいい方法はないでしょうか? 例えば自分のプログラムからNotepad.exeを起動したときに、他のプロセスからも自分のプログラムから起動したことを知ることができるようにする「マーク」のようなものをつけたいのです。 起動するプログラムは既にバイナリイメージなのでソースレベルで手は加えられない制約がある状態で起動元のプログラムから何とか「紐付け」をしたいのです。 何か良い方法がありますでしょうか?
>>795 イメージなら、バイナリデータの一番最後に文字列加えても問題ない
それで認識すれば?
>>796 レス有難うございます。
起動するプログラムは任意に変わるのと、バイナリには手を加えられないのです。
今、考えてる方法は、STARTUP_INFOのReservedメンバに識別する値を入れ、後でPIDからそのプロセスのSTARTUP_INFOを取得して識別できないかとか、
プロセス起動前に環境ブロックに独自の環境変数を設定し、それを起動するプロセスに継承させたあとに、なんらかの方法で目的のプロセスの環境ブロックを読み出す(そうゆうAPIはないのでハッキングする)とかを考えています。
もっとスマートでよい方法がありそうなのですが…
>>797 データをテキストに書き込んで、別のプロセスで読み込めばいいだけじゃん
DLL injectしてPIDなどでユニークな共有メモリ作成してタグを作ったらどうだろうか
>>798 レス有難うございます。
起動元プログラムからデータをファイルやメモリを経由して他のプロセスから読み取る方法ですと、
例えば、もし起動したプログラムが終了してそのPIDが無効になった後に、新たに起動されたプログラムのPIDがユニークになる保証がないため、誤認識してしまう恐れがあります。
>>799 レス有難うございます。
CreateRemoteThreadなどで起動先のプロセス空間にDLLを注入にしてしまえばいいのですが、
識別用の32ビットのコードを知るためだけにDLLを注入するのはやや大変かと思ってすこし腰が引いています
でも、やっぱり起動先プロセスにDLLを打ち込まないと無理そうならやるしかないか…
>>797 起動したプログラムの保持と、その終了を監視する第3のプログラムを裏で動かしとけば?
>>801 レス有難うございます。ちょっと説明が長くなってもうしわけありません。
実はこの起動元プログラムとは、プロセス群を監視し、プロセスに異常終了した場合に再起動を行うプログラムなのです。
そしてこのプロセス監視プログラムはJobオブジェクトを作成し一連のプロセス群を一括管理していています。
今、問題となっているのは「もしこのプロセス監視プログラムが異常終了してしまった場合」に
プロセス監視プログラムを再立ち上げなおした後に、既に存在しているJobオブジェクト内で動作しているプロセスの一覧をチェックして、
プロセス監視プログラム内の情報と整合性をあわせる必要があるために各プロセスにユニークコードを埋め込んでおきたいのです。
レスを頂いた「その終了を監視する第3のプログラムを動かす」というのは対処方法としてはいいのですが、
もしその第3のプログラムにも異常が発生した場合には全く同じ問題がおきます。
本来、プロセス監視プログラムから起動されたプロセスを一意に識別さえできれば、
解決できる問題なのでその方向で解決したいと考えています。
監視プロセスを監視するプロセスを準備したり、2プロセスで監視など、多重化するほうがいいんでない?
>>802 >>799 の案だけど、DuplicateHandle使えばDLL injectしなくても共有メモリ放り込めるかも。
MSDN読んだだけで試してないけど。
オレも監視プロセスを複数にした方がいいと思う 2プロセスなら片方落ちても再起動した後でメッセージとかのプロセス間通信で同期とれるしな
複数プレイか!
>>803 ,805
レス有難うございます。
確かに多重化したほうが堅牢でいいのですが、本質的な問題が解決されてないことが気になります。
>>804 参考情報、有難うございます。
DLLを注入する方法は何通りかあるようなので、今後、解決策が見つからないようであれば試したいと思います。
>>807 PIDだけじゃ一意であることを保証できないのが問題なら、
プロセスの生成日時とかと併用じゃダメっすかね?
win32的にどう取得するのかわからんけど、
WMIのWin32_ProcessにCreationDateというのがあるみたいだ。
WMIのこともよくわからんけど。。。
まあ、これで理論上完全に保証できるかっていうと無理だけど。
809 :
801 :2007/01/09(火) 10:01:10
>>802 (1) 子プロセスを起動
(2) 子プロセスごとのユニークな名前でCreateFile(..,CREATE_NEW,..,FILE_FLAG_DELETE_ON_CLOSE...)
(3) DuplicateHandleで(2)のハンドルを子プロセスに継承
(4) 親側の元ハンドルは閉じる
これで、子プロセスが落ちると自動的にファイルが削除される。
ファイルの置き場所と命名規則を決めておけば、どのプロセスが生きているかわかる。
個人的な感想としては、
>もしその第3のプログラムにも異常が発生した場合には全く同じ問題がおきます。
まで問題となるような状況で”Windowsで(は)大丈夫?”と聞きたくなる。
mutex
>>809 レスどうも有難うございます。なるほど、これはいいかもしれないです!
今さっきまで、NtQueryInformationProcessで子プロセスのPEBのアドレスを取得し、
子プロセスのメモリ空間から環境ブロックをReadProcessMemoryする方法ができないかを考えていましたが、
FILE_FLAG_DELETE_ON_CLOSEの仕様を確認してよければCreateFileの方法のほうがずっとスマートなのでこちらの方法にしようかと思います。
809さん、本当に有難うございました。
Spec Fixまでまだ時間があるので他の方法も一応検討をしてみます。
>まで問題となるような状況で”Windowsで(は)大丈夫?”と聞きたくなる
色々しがらみがありまして…
フェイルオーバークラスタリングで別マシンでも並行稼動させるのと、
Jobでクォータ管理してOSへダメージが波及しないようにしようかと思います。
ち・ちんぽ
813 :
デフォルトの名無しさん :2007/01/09(火) 14:55:09
はじめまして。 僕は今チャットウィンドウを作っていて、 文字を打ち込むためのエディットボックスなどはCreateWindow関数を用いて作りました。 そのため、位置などは、数字を打ち込んで確かめて調整していかなければなりません。 もっと、視覚的にメインウィンドウをレイアウトしたいのですが、 この方法しかないのでしょうか? 親ウィンドウをリソースエディタでダイアログボックスとして作ってもいいのでしょうか? どなたか返答お願いします。
>>813 >親ウィンドウをリソースエディタでダイアログボックスとして作ってもいいのでしょうか?
それはあなたが作ってるアプリの仕様次第。好きにしたらいい。
>>813 最初にきちんときめちゃえばいいじゃん。
>>813 初心者はまず見た目から作ろうとするけど
まずは何をするのかを考え
それに必要なデータなどを格納するオブジェクトを宣言し
そして初めて外見を作っていく
こうするとスムーズにプログラミングできる
外見を作りながらやると、後で機能を増やしたいとか
仕様を変更したいとかなると面倒なことになり
また1から作り直すことになる
頭の中だけで考えず、ヘタでもいいので絵に描いたり
何ができるか箇条書きすることを薦める
>>813 ダイアログをメインウィンドウにしたアプリケーションを
俗に「ダイアログベースアプリケーション」と言って
Windowsではよく使われる手法。何の問題もないよ。
>>813 >そのため、位置などは、数字を打ち込んで確かめて調整していかなければなりません。
フォントが変わると(同じフォントでもOSが変わったりユーザー設定が変わったりすると)正しい
位置が変わる。だからプログラム中で固定値の指定はNG。
面倒だけどGetSystemMetrics()などで取得した値から計算で位置等を決めるように。
ダイアログをメインウィンドウにするのはOK。
文字変換で迷って伊いますBSTRの指すアドレスに文字列が入っているんだけど どのように取り出してMessageBoxで見ることが出来ますか? 教えてくださいオナガイシマス
今まで、レジストリ関係のソフトと、 画像処理系と、ゲームしか作ったことがないのですが、 httpを利用して、情報を取得したいと思ってます。 既存のwebページから読み込むということです。 そこら辺の知識は皆無なのですが、何で検索すれば、 大まかな概要と、手順を見つけることができますか。
823 :
デフォルトの名無しさん :2007/01/09(火) 18:05:19
>>827 環境によって出来合いのものを利用できたりするからな
>>820 です
3日具具って
BSTR pfoo;
char choge[ 256 ];
::ZeroMemory( choge, 256 );
int n = WideCharToMultiByte( CP_ACP, 0, pfoo, SysStringLen( pfoo ), choge, sizeof( choge ) - 1, 0, 0 );
MessageBox( NULL , ( LPTSTR )pfoo, "Kitty on your lap.", MB_OK | MB_TOPMOST );
このようにしたのですが結果が出ません(何も表示されません)
よろしくお願いします。
>>829 なぜpfooをMessageBoxに渡しているのだ?
>>822 多分InternetReadFileExとかで用が足りるんだろうけどな
BSTR=WideCharだってわかってるなら MessageBoxW使えばいいだけじゃないのか
833 :
826 :2007/01/09(火) 18:48:07
>>831 すまね。 WinINet の存在を知らなかった…
835 :
813です。 :2007/01/09(火) 22:33:44
いろいろ言ってくれて助かりました。 ありがとうございます。
836 :
デフォルトの名無しさん :2007/01/09(火) 22:45:42
WinAPI32の初心者です。 リストビューにアイコンを表示したいのですが、 どうもうまくいきません(1日中やってました) 実行しますと、アイコンが表示される場所が空白になっています。 アイコンのサイズもしっかり確認しました。 ソースはこちらです↓ LV_COLUMN lvcol; LV_ITEM item = {0}; HIMAGELIST hImg; hList = CreateWindowEx(WS_EX_CLIENTEDGE , WC_LISTVIEW, "", WS_CHILD | WS_VISIBLE | LVS_REPORT, 400, 50, 140, 300, hWnd, (HMENU)IDC_EDIT3, hInst, NULL); //コモンコントロールの初期化 InitCommonControls(); //イメージリストを作成 hImg = ImageList_Create(16 , 16 , ILC_COLOR8, 1 , 1); //イメージリストにアイコンを追加 ImageList_AddIcon(hImg , LoadIcon(hInst , MAKEINTRESOURCE(IDI_ICON1))); ListView_SetImageList(hList , hImg , LVSIL_SMALL); lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT ; lvcol.fmt = LVCFMT_LEFT; lvcol.cx = 100; lvcol.pszText = "Member"; lvcol.iSubItem = 0; ListView_InsertColumn(hList, 0, &lvcol); item.mask = LVIF_TEXT | LVIF_IMAGE ; item.pszText = "dud"; item.iImage = 0; ListView_InsertItem(hList, &item);
>>836 ImageList_AddIconの戻り値はイケてる?
>>836 おかしいとこ無いんでそのまんまコピペしたらちゃんと出たぞ?
アイコンの16x16にはちゃんと絵が入ってる?
>>820 Win32/64のBSTRは、単にWCHARへのポインタと見なして扱える(ただしその逆は真でない)。
>>832 の補足になるが、MessageBoxWは9xにも実装されているので、躊躇せず使える。
840 :
836 :2007/01/09(火) 23:15:26
>>837 戻り値は「-1」で失敗してることが分かりました。
でも、なぜ失敗しているんでしょうか??
>>840 アイテムを挿入するメモリ領域を確保してないから
842 :
837 :2007/01/09(火) 23:20:33
843 :
836 :2007/01/09(火) 23:25:51
>>837 僕の今読み込んでるアイコンは16x16の256色です。
ということは、
hImg = ImageList_Create(16 , 16 , ILC_COLOR8, 1 , 1);
↑この部分に問題があるのでしょうか?
844 :
836 :2007/01/09(火) 23:28:07
読み込んでるアイコンのプロパティを見たら ビットの深さが32になっていました。 どうしたらよいでしょうね?
>>840 IDI_ICON1のプロパティを確認。
めんどくさかったら、 ILC_COLOR8を
ILC_COLOR16か ILC_COLOR24か ILC_COLOR32か ILC_COLORDDBに変えてみて、
IDI_ICON1が何ビットフォーマットか調べてみる・・・などなど。
アイコンのツールは何を?
847 :
836 :2007/01/09(火) 23:33:38
>>846 アイコンのツールってなんでしょうか?
VCのリソースエディタで編集してましたが・・・
>>847 Visual Studio 2005を使っているのなら、
リソースエディタ上部、メニューより、
[イメージ(I)]→[現在のアイコン イメージタイプ(E)]で16x16、16色を選択。
なければ[新しいイメージ タイプ(W)]で追加。
849 :
836 :2007/01/09(火) 23:35:43
ILC_COLOR16か ILC_COLOR24か ILC_COLOR32か ILC_COLORDDB に変えてみましたが、全部ダメでした。 ImageList_AddIcon(hImg , LoadIcon(hInst , MAKEINTRESOURCE(IDI_ICON1))); ↑ここをデバッグボックスで表示されたら -1 になっています。 やはり、ここで失敗しているようです。
VCだったら、アイコン編集でイメージメニューに 現在のアイコンメニューの表示とか 新しいアイコンイメージの追加という項目があるだろ それいろいろいじってみ
ないとは思うが画像ファイルの拡張子を.ico に変えるだけじゃだめだぞ? (ウソだと思いたいがマジにいたから言っておくんだが)
852 :
836 :2007/01/09(火) 23:43:45
やはりダメです(>_<) どうやっても表示されません・・・。
853 :
836 :2007/01/09(火) 23:46:14
>>851 それは大丈夫です!
それから、16x16、16 色 にしっかりしてもダメみたいです・・・
おいおい、16色は ILC_COLOR4 だぜ?
IDI_ICON1 の宣言ミスとか?
ワロスw
858 :
836 :2007/01/09(火) 23:52:44
>>855 それもないようです!
IDI_ICON1 はもうすでにウィンドウのタイトルの方で使っていて
そちらの方ではアイコンが表示されています。
リストビューにだけ表示されません・・
HIMAGELIST型のhImgのスコープなどなど
860 :
836 :2007/01/09(火) 23:56:25
スコープってなんですか(@_@。 すいません・・・初心者で・・
リストビューに表示されないのが問題なんじゃなくて ImageList_AddIconが失敗するのが問題なんだろう? GetLastError() の値はどうよ。 アイコン全種類追加してしまえ
>>860 これをhInstが宣言されている近くに。
(
>>836 の関数から外に出すの)
static HIMAGELIST hImg = NULL;
863 :
836 :2007/01/10(水) 00:06:02
>>862 それでもだめです・・・
ちなみにGetLastError()とは・・・
googleを知らないんだろうか
GetLastError() 簡単に理解したいなら最後に出したエラーコード吐き出しみたいなものと認識してればいい 因みにFormatMessage使えばエラーコードのメッセージ吐き出してくれるよ
867 :
836 :2007/01/10(水) 00:09:24
アイコン全種類追加したらできました ありがとうございました
ウィンドウに貼り付けたエディットコントロールが 左右キーのイベントを拾ってくれないバグに悩んでます。 上下を押すと左右に移動するのですが・・・
スコープ 変数の寿命みたいなもの staticで宣言した変数なんかはまさに不死身 static=癌変数と思えばいい そのほかローカル変数、グローバル変数とかあるけどそれくらい自分で調べよう
870 :
836 :2007/01/10(水) 00:11:48
>>ALL すいませんね。 ご迷惑かけました。 出直してきます。 (できてませんけどw
COLOR4 = 4ビット = 16色 なのはわかってるのかなあ COLOR8 は256色な
というか変数スコープもしらないでwindowsプログラムに手を出してるのがすごい
>>872 いや、スコープって単語が何を意味しているのかを知らないだけかも?
僕ハッカー
GetLastErrorのFormatMessageぐらい晒してから逝って欲しかったな
879 :
868 :2007/01/10(水) 00:30:06
ダイアログ自体を子コントロールとして他のウィンドウに貼り付けるのって良くないかな?
>>879 メッセージの中継をするようになってればいいとおもうけど
>>797 もう見ていないと思うけど、STARTUPINFOの予約メンバについて調べてみた。
cbReserved2はlpReserved2の長さを指定している。
なので、lpReserved2に任意のデータ構造体を指定して、
cbReserved2にそのサイズを指定すれば、任意のデータを送れる。
まぁ、将来の仕様変更で使えなくなる可能性はあるが。
>>879 SetParentでそれっぽい事ができそうな気がする。
>>879 リソースエディタで チャイルドスタイルにして
CreateDialog(.... 親窓)
は良くやるな。
TABのフォーカス周りをちゃんとしようとすると、IsDialogMessage() 利かさなきゃいけないけど
884 :
882 :2007/01/10(水) 16:10:42
885 :
795 :2007/01/10(水) 19:51:07
>>884 レス、有難うございます。もしかしたらレスがつくかもと思ってまだ見てました
MSのCランタイムがランタイムでオープンしたファイルハンドルを子プロセスに継承させる情報を伝えるために、
プロセス初期化時にlpReserved2を使って細工をしているなので、このままでは大部分のプログラムで問題が起きそうですね。
とりあえずはcbReserved2を使えば良さそうなのと、ページの最後に説明されているように、
lpReserved2に渡すバッファの先頭をポインタサイズでnullにすることに取り決めておけば使えるようです。
cbReserved2もしくはlpReserved2のいずれを使ってもGetStartupInfoで取得できそうですが、
GetStartupInfoは自プロセスのみに使える方法なので、他のプロセスからSTARTUPINFOを覗くにはPEBをハックして引きづり出すか、
ターゲットのプロセスにDLLを注入してGetStartupInfoを実行させないと取得できないかもしれません。
やっぱりこのあたりに行き着いてしまうようです。
とはいえ、884さん、とても参考になる情報を有難うございました。
現在、PrintDlgで選択したプリンタと設定でメタファイルを印刷する処理を作っています。 そこでDEVMODE構造体のdmPaperWidthとdmPaperLengthが dmOrientationの設定によって入れ替えるプリンタと入れ替えないプリンタがあるのですが、 その入れ替える・入れ替えないを取得する方法はありませんか? DeviceCapabilitiesでDC_ORIENTATIONを指定すれば 取得できるかと思ったのですがどちらのプリンタも90が帰ってきました。 またdmFieldsも両方でDM_ORIENTATIONが設定されていました。 それと、dmPaperWidth、dmPaperLengthがdmOrientationの設定によって入れ替わらない場合、 メタファイルを90度回転させてから出力する必要があるのですが それはどのようにすればできますか? 以上2点、ぐぐるヒントでもいいので教えてください。
887 :
886 :2007/01/10(水) 20:23:36
現在使用しているソースです。(変数の宣言や初期化は行数節約のために省略しています) //A4横方向を設定 if(PrintDlg(&printdlg)) { pdv = (DEVMODE)GlobalLock(printdlg.hDevMode); rect.Bottom = pdv.dmPaperLength; // ※2100と2970のどちらかになる rect.Right = pdv.dmPaperWidth; // ※2970と2100のどちらかになる StartDoc(&docinfo); StartPage(printdlg.hDC); hEMF = GetEnhMetaFile((LPCTSTR)metafile); PlayEnhMetaFile(printdlg.hDC, hEMF, &rect); DeleteEnhMetaFile(hEMF); EndPage(printdlg.hDC); EndDoc(printdlg.hDC); GlobalUnlock(printdlg.hDevMode); GlobalFree(printdlg.hDevMode); GlobalFree(printdlg.hDevNames); }
>>887 して、pdv.dmOrientationは調べた?
>>886 プリンタでやったことないけど
SetWorldTransformでできないかなー
MIDIを再生したいのですが、どうすればいいんでしょうか? ググってもパッとしたものが見つからなかったもので…
ああ、MCIか。スマソ
細かい制御がしたいなら midiOutOpen()して midiOutShortMsg()とかすれば ほぼなんでも可能
mciならこんな感じかも。 ダメソースだからちゃんと評価する処理にえんこうしてね。 MCI_OPEN_PARMS mciOpenParms; MCI_STATUS_PARMS mciStatusParms; MCI_PLAY_PARMS mciPlayParms; mciOpenParms.lpstrDeviceType = "sequencer"; mciOpenParms.lpstrElementName = ファイル名; ::mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms); mciStatusParms.dwItem = MCI_SEQ_STATUS_PORT; ::mciSendCommand(mciOpenParms.wDeviceID, MCI_STATUS,MCI_STATUS_ITEM,(DWORD)(LPVOID)&mciStatusParms); mciPlayParms.dwCallback = (DWORD)親ウィンドウ; ::mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID) &mciPlayParms);
コントロールのIDってウィンドウの中でユニークであればOK? たとえば、WindowAの中にControlB1とControlB2があって、 ControlB2の中にControlCがあるとする。 ControlB1とControlCのコントロールIDが同じだとまずいですか?
>>894 同じIDが複数あっても、IDで識別できなくなるだけで仕様的にはかまわない。
アプリ次第。
thx。あとコントロールIDの値の範囲って#defineされてましたっけ?
うん
うう、ぐぐっても出てこないっす。ヘッダ見てもどれだか・・・教えてください。
USBハンドセット(HID)のボタン情報を取得したいんですが、情報がなくて困っています。 使っているのはP1-Kというものです。 SetupDiEnumDeviceInterfaces()で見つけてCreateFile()でハンドルを得て、 HidP_GetCaps()で得たサイズでReadFile()してますが、ブロックされて帰って来ません。 同様の方法でジョイスティックのボタン情報は取れるのですが、やり方が間違ってるんでしょうか。
900 :
886 :2007/01/11(木) 09:24:03
遅レス失礼、886です。
>>888 dmOrientationを確認しましたが、どちらの場合も正しく設定されていました。
(縦方向ならDMORIENT_PORTRAIT、横方向ならDMORIENT_LANDSCAPE)
>>889 XFORM構造体を上手く設定できれば使えそうですね。ありがとうございました。
901 :
デフォルトの名無しさん :2007/01/11(木) 13:05:46
_____________ |_________−□×| |L | | |I | EDIT | |S | | |T | |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ↑このようなウィンドウを作ったとして、リストボックスとエディットボックスの境界線を ユーザが移動できるようにするにはどうすればいいのでしょうか
境界線をドラッグで移動した分だけListとEditの位置とサイズを変更する。
境界線をドラッグしたら、リストボックスとエディットボックスのサイズを調整するようなプログラムを組む。
特定の操作をしたとき、 アプリケーションを終了させたいです。 WindowProcedureを自分で作って、MSGの値によって、 PostQuitMessage()を呼ぶ。 メッセージループを GetMessage(...)>0 のとき繰り返すようにする。 のようにしていますが例えば switch(msg){ case WM_LBUTTONDOWN: PostQuitMessage(0); return 0; } としても、右ボタンクリックで終了しません。 そこで、ちゃんと実行されているのか確認しようと思って、 switch(msg){ case WM_LBUTTONDOWN: MessageBox(hWnd, TEXT("test"), TEXT("test"), NULL); PostQuitMessage(0); return 0; } としたら、1回クリックするとメッセージボックスが表示されて もう1度クリックすると、メッセージボックスが表示されずに終了しました。 何が起こっているのかわからないので、説明してください。
>>901 LISTとEDITの間に幅のちんまい自作コントロールを貼り…
自作コントロール側: ドラッグ処理後、親にドラッグあったことを通達
親:通達をうけて、LIST/自作コントロール/EDIT を再配置
>>906 すいません、文章のミスです。左クリックの間違いです。
>>907 だったらそのコードだけではそんな文章のようにはならない。
メッセージボックスが出た場合は、閉じたら即PostQuitなのでそのまま終了する
まああちこちにPostQuitMessage置かないほうがいいと思うけどね。
WM_CLOSE投げとけ。
∧__∧ ( ・ω・) いやどす ハ∨/^ヽ ノ::[三ノ :.'、 i)、_;|*く; ノ |!: ::.".T~ ハ、___| """~""""""~"""~"""~"
>>909 誰w
>>908 ということは別の何かが原因ってことですか。
WM_CLOSE投げたら、思ったように終了しました。
なんでだろ。
ありがとうございます。
>>904 たぶん、その問題とは関係ないけど
MSDNそのまま読むと、
GetMessage関数って-1は失敗だけど、それ以外は成功じゃね?
その記述だと、-2以下が帰ってきたらダメな希ガス
(そんな値が帰ってくるかどうかシランがwww)
>>912 なら
!= -1 が正解なのか。
でも、MS以外のサンプルだと>0ってのも良く見る。
>>913 ちげーだろ、
0のときループから抜ける、-1のときエラー処理、それ以外のときループしなければならないんだから。
とりあえず、WM_QUIT を受け取ったら 0 が返るからループ終了。 これだけは外せないベ
でも実際エラー処理なんてする?
918 :
デフォルトの名無しさん :2007/01/11(木) 19:02:42
質問です。VC7を使っています。 外部のプロセスのウィンドウに存在する、 SysListView32コントロールの選択状態を変更したく、 以下のマクロを用いて実行してみたのですが、 どうも反応がありません。 ListView_SetItemState(対象ウィンドウ,アイテム番号,LVIS_SELECTED,LVIS_SELECTED); なおこのマクロは、 LV_ITEM _ms_lvi;\ _ms_lvi.stateMask = mask;\ _ms_lvi.state = data;\ SNDMSG((hwndLV), LVM_SETITEMSTATE, (WPARAM)(i), (LPARAM)(LV_ITEM *)&_ms_lvi);\ のように定義されております。 この原因は、プロセス外のウィンドウに対し、ポインタを用いたメッセージを使用することにあるのでしょうか? また、リストビューの選択状態を外部から変更できる、別の正しい方法があるのでしょうか? ご教授下さい。
>>918 >この原因は、プロセス外のウィンドウに対し、ポインタを用いたメッセージを
>使用することにあるのでしょうか?
その通りじゃね?
920 :
デフォルトの名無しさん :2007/01/11(木) 19:22:38
>>919 ご返事ありがとうございます。
EditのSETTEXT等は上手くいっていたため、違うのではと思っていました。
それでは、このような場合の対処としては、どのようにすればよいか、ご存知でしょうか?
前に検索してみたときは、9x時代の情報でVirtualAllocというのを少し目にした事があるのですが、
今もこれを使うものなのでしょうか?
>>921-922 ありがとうございます。
リンク先のサンプルソースを改変して、無事希望の動作が出来るようになりました。
VirtualAllocExを使用する方法、初めは面倒くさそうに思っていたのですが、意外と簡単に出来て良かったです。
1.ウィンドウハンドルから、対象のプロセスの仮想メモリ読み書き可能なハンドルを得る
2.自プロセスと対象プロセスで共有メモリを作成
3.ローカルの共有メモリを好きなように書き換え、
WriteProcessMemoryでグローバルな共有メモリに上書き
4.SendMessageで共有メモリを使用する
5.解放
このような動きですよね。
今回非常に助かりました。ご助言や適切な参考リンクに感謝いたします。
本当に、ありがとうございました。
926 :
デフォルトの名無しさん :2007/01/11(木) 21:05:41
>>926 メニューハンドラから呼んで読み込むんでないの?
読んだらビットマップにしておいて、WM_PAINTでBitBlt()すればいいと思うよ。
もちろん、あなたのプログラムの構造によっていろいろやりかたもあるだろうけど
>>882 > まぁ、将来の仕様変更で使えなくなる可能性はあるが。
CRTが使ってるからそのCRTがサポートされる限りは大丈夫だと思うけど
アプリが勝手に使えないという結論に変わりはないな
>>885 > lpReserved2に渡すバッファの先頭をポインタサイズでnullにすることに取り決めておけば使えるようです。
これやるとVista x64でおかしくなる可能性があるからやめてくれ
詳しくは12月のCygwin ml参照
コンパイラとかのコンソールアプリから、 出力をリダイレクトするにはパイプでよかったよね?
>>917 GetMessage のエラー処理は「する」のが基本
GetMessageのエラー処理とはreturn -1;しているだけという俺のコード。
>>931 正直、それだけで充分。
それをしてないプログラムもあったりするのが現実なんだよ。
933 :
795 :2007/01/12(金) 00:34:48
>>928 レスどうもです。
lpReserved2のほうはVista x64で問題がおきる可能性があるのですね。
実はlpReserved2を使うほうは諦めました。
そもそもバッファを用意してその先頭をポインタサイズでnullにする方法はトリッキーすぎるかもしれません。
今のところ、下記の3通りの方法を考えています
@STARTUPINFOの読み出し方法は別途考えることにしてcdReserved2のほうはまだ諦めていません。
Aプロセス初期化時にDLLを注入してプロセスを識別できるように細工する方法も考えています。
B809さんに教えていただいたFILE_FLAG_DELETE_ON_CLOSEでCreateFileの方法も考えています。
どれも一長一短あり、まだ検討中です。もっとスマートな方法があるといいのですが。
>802の、ジョブとプロセスの整合性を取る、 というのがよく分からん。ジョブオブジェクトが存続し続けるなら、 そのような整合性を取る必要はないのではないのか?
935 :
795 :2007/01/12(金) 00:52:28
>>934 Jobオブジェクトはその中で動作しているプロセス群を列挙する方法や識別する方法がないので、
もしJobオブジェクトを握っているアプリ(プロセス監視プログラム)が異常終了してしまうと、
再起動した際にJobオブジェクトは認識できても、その中で動いていたプロセスであるかはわかりません。
そこでプロセスのどこかにどのJobオブジェクトに属してたのかを識別する方法として何らかの情報を打ち込んでおきたいのです。
もしJobオブジェクトからその中で動いてるプロセス群を識別する方法があれば、
各プロセスに「紐付け」する必要はないのですが…
プロセスがpidファイルに書き残すのがいいんだろうけど 死んだときにそのファイルが一緒になくなるとは限らないのが問題なんだよね
937 :
デフォルトの名無しさん :2007/01/12(金) 00:56:57
若いの。オラが村では派遣の問題を口にしちゃなんねーだ お前さんはまだわけぇから言いたいこともあるべぇ だべな、派遣問題を口にすると怒る者がおるでよぉ 問題の指摘は駄目だっぺぇ 派遣のことは口にしちゃなんねぇ この村みたいな田舎で生きていくためにはよぉ 駄目のものを駄目と言ってはなんねえだめさ
誤爆乙
ヽ / /⌒\
/ヽヽ|/⌒\ii|\
/ /ヾゞ///\\|
|/ |;;;;;;|/ハ \|
|;;;;//⌒ヽ
|;/( ^ω^)
>>937 おっおっおっ誤爆乙枯ー
. |{ ∪ ∪
|;;ヾ.,____,ノ
|;;; |
|;;;;;|
|;;;;;|
IsProcessInJob とか QueryInformationJobObjectのJobObjectBasicProcessIdList は何らかの理由で使えない、という話なのかな?
941 :
795 :2007/01/12(金) 01:06:12
>>934 FILE_FLAG_DELETE_ON_CLOSEでCreateFileの方法ならプロセスの消滅とともにファイルも消えるので、
ファイル名かファイルにJobとProcessの関係を示す情報をもっておけば良さそうです。
>>940 「QueryInformationJobObjectのJobObjectBasicProcessIdList」!!!!
あれれ、QueryInformationJobObjectの情報問い合わせの系(7種)の中にPIDを列挙するものがありましたっけ!
もしかしたら、これ見落としてたかも… orz
今からよく調べてみます!
942 :
795 :2007/01/12(金) 01:16:04
おおお!これはまさに!今まで何を苦労してチェックしてきたんだ… orz
>>940 すばらしい!あなたは神!
もし知っていたらついで教えてください。(おしえてばかりですみません)
プロセスがハングアップしたことを検出する方法はありますか?
タスクマネージャなどで「応答なし」という状態になっているプロセスのことですが、
これを識別する方法はありますでしょうか?
たぶん、メッセージポンプを駆動してるスレッドがブロックされて、メッセージが一定時間ディスパッチされないアプリを見つけるのだろうと思うのです。
またCUIタイプのプロセス(Subsystem=CUI)でGUIでないプロセスがハングアップした場合はメッセージポンプの方法では判別できないと思います。
Windowsはどうやってプロセスがハングアップしたことを認識してるのだろう…
単に時間かかってるかどうかだろ ハングアップじゃなくてしばらく返事しないだけで応答なしになる
IsHungAppWindow(HWND)
というか、タスクマネージャの応答無しはトップレベルウインドウ限定だからね〜
946 :
795 :2007/01/12(金) 01:35:38
>>943 レスどうもです。確かに異常に重い処理をしてるアプリが動いていても「応答なし」となることがあります。
でもこれはメッセージをディスパッチしてないからだと思ってました。
>>944 レス有難うございます。こんな明快なAPIが存在してたなんて…
これでほぼ問題点を解決できました。
レスを下さった皆さん本当に有難うございました。
ちゃんと動いてて 実情としてはメッセージループに処理が戻ってこないだけ っていうときでも応答なし表示されるから よく分かってないユーザーがそれ見て そこでプロセスの終了したりして余計状況を悪くするんだお
他人の(一般的な・限定しない)コンソールアプリがハングしているかどうかを 見分けるって、チューリングマシンの停止問題に帰着しかねないよな。 ハートビートを定期的に出すような作りにするとか、単にタイムアウトを付けるとか、 アプリの特性にあわせたハング検出ルーチンを用意しないとね。
Outlookとか OutlookExpressとか M$のアプリにやたらとそれが多いような気がするのは 気のせいではあるまい
あと InternetExplorer とか Explorer (つまり shell) とか もうどこが安定した OS なのかと(ry
あれ 950 踏んでる・・・
952 :
795 :2007/01/12(金) 01:50:37
>>947 レス有難うございます。
確かにメッセージをディスパッチしてるスレッドを止めると応答なしとなることからも
単にスレッドが他の処理をやってて結果として応答なしとなってしまうようです。
>>948 レス有難うございます。
IsHungAppWindowのAPIはウィンドウハンドルをとることからもCUIのプロセスは判別が難しいかなと思いました。
やっぱり、そこまでするならクラスタリング用アプリのようにハートビートでロックしていないことを定期的に示すようにしないと無理そうです。
今回のプロセス監視プログラムは任意のアプリを監視する仕様なので残念ながらクラスタリング用の細工をプログラムにすることはできません。
もしかしたら、CUIアプリのスレッドが全てブロックされた状態になったことを検出してハングアップを検出できるかもしれませんが、
単にWaitしてブロック状態であることも考えられますのでこれもダメそうです。
またループしてた場合などは、ハングアップしたのか処理を継続してるのか判別がつかないので難しいと思います。
仮にデバッガープロセスであればインストラクション実行状況やアドレスを定期的に監視することもできますが、
それでもループ処理なのか無限ループなのかわかりません。
これは八方塞がりだと諦めています。
Jobとか使わずに、専用ユーザーつくって、runas ってのはだめなのかな? と、適当なことを書いとく・・・ どちらにしろ、すげークリティカルな相手みたいで大変だね・・・
954 :
デフォルトの名無しさん :2007/01/12(金) 16:06:28
ハリコの虎見てちんちんおっきおっき こ の 書 き 込 み を 見 た 人 は 三 年 後 に イ ン ポ に な り ま す 。 イ ン ポ に な っ て オ ナ ニ ー が 出 来 な く な る の が 嫌 な 人 は こ の 書 き 込 み と 同 じ 文 章 を 三 時 間 以 内 に 違 う ス レ に 五 回 以 上 コ ピ ペ し て く だ さ い 。 五 回 書 き 込 ま な か っ た 男 子 学 生 が 書 き 込み を 見 た 後 三 年 後 に イ ン ポに な り ま し た 。
∧_∧ n^) / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ´Д`/ / < 先生!すでにインポな漏れはどうなるんでしょうか? / , / \_________________ | | , 、 i ____| | | | |__ ||\ (_/ \ ||\\ \ || \|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| || || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ‖ ||
USBデバイスが接続されたときに、 1.0と2.0のどちらで接続されたかどうかを判定したいのですが そのようなAPIはありますか? できればSHCNE_DISKEVENTSのタイミングで取りたいのですが。
>>958 なつけーソースw
その内容って、2000とXPで動作が異ならない?
確か文字数が・・・
大丈夫だよおまえら 2chなくならないから
てか、普通にAPI質問箱無くなると困るんだけどなー
ム板はないと困る俺は底辺なのかな('A`)
ところで
>>970 あたりの方はお願いします
だがこ、とわる!
>>962 少なくともAPI32は情報交換って言う意味で俺には必要('A`)
('A`)←しね
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`) ('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`) ('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`) ('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`) ('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`) ('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`) ('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`) ('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`) ('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`) ('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`) ('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`) ('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`) ('A`)('0`)('0`)('0`)('0`)('0`)('0`)('0`)('A`) ('A`)('A`)('0`)('A`)('A`)('0`)('A`)('A`)('A`) ('A`)('A`)('0`)('0`)('A`)('0`)('A`)('A`)('A`) ('A`)('0`)('A`)('0`)('A`)('0`)('0`)('0`)('A`) ('A`)('0`)('0`)('0`)('A`)('0`)('A`)('A`)('A`) ('0`)('A`)('A`)('0`)('A`)('0`)('A`)('A`)('A`) ('0`)('A`)('0`)('A`)('A`)('0`)('A`)('A`)('0`) ('0`)('A`)('0`)('A`)('A`)('0`)('A`)('A`)('0`) ('A`)('0`)('A`)('A`)('A`)('0`)('A`)('A`)('0`) ('0`)('A`)('A`)('A`)('A`)('A`)('0`)('0`)('A`) ('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
>>968 が新スレたててくれたから、質問させてもらいます。
CreateProcess()で起動したInternet Explorer(IE1)からjavascriptのwindow.open()で
新しく、別ウィンドウのInternet Explorer(IE2)を開いてるのですが、IE2がアイドル状態に
なるまで自作プログラムの処理を待機させるにはどのようにすればよいでしょうか?
IE2はIE1と別プロセスではなく,同一プロセスの別スレッドで動いている状態です。
呼び出しの関係は↓のようになってます。
自作プログラム(コンソールアプリ) -> CreateProcess() -> IE1 -> window.open() -> IE2
while( IE2.Busy ){}
_(アンダーバー)の仮想キーコードを教えてください。 何処を調べても出てきません(;´Д`)ハァハァ
CreateFileMapping使うときに CreateFileでハンドル取得後 CreateFileMapping使うんですが 処理が終わった後 CloseHandleする時上記のAPIで取得したハンドル どちらともClose処理しなければならないのでしょうか?
>>974 YES。CreateFileは該当のファイルをオープンし、そのハンドルを返します。
つまり、このハンドルは開いたファイルに関する情報の構造体への
ポインタみたいな感じ(実際はちょっと違います)です。
CreateFileMappingはオープンしたファイルに関連付けられた
マッピングオブジェクト(メモリマッピングに必要になる色々な情報)
を作成、纏めてそのハンドルを返します。2つとも全く別物です。
片方が閉じられると連動してもう片方も閉じられるとか、そういう事はありません。
ちなみにメモリマップドファイルの蛇足として、
実際にファイルがメモリ上にロードされるのはMapViewOfFileが実行された時で、
メモリ上のファイルデータが実際のファイルに反映されるのは
UnmapViewOfFileが実行された時です。参考までに。
976 :
970 :2007/01/14(日) 11:57:03
970です。
すいません、環境を書くの忘れてました。VC6.0でMFCは使ってません。
Win32APIのみで作成しています。あと、質問内容の書き方も悪かったので、
下に改めて書き直します。
1.自作プログラムからIE1を起動(CreateProcessでHTMLファイルを
IE1の引数として起動させてます。自作プログラムとIE1は別プロセス)
2.IE1に読み込まれたHTMLファイル内のjavascriptのwindow.openで
新たにIEのウィンドウ(IE2)を開く(IE1とIE2は同一プロセス)
この状態で、自作プログラムからIE2の状態を監視して,IE2がアイドル状態に
なるまで,自作プログラムの処理を待機させたいのです。
>>971 氏の方法はIE1内でwindow.openではなくてCreateObjectを使うってことでしょうか?
長文で申し訳ないですが、よろしくおねがいします。
>>975 参考になりました。ありがとうございます。
>>973 US配列だとshift+マイナスだったりしないかな
>>973 スキャンコードは仮想キーコードからMapVirtualKeyで変換したもの使わないとキーボードドライバによっては不具合出る。(US101ドライバとか)
>>973 >>972 どえす
おおきにアンダーバー0x2Eでビンゴでした、それからVKどわすれくん、重宝します。
埋め
埋
>>974 ハンドルを2つ管理するのが面倒だったらCreateFileMappingの後で
CreateFileから返ってきたハンドルは閉じてしまってかまわない
土里
十田 /土
>>987 ファイルマッピングハンドルは内部的にファイルハンドルへの参照も持つから
大丈夫なことは保証されてる。確かAdvanced Windowsにも出てた
>>988 その直前にある分を無視するなよ。排他アクセスを保証したい場合は、だろ。
> To ensure that other processes cannot write to the portion of the file that
> is mapped, you should open the file with exclusive access.
結局どっちでもいいんでね?
どうせATL::CHandle使うからどうでもいい。
うま
うま
まう
海
馬
ちんちん
かいかい
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。